我有一个像这样定义的vector3:
typedef struct {
float x;
float y;
float z;
} vec3;
然后我在这个数据结构中有一些:
typedef struct sprite {
cg_quad* quad;
vec3 scale;
vec3 pos;
vec3 angl;
}cg_sprite;
以及这个四元组的好措施:
typedef struct {
vec3 angles;
GLshort vertex_count;
GLfloat vertices[12];
GLfloat colors[16];
GLshort indices[6];
GLfloat tex_coords[8];
} cg_quad;
我有一个函数,只需要一个指向精灵的指针,并假设创建一个然后返回它。像这样简单:
cg_sprite* cg_sprite_new(const float x_pos, const float y_pos, const float z_pos, const float w, const float h) {
cg_sprite* out = calloc(1, sizeof(cg_sprite));
v3MakeFromElems(&out->scale, w, h, 1);
v3MakeFromElems(&out->pos, x_pos, y_pos, z_pos);
v3MakeFromElems(&out->angl, 0.0, 0.0, 0.0);
v3PrintS(&out->scale);
v3PrintS(&out->pos);
v3PrintS(&out->angl);
return out;
}
这适用于一个人。我想分配一个我可以更新和使用的精灵数组。
类似的东西:
sprite_count = 1;
cg_sprite* sprites;
sprite = calloc(1, sprite_count * sizeof(cg_sprite*));
for(int i = 0; i < sprite_count; i++) {
sprites[i] = *cg_sprite_new(xpos, ypos, zpos, width, height);
}
然后像这样迭代它们。
for(int i = 0; i < sprite_count; i++) {
vPrintS(sprites[i]->pose, "sprite index %d\n");
}
写出上面的代码,第一个循环中的分配不起作用。如果我没有首先调用数组的大小,我会得到一个seg错误。
如果我确实添加了calloc,我会得到一个
*** Error in `executable/main': corrupted double-linked list: 0x0000000001a15670 ***
有关排序的建议吗?
答案 0 :(得分:1)
在你的代码片段中,有一些事情让我觉得有些奇怪。虽然我不确定是否有任何一个导致您的错误。
vPrintS(sprites[i]->pose, "sprite index %d\n");
Lools就像一个典型的printf类型的va-args函数,带有%d
说明符但没有匹配的后续参数。vPrintS(sprites[i]->pose, "sprite index %d\n");
sprites [i]的类型为cg_sprite,其中pos
成员但没有成员pose
。 sprite = calloc(1, sprite_count * sizeof(cg_sprite*));
您是想将calloc的返回值分配给sprite
还是sprites
?我无法在任何地方声明sprite
。如果您需要更多信息,我建议您提供mcve