Manipolazione di matrici C con OpenGL e GLFW
Domanda
Sto cercando di creare un'applicazione per simulare alcune sfere di base che si spostano.
Il problema che sto affrontando è che non sembra che i dati vengano assegnati all'array al di fuori dell'istruzione init quando ne ho effettivamente bisogno. Questo ha a che fare con il modo in cui ho dichiarato l'array contenente le particelle.
Voglio creare una matrice di strutture a cui è possibile accedere da vari metodi, quindi nella parte superiore del mio file sotto le istruzioni include che ho usato:
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;
};
Ho un metodo di inizializzazione che crea l'array e assegna particelle ad esso
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;
}
}
e quindi un metodo di disegno interno un metodo per disegnare la scena impostata
// 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);
}
}
ecco una copia del mio codice http://pastebin.com/m131405dc
Soluzione
Il problema è questa definizione:
struct particle particles[];
Non sta riservando alcuna memoria, sta solo definendo un array vuoto. Devi mettere qualcosa tra quelle parentesi quadre. È sorprendente che tutti i tuoi scritti in varie posizioni in questo array non abbiano causato arresti anomali segreti ...
Potresti provare con max_particles
, anche se non sono sicuro che usare una variabile (sebbene una const
) sia legale in una definizione C.
La soluzione classica è quella di utilizzare il preprocessore, in questo modo:
#define MAX_PARTICLES 50
struct particle particles[MAX_PARTICLES];
E quindi usa MAX_PARTICLES nei vari loop. Suggerisco invece di inserire il valore letterale tra parentesi:
struct particle particles[50];
E poi scrivere loop in questo modo:
for(i = 0; i < sizeof particles / sizeof *particles; i++)
Questa è una divisione in fase di compilazione, quindi non ti costa nulla e stai riutilizzando la definizione stessa per fornire il numero di elementi nell'array, che (IMO) è elegante. Ovviamente potresti andare a metà strada e definire una nuova macro, in questo modo:
#define MAX_PARTICLES (sizeof particles / sizeof *particles)