Question

J'essaie de créer une application pour simuler des sphères de base qui se déplacent.

Le problème auquel je suis confronté est qu’il ne semble pas que les données soient assignées au tableau en dehors de la déclaration init quand j’en ai réellement besoin. Est-ce quelque chose à voir avec la façon dont j'ai déclaré le tableau contenant les particules.

Je souhaite créer un tableau de structures auxquelles on peut accéder à partir de différentes méthodes. En haut de mon fichier, sous les instructions include que j'ai utilisées:

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 lui assigne des particules

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 dans une méthode de dessin, une méthode pour dessiner la scène définie

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

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

Était-ce utile?

La solution

Le problème est cette définition:

struct particle particles[];

Il ne s'agit pas de réserver de la mémoire, mais de définir un tableau vide. Vous devez mettre quelque chose entre ces crochets. C’est une merveille que toutes vos écritures à divers endroits de ce tableau n’aient pas causé de crashs de segfault ...

Vous pouvez essayer avec max_particles , bien que je ne sois pas sûr que l'utilisation d'une variable (bien qu'une const ) soit légale dans une définition en C.

La solution classique consiste à utiliser le préprocesseur, comme suit:

#define MAX_PARTICLES 50

struct particle particles[MAX_PARTICLES];

Ensuite, utilisez MAX_PARTICLES dans les différentes boucles. Je suggère plutôt de mettre le littéral entre crochets:

struct particle particles[50];

Et ensuite, écrire des boucles comme ceci:

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

Il s’agit d’une division au moment de la compilation, ce qui ne vous coûte rien et vous réutilisez la définition elle-même pour fournir le nombre d’éléments du tableau, ce qui (élégant) est élégant. Vous pouvez bien sûr faire un compromis et définir une nouvelle macro, comme suit:

#define MAX_PARTICLES  (sizeof particles / sizeof *particles)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top