- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 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/
我目前正在尝试基于哈希表构建字典。逻辑是:有一个名为 HashTable 的结构,其中包含以下内容: HashFunc HashFunc; PrintFunc PrintEntry; CompareF
如果我有一个指向结构/对象的指针,并且该结构/对象包含另外两个指向其他对象的指针,并且我想删除“包含这两个指针的对象而不破坏它所持有的指针”——我该怎么做这样做吗? 指向对象 A 的指针(包含指向对象
像这样的代码 package main import "fmt" type Hello struct { ID int Raw string } type World []*Hell
我有一个采用以下格式的 CSV: Module, Topic, Sub-topic 它需要能够导入到具有以下格式的 MySQL 数据库中: CREATE TABLE `modules` ( `id
通常我使用类似的东西 copy((uint8_t*)&POD, (uint8_t*)(&POD + 1 ), back_inserter(rawData)); copy((uint8_t*)&PODV
错误 : 联合只能在具有兼容列类型的表上执行。 结构(层:字符串,skyward_number:字符串,skyward_points:字符串)<> 结构(skyward_number:字符串,层:字符
我有一个指向结构的指针数组,我正在尝试使用它们进行 while 循环。我对如何准确初始化它并不完全有信心,但我一直这样做: Entry *newEntry = malloc(sizeof(Entry)
我正在学习 C,我的问题可能很愚蠢,但我很困惑。在这样的函数中: int afunction(somevariables) { if (someconditions)
我现在正在做一项编程作业,我并没有真正完全掌握链接,因为我们还没有涉及它。但是我觉得我需要它来做我想做的事情,因为数组还不够 我创建了一个结构,如下 struct node { float coef;
给定以下代码片段: #include #include #define MAX_SIZE 15 typedef struct{ int touchdowns; int intercepti
struct contact list[3]; int checknullarray() { for(int x=0;x<10;x++) { if(strlen(con
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Empty “for” loop in Facebook ajax what does AJAX call
我刚刚在反射器中浏览了一个文件,并在结构构造函数中看到了这个: this = new Binder.SyntaxNodeOrToken(); 我以前从未见过该术语。有人能解释一下这个赋值在 C# 中的
我经常使用字符串常量,例如: DICT_KEY1 = 'DICT_KEY1' DICT_KEY2 = 'DICT_KEY2' ... 很多时候我不介意实际的文字是什么,只要它们是独一无二的并且对人类读
我是 C 的新手,我不明白为什么下面的代码不起作用: typedef struct{ uint8_t a; uint8_t* b; } test_struct; test_struct
您能否制作一个行为类似于内置类之一的结构,您可以在其中直接分配值而无需调用属性? 前任: RoundedDouble count; count = 5; 而不是使用 RoundedDouble cou
这是我的代码: #include typedef struct { const char *description; float value; int age; } swag
在创建嵌套列表时,我认为 R 具有对列表元素有用的命名结构。我有一个列表列表,并希望应用包含在任何列表中的每个向量的函数。 lapply这样做但随后剥离了列表的命名结构。我该怎么办 lapply嵌套列
我正在做一个用于学习目的的个人组织者,我从来没有使用过 XML,所以我不确定我的解决方案是否是最好的。这是我附带的 XML 文件的基本结构:
我是新来的 nosql概念,所以当我开始学习时 PouchDB ,我找到了这个转换表。我的困惑是,如何PouchDB如果可以说我有多个表,是否意味着我需要创建多个数据库?因为根据我在 pouchdb
我是一名优秀的程序员,十分优秀!