2009-04-29 6 views
1

J'essaie de créer une application pour simuler certaines sphères de base qui se déplacent. Le problème que je suis confronté est qu'il ne semble pas que les données sont affectées à la matrice en dehors de l'instruction init quand j'en ai vraiment besoin. Est-ce dû au fait que j'ai déclaré le tableau contenant les particules?Manipulation de tableaux C avec OpenGL et GLFW

Je veux créer un tableau de struct, qui peut être consulté à partir de diverses méthodes afin en haut de mon dossier ci-dessous les inclure déclarations que je l'ai utilisé:

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; 
}; 

J'ai une méthode d'initialisation qui crée le tableau et attribue des particules à ce

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;   
    } 
} 

puis un intérieur d'une méthode d'étirage d'une méthode pour dessiner la scène de jeu

// 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); 
    } 
} 

est ici une copie de mon code http://pastebin.com/m131405dc

Répondre

5

Le problème est cette définition:

struct particle particles[]; 

Cela ne réservant pas de mémoire, juste définir un tableau vide. Vous devez mettre quelque chose entre ces crochets. Il est une merveille toute votre écriture à divers postes dans ce tableau n'ont pas causé segfault accidents ...

Vous pouvez essayer avec max_particles, même si je ne suis pas sûr d'utiliser une variable (quoique const un) est légal dans un C définition.

La solution classique est d'utiliser le préprocesseur, comme ceci:

#define MAX_PARTICLES 50 

struct particle particles[MAX_PARTICLES]; 

Et puis utilisez MAX_PARTICLES dans les différentes boucles. Je suggère de mettre à la place le littéral dans les parenthèses:

struct particle particles[50]; 

Et puis écrire des boucles comme ceci:

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

C'est une division de compilation, il est donc ne vous coûte rien, et vous êtes réutiliser la définition elle-même pour fournir le nombre d'éléments dans le tableau, lequel (IMO) est élégant. Vous pouvez bien sûr aller de l'autre côté et définir une nouvelle macro, comme ça:

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

Merci beaucoup pour votre réponse - et d'aller dans la profondeur que vous avez fait. Merci beaucoup! – Malachi