web-dev-qa-db-fra.com

Comment faites-vous un tableau de structs en C?

J'essaie de créer un tableau de structures où chaque structure représente un corps céleste pour le problème sur lequel je travaille dans ma classe. Je n'ai pas beaucoup d'expérience avec les structures, c'est pourquoi j'ai décidé d'essayer de les utiliser à la place de toute une série de tableaux. Cependant, je continue à courir dans de nombreuses erreurs différentes, même si j'ai essayé d'appliquer les techniques que j'ai vus sur divers threads et sur stackoverflow (comme dans Tableau de structures en C et C - initialiser un tableau de structures ), bien que toutes ne soient pas applicables, je ne l'étais donc pas capable de copier complètement la façon de le faire. Avant de vous montrer ce que j'essaie de faire, je ne pourrai pas répondre aux commentaires/questions/réponses pendant plusieurs heures car je dois aller me coucher car je suis restée éveillée trop longtemps, Je suis vraiment désolé pour cela, mais je suis vraiment fatigué après avoir eu une journée bien remplie et travaillé sur ce problème pendant plusieurs heures. 

Informations complémentaires pour ceux qui ont lu jusqu'à présent: je n'ai pas besoin de tout cela pour être dynamique, je sais/définis la taille de tout avant. J'ai également besoin que cela soit un tableau global (gaspVARIABLES GLOBALES), car j'y ai accès de plusieurs façons différentes avec des arguments définis (méthodes GLUT). 

Voici comment 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 assez clair dans mon langage embué, la ligne ci-dessous est au-dessus des choses ci-dessus):

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 encombrante est une forme simplifiée de mon principal, dans laquelle j'initialise toutes les variables de chacune des structures, juste pour définir certaines variables avant de les modifier dans certains cas. façon:

  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 actuelle à laquelle je suis confronté est 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. 

Merci pour toute aide que vous daignerez donner, je vous promets de vous revenir au plus tard dans 12 heures. 

Une dernière précision, par en-tête, je veux dire l’espace au-dessus de int main(void) mais dans le même fichier * .c. 

82
Amndeep7
#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.

90
nims

Je pense que vous pourriez l'écrire de cette façon aussi. Je suis aussi étudiant, alors je comprends votre lutte. Réponse un peu tardive mais ok.

#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];
10
Christakitos

bouge toi 

struct body bodies[n];

à après 

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

Reste tout va bien.

8
vrk001

Donc, pour tout mettre ensemble en utilisant 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);
}
8
Dounchan

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, car vous dites que vous avez la définition de la structure dans un fichier d'en-tête et que l'erreur est dans nbody.c alors vous devriez vérifier si vous incluez correctement le fichier d'en-tête . Vérifiez votre #include et assurez-vous que la définition de la structure est bien faite avant de déclarer toute variable de ce type.

1
David

Une autre façon d'initialiser un tableau de structures consiste à initialiser explicitement les membres du tableau. Cette approche est utile et simple s’il n’ya pas trop de membres struct et array. 

Utilisez le spécificateur typedef pour éviter de réutiliser l'instruction 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;

Puis déclarez 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}};

Pour répéter, il s’agit d’une solution plutôt simple et directe si vous n’avez pas trop d’éléments de tableau et de grands membres de structure et si, comme vous l’avez indiqué, 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 énumérées (et pas seulement des nombres comme dans l'exemple ci-dessus), ce qui permet au lecteur de code d'avoir une meilleure vue d'ensemble du applications.

0
Abdel Aleem

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;
}
0
Helping Bean