Strukturarray in C
-
Hey,
Ich habe eine Frage zu Strukturen in C. Ich würde gerne ein Strukturarray schreiben und dem Array bestimmte Werte zuweisen. Also wie im Beispiel library.month. Ich würde gerne dem Strukturmitglied month die Jahresdaten zuweisen von Januar bis Dezember. Aber es wird eine Fehlermeldung ausgegeben
"Expected primary-expression before struct" Die Stelle habe ich fett markiert.
Kann mir jemand sagen, was ich falsch mache?#include <stdio.h>
#include <conio.h>#define MAXMONTH 12
int main (void)
{
int i;
struct book
{
char month[20];
char monthabbrev[20];
int days;
int numbmonth;
};struct book library;
struct library.month = {"Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"};
for (i = 0; i < MAXMONTH; i ++)
puts(library.month);getch();
return 0;
}
-
Cheerful Coder schrieb:
Kann mir jemand sagen, was ich falsch mache?
// Keine Cpp-Tags verwendet. #include <stdio.h> #include <conio.h> // <- Kein Standard-C #define MAXMONTH 12 // Fehlende Einrückung int main (void) { int i; // Was soll das überhaupt für eine Struktur sein? struct book { char month[20]; char monthabbrev[20]; int days; int numbmonth; }; struct book library; // Hier deklarierst du ein "book", nennst es aber "library", mir scheint, das ist nicht ganz das, was du willst. // Hier ist ja irgendwie alles falsch. Diese Art der Zuweisung funktioniert nur // bei der direkten Initialisierung von Variablen / Arrays, das gilt auch für Strings! // Das "struct" vor library ist auch fehl am Platz. // Wobei mir immer noch schleierhaft ist, was du eigentlich erreichen willst.. struct library.month = {"Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"}; for (i = 0; i < MAXMONTH; i ++) puts(library.month); getch(); // .. :) return 0; }
Nur mal ein simples Beispiel, das zu der Überschrift passt:
struct mensch { unsigned int alter, gewicht; }; int main() { struct mensch gruppe[3]; gruppe[0].alter = 5; gruppe[0].gewicht = 30; // Wie schwer ist ein Fünfjähriger eigentlich?^^ gruppe[1].alter = 7; // ... }
-
Du versuchst einem char-Array (das 20 Zeichen aufnehmen kann) 12 Zeiger auf char zuzuweisen.
Das verträgt sich von den Variablentypen schon nicht.Zudem kannst du einem Array auch nur bei der Deklaration alle Werte auf einmal zuweisen.
Kurz:
In deinem struct ist nur Platz für einen Monatsnamen. Und den musst du auch mitstrcpy()
füllen.
-
Ich wollte einfach wissen, ob ich mir das sparen kann alle Monate in einem Strukturarray einzeln zu deklarieren und einfach alle hintereinander zu schreiben, weil das ja auch für eine einfache normale Struktur funktioniert. Aber ich glaube durch das Beispiel von cooky451, wie man Strukturen deklariert, kann ich mir ungefähr ein Bild davon machen wie man den Array zuweisen muss.
@Cooky 451 Ich lerne mich grade in Strukturen ein, deshalb sind Fehler garantiert nicht ausgeschlossen, auch was die Namensgebung angeht.
Meine Aufgabe war es einen Strukturarray auszugeben, der für ein Jahr die Monate und Tage ausgibt.
Getch() nutze ich nur, weil sich mein Compiler sonst nach der Eingabe und der kommenden Ausgabe schließt.
@Dirkb: könnte ich denn den Array so deklarieren?
library[12].month = {"Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"};
Oder wäre das auch falsch?
Gruß und danke.
P.S. bin neu und verstehe nicht wie man den C code richtig einbindet.
Mit welchen Befehlen geht das?
-
cooky451 schrieb:
struct book library; // Hier deklarierst du ein "book", nennst es aber
Das ist falsch so, in erster Linie wird hier definiert und nur implizit deklariert.
-
Wenn du ohnehin konstante Werte verwendest, bietet es sich an, diese struct-Liste gleich bei der Definition zu initialisieren. Du sparst dir damit anschließende Schleifendurchläufe, evtl. Fehler dabei und wirst bei fehlerhafter Initialisierung von Compiler evtl. sogar noch gewarnt.
#include <stdio.h> #define MAXMONTH 12 int main (void) { int i; struct book { char month[20]; int days; int numbmonth; char monthabbrev[20]; } library[]={{"Januar",31,1},{"Februar",28,2},{"März",31,3},{"April",30,4},{"Mai",31,5},{"Juni",30,6},{"Juli",31,7},{"August",31,8},{"September",30,9},{"Oktober",31,10},{"November",30,11},{"Dezember",31,12}}; for (i = 0; i < MAXMONTH; i ++) puts(library[i].month); return 0; }
-
Du kannst einem Array /einer Struct nur bei der Definition die WErte auf einmal zuweisen. Dann musst du aber auch alle Elemente der Struct nehmen.
Um mal das Beispiel von Cooky aufzugreifen:
struct mensch gruppe[3] = { {5,30}, {20,65}, {45,80}};
Später im Programm geht das nicht mehr
// Weder gruppe = { {5,30}, {20,65}, {45,80}}; // falcsh // noch gruppe[1] = { 20,65}; // auch flasch
-
DirkB schrieb:
struct mensch gruppe[3] = { {5,30}, {20,65}, {45,80}};
Später im Programm geht das nicht mehr
// Weder gruppe = { {5,30}, {20,65}, {45,80}}; // falcsh // noch gruppe[1] = { 20,65}; // auch flasch
Das geht schon mit compound Literalen in C99 oder GCC Feature Mode:
struct mensch gruppe[] = { {5,30}, {20,65}, {45,80}}; ... gruppe[1] = (struct mensch){77,88};
oder auch das ganze Array neu setzen:
struct mensch (*gruppe)[] = &(struct mensch[]){ {5,30}, {20,65}, {45,80}}; ... gruppe = &(struct mensch[]){ {11,22}, {33,44}, {55,66} }; ... (*gruppe)[1] = (struct mensch){77,88};
-
Das kenne ich zwar nicht, aber zumindest die Adresse davon holen sieht für mich nach dangling pointer aus.
-
Hey!
Dankeschön, eure Beiträge haben mir sehr geholfen. Besonders das Beispiel von Wutz. Genau das hat meine Frage beantwortet. Ich werde dann die Strukturen am Anfang deklarieren.
Gruß and many thx!