Ich versuche, ein Array von Strukturen zu erstellen, wobei jede Struktur einen Himmelskörper darstellt.
Ich habe nicht so viel Erfahrung mit Strukturen, weshalb ich mich entschlossen habe, sie anstelle einer ganzen Reihe von Arrays zu verwenden. Ich stoße jedoch immer wieder auf zahlreiche verschiedene Fehler. Ich habe versucht, die Techniken zu implementieren, die ich in verschiedenen Threads und in StackOverflow gesehen habe (z. B. Array von Strukturen in C und C - Array von Strukturen initialisieren ), aber nicht alle waren anwendbar.
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 im Voraus. Ich brauche dies auch, um ein globales Array zu sein, da ich mit verschiedenen Methoden, die Argumente definiert haben (dh GLUT-Methoden), darauf zugreife.
So definiere ich die Struktur in meinem Header:
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 (dh #define n 1
).
Ich verwende dieses Array in verschiedenen Methoden, aber die einfachste und platzsparendste ist eine vereinfachte Form meiner Hauptmethode. Hier initialisiere ich alle Variablen in jeder der Strukturen, um die Variablen sicher festzulegen, bevor ich sie auf irgendeine Weise ändere:
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, mit dem ich konfrontiert bin, ist, nbody.c:32:13: error: array type has incomplete element type
wo in Zeile 32 das Array der Strukturen erstellt wird.
Eine letzte Klarstellung, mit Header meine ich das Leerzeichen darüber, int main(void)
aber in derselben *.c
Datei.
struct body bodies[n];
vor derstruct body {}
Erklärung?Antworten:
das funktioniert gut. Ihre Frage war übrigens nicht sehr klar, also passen Sie das Layout Ihres Quellcodes an das oben Gesagte an.
quelle
Ich denke, du könntest es auch so schreiben. Ich bin auch ein Student, also verstehe ich Ihren Kampf. Eine etwas späte Antwort, aber ok.
quelle
Um alles zusammenzusetzen, indem Sie Folgendes verwenden
malloc()
:quelle
sizeof *students
ist das gleiche und es wird nicht falsch sein, wenn sich STUDENT jemals ändert.sizeof *students
ist die Größe dessen, worauf hingewiesen wird , dhsizeof(STUDENT)
nichtsizeof(STUDENT*)
. Sie machen genau den Fehler, vor dem sich dieptr = malloc(num * sizeof *ptr)
Redewendung schützen soll. Überprüfen Sie dies hier (beachten Sie, dass der Server wie die meisten modernen PCs über 8-Byte-Zeiger verfügt, sodass die Größen 8 und 32 anstelle von 4 und 20 sind).Bewegung
nachher
Ruhe alles sieht gut aus.
quelle
Eine andere Möglichkeit, ein Array von Strukturen zu initialisieren, besteht darin, die Array-Mitglieder explizit zu initialisieren. Dieser Ansatz ist nützlich und einfach, wenn nicht zu viele Struktur- und Array-Mitglieder vorhanden sind.
Verwenden Sie den Bezeichner
typedef
, um zu vermeiden, dass diestruct
Anweisung jedes Mal wiederverwendet wird, wenn Sie eine Strukturvariable deklarieren:Deklarieren Sie dann Ihr Array von Strukturen. Die Initialisierung jedes Elements geht mit der Deklaration einher:
Um es zu wiederholen, dies ist 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 Strukturelemente mit benannten Enum-Variablen (und nicht nur Zahlen wie im obigen Beispiel) initialisiert werden, wodurch der Codeleser einen besseren Überblick über den Zweck und die Funktion einer Struktur und ihrer Elemente in bestimmten Fällen erhält Anwendungen.
quelle
Dieser Fehler bedeutet, dass der Compiler die Definition des Strukturtyps vor der Deklaration des Strukturarrays nicht finden kann, da Sie sagen, dass Sie die Definition der Struktur in einer Header-Datei haben und der Fehler
nbody.c
dann vorliegt Sie sollten überprüfen, ob Sie die Header-Datei korrekt einfügen. Überprüfen Sie Ihre#include
und stellen Sie sicher, dass die Definition der Struktur erfolgt, bevor Sie eine Variable dieses Typs deklarieren.quelle
main
Anweisung.Lösung mit Zeigern:
quelle