Ich möchte gerne in c einen 2dimensionalen array erstellen, wobei die
erste spalte strings enthalten soll und die zweite spalte werte
z,B.
["A"][1]
["B"][2]
usw.
aber ich kann ja nur
uint8_t array[][]
oder
char array[][]
beim ersten habe ich aber beides mal uint8 und beim zweiten habe ich
beides mal char.
geht so etwas in C überhaupt?
in C# gäbe es ja eine liste, mit der das möglich wäre
Frank schrieb:> Ich möchte gerne in c einen 2dimensionalen array erstellen, wobei die> erste spalte strings enthalten soll und die zweite spalte werte>> z,B.> ["A"][1]> ["B"][2]> usw.>> aber ich kann ja nur> uint8_t array[][]> oder> char array[][]>> beim ersten habe ich aber beides mal uint8 und beim zweiten habe ich> beides mal char.
Richtig. Wilkommen bei der niederen "Hoch-"Sprache C.
Wenn Du es geordnet anstellst, hast Du immerhin in beiden Feldern mit
dem selben Index der korrespondierende String und Zahlenwert.
Die nächste Evoltionsstufe ist dann in der Tat ein Feld von
Strukturen.
Bei beiden muss jedoch die Umrechnung von Suchstring zu Index als
Zwischenschritt ausprogrammiert werden. Gute Übung!
Stichwort: "Algorithmen und Datenstrukturen"
Da sowas bereits viele vor dir getan haben, suche und evaluiere eine
gebrauchsfertige Bibliothek welche dir o.g. Übung durch eine andere
ablöst.
cppbert schrieb:> Auch nicht ohne struct oder meinst du ein Dictionary?
Ja, oder ein Dictionary. Ich weiß nicht mehr genau wie es hieß. Weiß
aber, dass es sowas gab.
Oliver S. schrieb:> struct>> Oliver
oh ja, das hätte mir auch einfallen können.Besten dank.
Doch leider habe ich probleme damit
Wenn ich in der Funktion init_cards nur cards[0] beschreibe und cards[1]
auskommentiere (die anderen kommen dann später noch hinzu), funktioniert
alles. Aberwenn ich cards[1] beschreiben möchte, stürzt das Programm ab.
Also es kommt nicht mehr zum printf "ende initialisierung".
Aber warum? ich übergeben doch den ganzen array und dieser ist 5
Elemente lang.
Frank schrieb:> Aber warum? ich übergeben doch den ganzen array und dieser ist 5> Elemente lang.
Ja, aber es handelt sich um 5 Zeiger, die ins Gemüse zeigen
(uninitialisiert) Und dieses Gemüse versuchst du dann zu beschreiben.
Frank schrieb:> CARDS* cards[5];
Damit erzeugst du 5 Zeiger auf Karten, aber keine einzige Karte, in
die du irgendwelche Werte schreiben könntest.
Dirk B. schrieb:> Das sind nicht 5 CARDS sondern ein Zeiger auf 5 Cards.
Umgekehrt: Es sind 5 Zeiger auf jeweils eine Card, aber es sind eben nur
die Zeiger.
Frank schrieb:> Ist es denn schon die richtige Richtung?
Ja, das sieht besser aus. Ich kann auch keinen Fehler sehen, abgesehen
davon, dass du nur das erste Element ausgibst:
1
for(uint8_tx=0;x<1;x++)
Nach dem ersten Durchlauf ist x nicht mehr kleiner als 1, also wird die
Schleife nur genau einmal durchlaufen.
Es funktioniert bei auch ohne Probleme.
> Ist es denn schon die richtige Richtung?
Wird besser
Mit
sizeof(Cards)/sizeof(Cards[0])
Bekommst du die groesse des Arrays
Und ich wuerde bei der init cards eher Card* (anstatt Cards[]) und int
Count uebergeben
Rolf M. schrieb:> Nach dem ersten Durchlauf ist x nicht mehr kleiner als 1, also wird die> Schleife nur genau einmal durchlaufen.
Da hast du recht :). Aber so weit kommt es ja gar nicht. Bekomme also
noch nicht einmal das erste Element ausgegeben.
cppbert schrieb:> Und ich wuerde bei der init cards eher Card* (anstatt Cards[]) und int> Count uebergeben
Ja, das würde ich später auch machen wollen (also zumindest eine länge
übergeben. Aber zunächst wollte ich so wenig sachen wie möglich. Läuft
ja mit weniger auch nicht ;)
cppbert schrieb:> CARDS in CARD umbenennen
OK. JA, wenn man genau überlegt ist das richtig. Ich beschreibe ja nur
eine Karte im Struct. Vom struct aber mehrere. deswegen dann cards :)
cppbert schrieb:> CARD* card = &cards[x]; // oder cards+x
Das habe ich nicht ganz verstanden. Wo muss dass denn hin? Bzw. was
bewirkt das?
Noch einmal besten dank für die Hinweise
Frank schrieb:> Aber so weit kommt es ja gar nicht. Bekomme also> noch nicht einmal das erste Element ausgegeben.
Welche Ausgabe kommt?
Startest du auch das richtige (neuste) Programm?
Ein
cppbert schrieb:> #define ARRAY_SIZE(ARRAY) (sizeof(ARRAY)/sizeof(ARRAY[0]))>> for(uint8_t x=0; x<ARRAY_SIZE(cards); ++x)> {> CARD* card = &cards[x];>> printf("%s Jahr: %d Monat %d Tag: %d\n", card->ereignis,> card->datum.jahr, card->datum.monat, card->datum.tag);> }
du kanns die Schleifen z.B. auch so schreiben
#define ARRAY_SIZE(ARRAY) (sizeof(ARRAY)/sizeof(ARRAY[0]))
for(CARD* card = &cards[0]; card != &cards[0]+ARRAY_SIZE(cards); ++card)
{
printf("%s Jahr: %d Monat %d Tag: %d\n", card->ereignis,
card->datum.jahr, card->datum.monat, card->datum.tag);
}
sehr viele Wege führen in C nach Rom - und es ist gut die Varianten zu
verstehen, damit man weniger Fehler macht, schneller ist
cppbert schrieb:> Frank schrieb:>> Das habe ich nicht ganz verstanden. Wo muss dass denn hin? Bzw. was>> bewirkt das?>> weniger schreiben, weniger Fehler
So viel macht das hier aber nicht wirklich aus.
> #define ARRAY_SIZE(ARRAY) (sizeof(ARRAY)/sizeof(ARRAY[0]))>> for(uint8_t x=0; x<ARRAY_SIZE(cards); ++x)
Es ist gefährlich, das einem Einsteiger so zu empfehlen. Das nächste,
was der nämlich macht, ist, das in eine Funktion auslagern und sich dann
wundern, warum es plötzlich nicht mehr funktioniert.
>> Frank schrieb:>>> Das habe ich nicht ganz verstanden. Wo muss dass denn hin? Bzw. was>>> bewirkt das?>>>> weniger schreiben, weniger Fehler>> So viel macht das hier aber nicht wirklich aus.
aber Pointer sollte er schon kennen, oder?
>> #define ARRAY_SIZE(ARRAY) (sizeof(ARRAY)/sizeof(ARRAY[0]))>>>> for(uint8_t x=0; x<ARRAY_SIZE(cards); ++x)>> Es ist gefährlich, das einem Einsteiger so zu empfehlen. Das nächste,> was der nämlich macht, ist, das in eine Funktion auslagern und sich dann> wundern, warum es plötzlich nicht mehr funktioniert.
wenn es nicht funktioniert ist es doch nicht gefährlich, oder?
ich wollte einfach nur ein paar Grundlagen aufzeigen, mehr nicht