C语言 无法重新分配结构成员值

cnh2zyt3  于 2023-04-29  发布在  其他
关注(0)|答案(1)|浏览(128)

我在main.c文件中有以下代码,它将样式成员分配给按钮结构体:

struct SCGUI_Button button = scgui_new_button();

    button.style = (SCGUI_ButtonStyle) {
        .background_color = new_color(255, 0, 0),

        .hover = {
            .font_family = "res/Cursive.ttf",
            .background_color = new_color(255, 0, 0) //I defined the color RIGHT HERE (button.style.hover.background_color)
        }
    };

    //Update function (for hover)
    scgui_draw_button(&button, CENTER);

在我定义这些函数的button.c文件中,我有以下代码:

struct SCGUI_Button scgui_new_button() {

    //Default initialization values
    struct SCGUI_Button button = {
        .style = {
            .background_color = new_color(200, 200, 200),
            .font_color = new_color(0, 0, 0),
            .font_family = "res/Roboto.ttf",
            .font_size = 24,

            .hover = {
                .background_color = new_color(220, 220, 220),
                .font_color = new_color(20, 20, 20),
                .font_family = "res/Roboto.ttf",
                .font_size = 24
            }
        }
    };

    return button;
}

void scgui_draw_button(struct SCGUI_Button *self) {
    if (button_hovered(self->area, app.mouse_pos.x, app.mouse_pos.y)) {
        self->state.hovered = true;

        //Attempt to set actual button styles to hover styles (either provided in main.c, or if not provided, set to the default values in the button initialization function)
        self->style = (SCGUI_ButtonStyle) {
            .background_color = self->style.hover.background_color,
            .font_color = self->style.hover.font_color,
            .font_family = self->style.hover.font_family == NULL ? "res/Roboto.ttf" : self->style.hover.font_family,
            .font_size = self->style.hover.font_size == 0 ? 24 : self->style.hover.font_size,
        };

    }
}

然而,问题就在这里。悬停功能肯定有效,但设置样式则不行。每当我把鼠标悬停在按钮上时,按钮就会变黑。这里我的假设是,未初始化的颜色成员默认为0,因此所有样式都被设置为RGB(0,0,0)。然而,为什么这些结构体样式成员没有被正确设置,对我来说是一个谜。你能不能像我在scgui_draw_button()函数中那样设置一个结构体样式?我做错了什么?

u0sqgete

u0sqgete1#

当你使用复合文字进行结构赋值时,所有没有显式给定值的字段都被归零:

button.style = (SCGUI_ButtonStyle) { … };

赋值后,button.style.font_family是空指针,button.style.font_size0button.style.font_color没有变化,但这主要是偶然的)。悬停部分中的字体颜色和字体大小也被归零。
您需要在第一个片段中执行单个成员赋值:

button.style.background_color = new_color(255, 0, 0);
button.style.hover.font_family = "res/Cursive.ttf";
button.style.hover.background_color = new_color(255, 0, 0);

这保留了未另行提及的成员。

相关问题