Hoe maak je een array van structs in C?

Ik probeer een reeks structuren te maken waarbij elke structuur een hemellichaam voorstelt.

Ik heb niet zoveel ervaring met structs, daarom heb ik besloten ze te gebruiken in plaats van een hele reeks arrays. Ik loop echter steeds tegen een groot aantal verschillende fouten aan. Ik heb geprobeerd de technieken te implementeren die ik op verschillende threads en op StackOverflow heb gezien (zoals Array van structs in C en C – initialiseer array van structs), ze waren echter niet allemaal van toepassing.

Verdere informatie voor degenen die tot hier hebben gelezen: ik heb dit allemaal niet nodig om dynamisch te zijn, ik weet/definieer van tevoren de grootte van alles. Ik heb ook nodig dat dit een globale array is, omdat ik dit op verschillende manieren benader die gedefinieerde argumenten hebben (d.w.z. GLUT-methoden).

Dit is hoe ik de struct in mijn kop definieer:

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

Ik heb een lijst met andere globale variabelen die ik definieer voordat ik het interieur van de struct definieer, en een daarvan is de array van deze struct (eigenlijk, als ik te onduidelijk ben in mijn vervaagde taal, de regel hieronder staat boven de dingen hierboven):

struct body bodies[n];

Voor alle duidelijkheid, n is iets dat ik legitiem heb gedefinieerd (d.w.z. #define n 1).

Ik gebruik deze array op verschillende manieren, maar de gemakkelijkste en minst ruimteverslindende is een vereenvoudigde vorm van mijn main. Hier initialiseer ik alle variabelen in elk van de structs, alleen om de variabelen zeker te stellen voordat ik ze op de een of andere manier aanpas:

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

De huidige fout die ik tegenkom is nbody.c:32:13: error: array type has incomplete element type waarbij ik op regel 32 de array van de structs maak.

Nog een laatste verduidelijking, met header bedoel ik de spatie boven int main(void) maar in hetzelfde *.c bestand.


Antwoord 1, autoriteit 100%

#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;
}

dit werkt prima. je vraag was trouwens niet erg duidelijk, dus stem de layout van je broncode af op het bovenstaande.


Antwoord 2, autoriteit 14%

Dus om alles samen te voegen met 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);
}

Antwoord 3, autoriteit 11%

Een andere manier om een ​​array met structs te initialiseren, is door de arrayleden expliciet te initialiseren. Deze benadering is handig en eenvoudig als er niet te veel struct- en arrayleden zijn.

Gebruik de typedef-specificatie om te voorkomen dat u de instructie struct telkens opnieuw gebruikt wanneer u een struct-variabele declareert:

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

Declareer vervolgens je array van structs. Initialisatie van elk element gaat samen met de verklaring:

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

Om te herhalen, dit is een vrij eenvoudige en duidelijke oplossing als je niet te veel array-elementen en grote structleden hebt en als je, zoals je al zei, niet geïnteresseerd bent in een meer dynamische benadering. Deze benadering kan ook nuttig zijn als de structleden worden geïnitialiseerd met benoemde enum-variabelen (en niet alleen getallen zoals in het bovenstaande voorbeeld), waardoor de codelezer een beter overzicht krijgt van het doel en de functie van een structuur en zijn leden in bepaalde toepassingen.


Antwoord 4, autoriteit 10%

Ik denk dat je het ook zo zou kunnen schrijven. Ik ben ook een student, dus ik begrijp je strijd. Een beetje late reactie maar 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];

Antwoord 5, autoriteit 7%

verplaatsen

struct body bodies[n];

tot na

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

Alles rust ziet er goed uit.


Antwoord 6

Die fout betekent dat de compiler de definitie van het type van je struct niet kan vinden voordat de array van structs wordt gedeclareerd, omdat je zegt dat je de definitie van de struct in een headerbestand hebt en de fout in nbody.c staat, moet u controleren of u het headerbestand correct opneemt.
Controleer uw #include‘s en zorg ervoor dat de definitie van de struct is gedaan voordat u een variabele van dat type declareert.


Antwoord 7

Oplossing met behulp van aanwijzers:

#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;
}

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Other episodes