gpt4 book ai didi

C 为结构赋值适用于调试标志,但不适用于发布标志

转载 作者:太空宇宙 更新时间:2023-11-04 03:32:11 24 4
gpt4 key购买 nike

我正在使用 C 和 OpenGL。我有一个 Sprite 结构,以及一个创建新 Sprite 并设置其值的函数。该函数与调试链接器标志一起正常工作,但是当我使用发布优化对其进行编译时,一些 sprite 值设置为 0。我做错了什么?

最小代码示例(已编辑):

#include <stdlib.h>
#include <stdio.h>

typedef struct {
float x;
float y;
float z;
} position;

typedef struct {
float r;
float g;
float b;
float a;
} colorrgba8;

typedef struct {
float u;
float v;
} UV;

typedef struct {
position pos;
colorrgba8 color;
UV uv;
} vertex;

typedef struct {
float x, y, z;
float width, height;

vertex tr;
vertex tl;
vertex bl;
vertex br;
} sprite;

vertex set_position(float x, float y, float z) {
vertex ver;
ver.pos.x = x;
ver.pos.y = y;
ver.pos.z = z;
return ver;
}

vertex set_color(float r, float g, float b, float a) {
vertex ver;
ver.color.r = r;
ver.color.g = g;
ver.color.b = b;
ver.color.a = a;
return ver;
}

vertex set_uv(float u, float v) {
vertex ver;
ver.uv.u = u;
ver.uv.v = v;
return ver;
}

sprite* sprite_new(float x, float y, float z, float width, float height) {
sprite* s = malloc(sizeof(sprite));

s->x = x;
s->y = y;
s->z = z;
s->width = width;
s->height = height;

s->tr = set_position(x + width, y + height, z);
s->tr = set_uv(1.0f, 1.0f);
s->tr = set_color(1.0f, 1.0f, 1.0f, 1.0f);

s->tl = set_position(x, y + height, z);
s->tl = set_uv(0.0f, 1.0f);
s->tl = set_color(1.0f, 1.0f, 1.0f, 1.0f);

s->bl = set_position(x, y, z);
s->bl = set_uv(0.0f, 0.0f);
s->bl = set_color(1.0f, 1.0f, 1.0f, 1.0f);

s->br = set_position(x + width, y, z);
s->br = set_uv(1.0f, 0.0f);
s->br = set_color(1.0f, 1.0f, 1.0f, 1.0f);


return s;
}

我这样调用函数:

sprite* s = sprite_new(100.0f, 100.0f, -100.0f, 100.0f, 100.0f);

printf("Top right vertex pos.x: %f | Bottom left vertex pos.z: %f\n", s->tr.pos.x, s->bl.pos.z);

带有释放标志的输出:-O2

右上顶点pos.x: 0.000000 |左下顶点pos.z: 0.000000

带有调试标志的输出:-g -Wall -Wextra -Werror -Wwrite-strings -std=c99 -pedantic-errors

右上顶点 pos.x: 200.000000 |左下顶点pos.z: -100.000000

最佳答案

您没有在各种顶点函数中正确初始化顶点。

在调用的第一个函数 set_position 中,您定义了一个局部顶点,并使用一些值完全设置了成员 pos 及其成员:

vertex set_position(float x, float y, float z) {
vertex ver;
ver.pos.x = x;
ver.pos.y = y;
ver.pos.z = z;
return ver;
}

但是您忘记设置其他成员,然后返回带有一些未初始化成员的结构。 IE。来自部分未初始化的函数的结构被分配给 s->tr。其他成员的值是不确定的。读取这些成员会导致未定义的行为。这三个函数都存在这个问题。

如果您不打算设置其他元素,并且代码可以处理其默认值,则使用其所有成员的默认初始化程序适本地初始化结构:

vertex ver = { 0 } ;

第二个问题是接下来的两个函数覆盖了struct sprite的成员tr。对于每次调用,tr 都会被覆盖。在函数 set_color 的最后一次调用之后,只有 tr.color 的成员被设置,其余的被设置为不确定的值。

s->tr = set_position(x + width, y + height, z);
s->tr = set_uv(1.0f, 1.0f);
s->tr = set_color(1.0f, 1.0f, 1.0f, 1.0f);

其余代码重复了这些相同的错误。

关于C 为结构赋值适用于调试标志,但不适用于发布标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35488968/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com