wake-up-neo.com

Wie erstellt man ein Array von Strukturen in C?

Ich versuche, eine Reihe von Strukturen zu erstellen, in denen jede Struktur einen Himmelskörper für das Problem darstellt, an dem ich in meiner Klasse arbeite. Ich habe nicht so viel Erfahrung mit structs, weshalb ich mich entschied, sie anstelle einer ganzen Reihe von Arrays zu verwenden. Ich stelle jedoch immer wieder eine Reihe von Fehlern fest, obwohl ich versucht habe, die Techniken zu implementieren das habe ich auf verschiedenen Threads und auf stackoverflow gesehen (zB at Array von Strukturen in C und C - Array von structs initialisieren ), jedoch nicht alle von ihnen anwendbar, also nicht in der Lage, den Weg vollständig zu kopieren. Nur eine Vorwarnung, bevor ich Ihnen zeige, was ich versuche, ich kann mehrere Stunden lang nicht auf Kommentare/Fragen/Antworten antworten, da ich ins Bett gehen muss, da ich viel zu lange nicht wach war. Es tut mir wirklich leid, aber ich bin wirklich müde, nachdem ich einen anstrengenden Tag hinter mir und mehrere Stunden an diesem Problem gearbeitet habe. 

Weitere Informationen für diejenigen, die bisher gelesen haben: Ich brauche nichts davon, um dynamisch zu sein, ich kenne/definiere die Größe von allem vorher. Ich brauche auch ein globales Array (gaspGLOBAL VARIABLES), da ich auf dieses Verfahren mit verschiedenen Methoden zugreifen kann, die definierte Argumente haben (d. H. GLUT-Methoden). 

So definiere ich die Struktur in meiner Kopfzeile:

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

Ich habe eine Liste anderer globaler Variablen, die ich definiere, bevor ich das Innere der Struktur definiere, und eine davon ist das Array dieser Struktur (im Grunde genommen, wenn ich in meiner beschlagenen Sprache zu unklar bin, die folgende Zeile ist über dem Zeug oben):

struct body bodies[n];

Nur damit Sie wissen, n ist etwas, das ich legitim definiert habe (d. H. #define n 1). 

Ich verwende dieses Array in mehreren verschiedenen Methoden, aber die einfachste und am wenigsten Platz verbrauchende Methode ist eine vereinfachte Form meines Main, in der ich alle Variablen in jeder Struktur initialisiere, um die Variablen sicher festzulegen, bevor ich sie in einigen verändere Weg:

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

Der aktuelle Fehler, dem ich gegenüberstehe, ist nbody.c:32:13: error: array type has incomplete element type, wo Zeile 32 die Arrays der structs ist. 

Ich danke Ihnen für jede Hilfe, die Sie geben wollen. Ich verspreche Ihnen, dass ich mich spätestens in 12 Stunden bei Ihnen melden werde. 

Eine letzte Klarstellung, mit Header meine ich den Platz oberhalb von int main(void), aber in derselben * .c-Datei. 

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

das funktioniert gut. Ihre Frage war übrigens nicht sehr klar, passen Sie also das Layout Ihres Quellcodes an.

90
nims

Ich denke, du könntest es auch so schreiben. Ich bin auch Student, also verstehe ich deinen Kampf. Etwas spät, aber 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

bewegung 

struct body bodies[n];

bis nach 

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

Ruhe alles sieht gut aus.

8
vrk001

Um es zusammenzusetzen, verwenden Sie 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

Dieser Fehler bedeutet, dass der Compiler die Definition des Typs Ihrer Struktur vor der Deklaration des Array von Strukturen nicht finden kann, da Sie sagen, Sie haben die Definition der Struktur in einer Header-Datei und der Fehler ist in nbody.c dann sollten Sie prüfen, ob Sie die Header-Datei korrekt einfügen. Überprüfen Sie Ihre #include und stellen Sie sicher, dass die Definition der Struktur abgeschlossen ist, bevor Sie eine Variable dieses Typs deklarieren.

1
David

Eine andere Möglichkeit zum Initialisieren eines Arrays von Strukturen besteht darin, die Arraymitglieder explizit zu initialisieren. Dieser Ansatz ist nützlich und einfach, wenn nicht zu viele Struktur- und Array-Mitglieder vorhanden sind. 

Verwenden Sie den typedef-Bezeichner, um zu vermeiden, dass die struct-Anweisung jedes Mal erneut verwendet wird, wenn Sie eine Strukturvariable deklarieren:

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

Dann deklarieren Sie Ihr Array von Strukturen. Die Initialisierung jedes Elements geht mit der Deklaration einher:

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

Um es zu wiederholen, ist dies eine ziemlich einfache und unkomplizierte Lösung, wenn Sie nicht zu viele Array-Elemente und große Strukturelemente haben und wenn Sie, wie Sie sagten, nicht an einem dynamischeren Ansatz interessiert sind. Dieser Ansatz kann auch nützlich sein, wenn die struct-Member mit benannten enum-Variablen (und nicht nur mit Zahlen wie im obigen Beispiel) initialisiert werden. Dadurch erhält der Codeleser einen besseren Überblick über den Zweck und die Funktion einer Struktur und ihrer Member Anwendungen.

0
Abdel Aleem

Lösung mit Zeigern:

#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