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

È stato utile?

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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top