134 votes

Comment créer un tableau de structures en C ?

J'essaie de créer un tableau de structures où chaque structure représente un corps céleste.

Je n'ai pas beaucoup d'expérience avec les structures, c'est pourquoi j'ai décidé d'essayer de les utiliser au lieu de tout un tas de tableaux. Cependant, je continue à rencontrer de nombreuses erreurs. J'ai essayé de mettre en œuvre les techniques que j'ai vues sur différents fils de discussion et sur Stack Overflow (telles que Tableau de structures en C y Initialiser un tableau de structures en C ), mais toutes n'étaient pas applicables.

Informations complémentaires pour ceux qui ont lu jusqu'ici : Je n'ai pas besoin que tout cela soit dynamique, je connais/définis la taille de tout à l'avance. J'ai également besoin qu'il s'agisse d'un tableau global car j'y accède dans plusieurs méthodes différentes qui ont des arguments définis (par ex, GLUT ).

C'est ainsi que je définis la structure dans mon en-tête :

struct body
{
    double p[3]; // Position
    double v[3]; // Velocity
    double a[3]; // Acceleration
    double radius;
    double mass;
};

J'ai une liste d'autres variables globales que je définis avant de définir l'intérieur de la structure, et l'une d'entre elles est le tableau de cette structure (en gros, si je ne suis pas trop clair dans mon discours embrouillé, la ligne ci-dessous est au-dessus de ce qui précède) :

struct body bodies[n];

Juste pour que vous sachiez, n est quelque chose que j'ai légitimement défini (c'est-à-dire #define n 1 ).

J'utilise ce tableau dans plusieurs méthodes différentes, mais la plus simple et la moins gourmande en espace est une forme simplifiée de mon main. Ici, j'initialise toutes les variables dans chacune des structures, juste pour définir les variables avec certitude avant de les modifier d'une manière ou d'une autre :

int a, b;
for(a = 0; a < n; a++)
{
    for(b = 0; b < 3; b++)
    {
        bodies[a].p[b] = 0;
        bodies[a].v[b] = 0;
        bodies[a].a[b] = 0;
    }
    bodies[a].mass = 0;
    bodies[a].radius = 1.0;
}

L'erreur que je rencontre actuellement est la suivante nbody.c:32:13: error: array type has incomplete element type où la ligne 32 est l'endroit où je crée le tableau des structures.

Une dernière précision : Par en-tête, j'entends l'espace situé au-dessus de int main(void) mais dans la même *.c fichier.

2voto

Helping Bean Points 139

Solution utilisant des pointeurs :

#include <stdio.h>
#include <stdlib.h>

#define n 3

struct body
{
    double p[3]; // Position
    double v[3]; // Velocity
    double a[3]; // Acceleration
    double radius;
    double *mass;
};

int main()
{
    struct body *bodies = (struct body*)malloc(n*sizeof(struct body));
    int a, b;
    for(a = 0; a < n; a++)
    {
        for(b = 0; b < 3; b++)
        {
            bodies[a].p[b] = 0;
            bodies[a].v[b] = 0;
            bodies[a].a[b] = 0;
        }
        bodies[a].mass = 0;
        bodies[a].radius = 1.0;
    }

    return 0;
}

2voto

Alien Points 922

Vous pouvez le faire de la même manière que vous créez le tableau de nombres, mais en mettant les valeurs des éléments entre accolades comme ceci ->

struct Wrestler studs[count] = {
        {"John", "Cena"},
        {"The", "Undertaker"},
        {"The", "Big Show"},
        {"The", "Rock"},
        {"Triple", "H"},
        {"Scott", "Hall"},
        {"Roman", "Reings"},
        {"Dean", "Ambrose"}};

Voici le code complet

#include <stdio.h>

struct Wrestler
{
    char firstName[20];
    char secondName[20];
};

void pIntro(struct Wrestler *s)
{
    printf("Hi, I am %s %s.\n", s->firstName, s->secondName);
};

int main(int argc, char const *argv[])
{
#define count 8
    struct Wrestler studs[count] = {
        {"John", "Cena"},
        {"The", "Undertaker"},
        {"The", "Big Show"},
        {"The", "Rock"},
        {"Triple", "H"},
        {"Scott", "Hall"},
        {"Roman", "Reings"},
        {"Dean", "Ambrose"}};

    for (int i = 0; i < count; i++)
    {
        pIntro(&(studs[i]));
    }

    return 0;
}

1voto

David Points 16

Cette erreur signifie que le compilateur n'est pas en mesure de trouver la définition du type de votre structure avant la déclaration du tableau de structures, puisque vous dites que vous avez la définition de la structure dans un fichier d'en-tête et que l'erreur se trouve dans la section nbody.c vous devez alors vérifier que vous incluez correctement le fichier d'en-tête. Vérifiez votre #include et s'assurer que la définition de la structure est faite avant de déclarer une variable de ce type.

0voto

Toby Speight Points 3930

En essayant de reconstruire votre programme, j'obtiens

struct body
{
    double p[3];//position
    double v[3];//velocity
    double a[3];//acceleration
    double radius;
    double mass;
};

#define n 9

struct body bodies[n];

int main(void)
{
    int a, b;
    for (a = 0; a < n; a++) {
        for (b = 0; b < 3; b++) {
            bodies[a].p[b] = 0;
            bodies[a].v[b] = 0;
            bodies[a].a[b] = 0;
        }
        bodies[a].mass = 0;
        bodies[a].radius = 1.0;
    }
}

Cela se compile sans erreur en utilisant gcc-11 -std=c17 -Wall -Wextra -Wwrite-strings -Wno-parentheses -Wpedantic -Warray-bounds -Wconversion -Wstrict-prototypes -fanalyzer On ne voit donc pas très bien pourquoi vous avez un problème.

Cependant, nous avons encore la possibilité de la simplifier en utilisant une constante struct body pour l'initialisation :

int main(void)
{
    static const struct body default_body =
        { {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, 0.0, 1.0 };

    for (unsigned i = 0;  i < n;  ++i) {
        bodies[i] = default_body;
    }
}

-1voto

Phoenixcomm Points 12

Je ne sais pas qui a eu cette idée, mais OUI, on peut construire des structs contenant d'autres structs ! Par exemple, pour travailler sur un simulateur de vol, il faut connaître le point de départ, le point d'arrivée et la position actuelle (latitude et longitude). Un exemple que j'utilise :

struct DM {
   int degrees;
   float minutes;
   char hemi; };

Il m'en faut maintenant deux, l'un pour Lat et l'autre pour Lon so ;

struct DM Lat;
struct DM Lon;

Mettons tout cela bout à bout et appelons-le Position

struct Position {
    struct DM Lat;
    struct DM Lon; } Current, Start, Finish;

et pour commencer, j'utiliserai Addison, Texas // Addison : 32-58.113333N 096-50.186667W

Finish.Lon.degrees = 32;
Finish.Lon.minutes = 58.113333;
Finish.Lon.hemi    = 'N';
Finish.Lat.degrees = 96;
Finish.Lat.minutes = 0.186667;
Finish.Lat.hemi    = 'W'; 

Palmes ps Qu'est-ce que c'est que cette histoire de ne pas faire une structure à l'intérieur d'une structure ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X