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.

137voto

nims Points 1351

Úsalo:

#include<stdio.h>

#define n 3

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

struct body bodies[n];

int main()
{
    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;
}

Cela fonctionne bien. Votre question n'était d'ailleurs pas très claire, alors faites correspondre la disposition de votre code source avec ce qui précède.

21voto

Abdel Aleem Points 378

Une autre façon d'initialiser un tableau de structures est d'initialiser explicitement les membres du tableau. Cette approche est utile et simple s'il n'y a pas trop de membres de structures et de tableaux.

Utiliser le typedef afin d'éviter de réutiliser le spécificateur struct chaque fois que vous déclarez une variable struct :

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

Déclarez ensuite votre tableau de structures. L'initialisation de chaque élément va de pair avec la déclaration :

Body bodies[n] = {{{0,0,0}, {0,0,0}, {0,0,0}, 0, 1.0}, 
                  {{0,0,0}, {0,0,0}, {0,0,0}, 0, 1.0}, 
                  {{0,0,0}, {0,0,0}, {0,0,0}, 0, 1.0}};

Je répète qu'il s'agit d'une solution assez simple et directe si vous n'avez pas trop d'éléments de tableaux et de membres de structures de grande taille et si, comme vous l'avez dit, vous n'êtes pas intéressé par une approche plus dynamique. Cette approche peut également être utile si les membres de la structure sont initialisés avec des variables enum nommées (et pas seulement des nombres comme dans l'exemple ci-dessus), ce qui donne au lecteur du code une meilleure vue d'ensemble de l'objectif et de la fonction d'une structure et de ses membres dans certaines applications.

20voto

Dounchan Points 6

Ainsi, pour mettre tout cela ensemble, il faut utiliser malloc() :

int main(int argc, char** argv) {
    typedef struct{
        char* firstName;
        char* lastName;
        int day;
        int month;
        int year;

    }STUDENT;

    int numStudents=3;
    int x;
    STUDENT* students = malloc(numStudents * sizeof *students);
    for (x = 0; x < numStudents; x++){
        students[x].firstName=(char*)malloc(sizeof(char*));
        scanf("%s",students[x].firstName);
        students[x].lastName=(char*)malloc(sizeof(char*));
        scanf("%s",students[x].lastName);
        scanf("%d",&students[x].day);
        scanf("%d",&students[x].month);
        scanf("%d",&students[x].year);
    }

    for (x = 0; x < numStudents; x++)
        printf("first name: %s, surname: %s, day: %d, month: %d, year: %d\n",students[x].firstName,students[x].lastName,students[x].day,students[x].month,students[x].year);

    return (EXIT_SUCCESS);
}

13voto

Christakitos Points 116

Je pense que vous pouvez aussi l'écrire de cette manière. Je suis également étudiante, je comprends donc votre difficulté.

#include <stdio.h>
#define n 3

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

8voto

vrk001 Points 143

Déplacer

struct body bodies[n];

à après

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

Le reste semble correct.

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