2009-04-29 7 views
1

Я пытаюсь создать приложение для моделирования некоторых основных сфер, перемещающихся.Манипуляция массивами C с OpenGL и GLFW

Проблема, с которой я сталкиваюсь, заключается в том, что она не похожа на то, что данные присваиваются массиву вне инструкции init, когда я действительно нуждаюсь в ней. Это что-то связано с тем, как я объявил массив, содержащий частицы.

Я хочу, чтобы создать массив структур, которые могут быть доступны из различных методов, так в верхней части моего файла ниже заявлений включают я использовал:

struct particle particles[]; 


// Particle types 
enum TYPES { PHOTON, NEUTRINO }; 

// Represents a 3D point 
struct vertex3f 
{ 
    float x; 
    float y; 
    float z; 
}; 

// Represents a particle 
struct particle 
{ 
    enum TYPES type; 
    float radius; 
    struct vertex3f location; 
}; 

У меня есть метод Initialise который создает массив и присваивает частицы к нему

void init(void) 
{ 
    // Create a GLU quadrics object 
    quadric = gluNewQuadric(); 
    struct particle particles[max_particles]; 

    float xm = (width/2) * -1; 
    float xp = width/2; 
    float ym = (height/2) * -1; 
    float yp = height/2; 

    int i; 
    for (i = 0; i < max_particles; i++) 
    { 
     struct particle p; 

     struct vertex3f location; 
     location.x = randFloat(xm, xp); 
     location.y = randFloat(ym, yp); 
     location.z = 0.0f; 

     p.location = location; 
     p.radius = 0.3f; 

     particles[i] = p;   
    } 
} 

, а затем внутри метода вытягивания способ привлечь множество сцены

// Draws the second stage 
void drawSecondStage(void) 
{ 

    int i; 

    for (i = 0; i < max_particles; i++) 
    { 
     struct particle p = particles[i]; 

     glPushMatrix(); 
     glTranslatef(p.location.x , p.location.y, p.location.z); 
     glColor3f(1.0f, 0.0f, 0.0f); 
     gluSphere(quadric, 0.3f, 30, 30); 
     glPopMatrix(); 

     printf("%f\n", particles[i].location.x); 
    } 
} 

вот копия моего кода http://pastebin.com/m131405dc

ответ

5

Проблема заключается в определении:

struct particle particles[]; 

Это не оставляя никаких воспоминаний, только определение пустого массива. Вам нужно положить что-то в квадратные скобки. Это удивительно, все ваши письма на различные позиции в этом массиве не вызванные аварии ... выдаст ошибку сегментации

Вы можете попробовать с max_particles, хотя я не уверен, что с помощью переменного (хотя и const один) является законным в C.

Классическим решением является использование препроцессора, например, так:

#define MAX_PARTICLES 50 

struct particle particles[MAX_PARTICLES]; 

И затем использовать MAX_PARTICLES в различных циклах. Я предлагаю вместо того, чтобы положить буквальный в скобках:

struct particle particles[50]; 

А потом писать петлю так:

for(i = 0; i < sizeof particles/sizeof *particles; i++) 

Это компиляция с разделением по времени, так что не стоить вам ничего, и вы повторное использование самого определения для обеспечения количества элементов в массиве, который (ИМО) является изящным. Конечно, вы могли бы перейти на средний уровень и определить новый макрос:

#define MAX_PARTICLES (sizeof particles/sizeof *particles) 
+0

Большое вам спасибо за ваш ответ - и зайдите в глубину, которую вы сделали. Спасибо! – Malachi