PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C: Array


Gast
2008-01-07, 15:53:02
Hiho !

Hab da eigentlich nur ne ganz kurze und vermutlich dämliche Frage:

Angenommen ich hab ein Array: unsigned char buffer[5]

Kann ich den einzelnen "Zellen" im Array Namen geben und wenn ja, wie ?

buffer[0] soll z.B. direkt über den Bezeichner "Byte1" erreichbar sein, buffer[1] als "Byte2" usw., so dass ich mit "ByteX" direkt den darin liegenden Wert auslesen kann. Bitte nicht nach dem Sinn fragen, es soll einfach lesbarer sein, buffer[0] sagt ja keinem was :)

Danke !

Markus89
2008-01-07, 16:23:16
Schau dir mal Pointer an. Damit kannst du auf die einzelnen Elemente zeigen.

pest
2008-01-07, 16:34:23
warum speicherst du den Arrayinhalt nicht gleich in einzelnen Bytes
den Overhead rechtfertigt die Pointermaßnahme m.M. nach nicht


char *Byte0 = buffer;
char *Byte1 = buffer+1;

Xmas
2008-01-07, 19:08:30
In C++ gäbe es die Möglichkeit Referenzen zu nutzen, allerdings scheint es mir in diesem Fall besser eine struct (oder union) zu verwenden statt ein Array.

Dabei muss man allerdings darauf achten dass der Compiler die struct richtig packt, was dann Compiler-spezifisch ist.

Gast
2008-01-07, 20:06:00
Ich verwende den MinGW-Compiler zusammen mit Code::Blocks :)

amida maru
2008-01-08, 15:11:00
hmm also muss es C sein. In C++ gibt es Maps bei der STL und die sind für sowas da glaub ich^^

Xmas
2008-01-08, 15:36:18
hmm also muss es C sein. In C++ gibt es Maps bei der STL und die sind für sowas da glaub ich^^
In Hilfe-Threads sollte man nur antworten wenn man Ahnung hat um was es geht.

amida maru
2008-01-09, 16:24:21
sorry...

Besserwissend
2008-01-09, 18:06:29
Zwei Möglichkeiten:

1. über Präprozessoranweisungen:

#define Byte1 buffer[0]
#define Byte2 buffer[1]
...

Das ist das was du willst.

2. Ein bisschen anders: Index über Enums

enum bytes { Byte1,Byte2,...};


Dann kann der Zugriff auf die Array-Elemente mit

buffer[Byte1], buffer[Byte2]...


geschehen.

Gast
2008-01-09, 18:27:08
Danke ! Auf die #define Variante hät ich Esel aber auch selber kommen können, schließlich schmeiß ich schon die ganze Zeit mit defines um mich im Programm :D

Neomi
2008-01-09, 20:25:04
Defines sind manchmal eine gute Sache, in dem Fall gibt es allerdings eine bessere Lösung: Referenzen.

char buffer[5];
char &Byte0 = buffer[0];
char &Byte1 = buffer[1];

Funktional gibt es auf den ersten Blick zwar keine Unterschiede in der Nutzung, aber es ist deutlich sauberer, da sich Referenzen als direktes Sprachfeature (im Gegensatz zum Präprozessor) an den jeweiligen Scope halten.

Gast
2008-01-09, 20:53:11
Wie benutz ich das dann ?

z.B.

if(&Byte0 == 0xE2)

Mit "&" davor oder ohne oder mit "*" ?

Bin noch ziemlicher Anfänger, was Variantenreichtum beim Programmieren angeht :)

Besserwissend
2008-01-09, 20:57:40
Defines sind manchmal eine gute Sache, in dem Fall gibt es allerdings eine bessere Lösung: Referenzen.
...


edit
Die Lösung ist natürlich schöner, kostet aber was.
Nur des "hübschen Aussehens" respektive der Lesbarkeit Willen (mindestens) nochmal soviel Speicher zu verbrauchen wie das Array selbst benötigt ?:confused:
Ich denke die enum-Geschichte trifft zwar nicht ganz das Ziel, ist aber das Billigste - mit "Sichtbarkeitsunterstützung" ;).

Coda
2008-01-09, 20:59:40
Die Lösung ist natürlich schöner, kostet aber was.
Tut sie nicht.

Besserwissend
2008-01-09, 21:01:04
Tut sie nicht.
Stimmt!
Aber seit wann gibt es in C Referenzen?

Coda
2008-01-09, 21:29:52
Das ist ja was anderes ;)

Neomi
2008-01-09, 21:51:47
Hoppla, ging ja um C und nicht C++. Dann war es das wohl mit Referenzen, Enums fallen dann allerdings auch weg. Oder gab es die schon in C? Ich habe schon seit Ewigkeiten nichts mehr in "reinem" C gemacht.

EGG-Beater
2008-01-10, 00:15:44
Jo, Enumerates gibts in C.