2016-01-11 3 views
0

Я в 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 *** 

Любые рекомендации по сортировке это?

ответ

1

Есть несколько вещей, которые кажутся мне немного странными в ваших фрагментах кода. Хотя я не уверен, что любой из них вызывает вашу ошибку.

  1. vPrintS(sprites[i]->pose, "sprite index %d\n"); Lools как типичный тип Printf функции ва-арг с %d спецификатора, но не следующий аргумент, чтобы соответствовать.
  2. vPrintS(sprites[i]->pose, "sprite index %d\n"); спрайты [i] имеют тип cg_sprite, который имеет член pos, но нет pose участник.
  3. sprite = calloc(1, sprite_count * sizeof(cg_sprite*)); Вы имеете в виду присвоить возвращаемое значение calloc sprite или sprites? Я не могу сказать, что вы объявляете sprite в любом месте.

Если вам нужно больше, чтобы вернуться на трассу, я предлагаю вам предоставить mcve

Смежные вопросы