Nabend
Seit ein paar Tagen lese ich hier und ueberall wo Google mich
weitergeleitet hat diverse Beiträge ueber die erstellung von Menues
ueber Structs.
So wie ich das jetzt verstanden habe ich das eig. genau das gleiche wie
ein "eindimensionales" Array bei Variablen.
- Oder ist es so das man nur einen Pointer erstellt und fuer die
einzelnen Menuepunkte manuell Prototypen erstellen muss
und dann immer beim springen Menue=Name[n] wobei menue der Pointer
ist?
Es werden Prototypen mit dem Namen "Name[0]" bis "Name[n]" erzeugt.
Nun macht man es so das man einfach z.B. für das Durchschalten im
Hauptmenue den Wert "[?]" um sagen wir 100 erhoeht und somit von:
1
voidName[0](){
2
Programm;
3
}
auf
1
voidName[100](){
2
Programm;
3
}
springt.
Geht man ich das nächste Untermenue addiert man z.B. 10, wodurch in
jedem Hauptmenue biszu 9 Untermenues zulaessig sind: [110], [120],
...[190].
Dadurch ist es aber nicht moeglich z.B. in das Menue "Name[101]" zu
kommen.
Habe ich das so richtig verstanden oder erzähle (schreibe) ich hier nur
Muell?
Vielen Dank.
Du hast da ziemlich viel nicht verstanden.
Lies Dir ein Buch über C durch, nach wie vor empfehlenswert ist der
"K&R" (Brian Kernighan, Dennis Ritchie, "Programmieren in C", zweite
Auflage, Hanser-Verlag)
Ballermann schrieb:> Schau mal nach "verkettete Listen".> Das ist in meinen Augen der Softeinstieg...
Das hier ist ein Mikrocontroller-Forum. Da sind verkettete Listen mit
99.9%-iger Wahrscheinlichkeit der falsche Ansatz.
xXx schrieb:> Das hier ist ein Mikrocontroller-Forum. Da sind verkettete Listen mit> 99.9%-iger Wahrscheinlichkeit der falsche Ansatz.
Da er allerdings im Unterforum GCC gepostet hat kann das erstmal alles
sein ;-)
Aber bereichere uns doch mit Deinem Wissen...
Ballermann schrieb:> xXx schrieb:>> Das hier ist ein Mikrocontroller-Forum. Da sind verkettete Listen mit>> 99.9%-iger Wahrscheinlichkeit der falsche Ansatz.> Da er allerdings im Unterforum GCC gepostet hat kann das erstmal alles sein ;-)
Und die Gelegenheit musstest du gleich mal nutzen um einen Anfaenger in
die Irre zu fuehren. Super! Genau wegen sowas ist dieses Forum nur noch
Rotz.
xXx schrieb:> Und die Gelegenheit musstest du gleich mal nutzen um einen Anfaenger in> die Irre zu fuehren. Super!
Was bist DU denn für ein Hampelmann?
Du weisst ja selber noch garnicht was er will und was für ein System er
einsetzt.
Abgesehen davon könnte man das auch auf einem uC mit Verketteten Listen
und einer geeigneten Datenstruktur realisieren.
xXx schrieb:> Genau wegen sowas ist dieses Forum nur noch Rotz.
Dann mach Dich vom Acker oder trag was Sinnvolles bei und stänker hier
nicht nur blöde in der Gegend rum.
Ich halte es nicht für sinnvoll, zu versuchen, dem Threadstarter
einzelne seiner Fehler zu erläutern, bevor er sich nicht mit den
Grundlagen auseinandersetzt. Und dazu gehört es nunmal, den K&R oder
ein gleichwertiges Buch zu lesen. Kein "Tutorial", keine rasch
irgendwo zusammengestoppelte Hilfe, sondern hinsetzen (oder -legen) und
lesen.
Rufus Τ. Firefly schrieb:> Kein "Tutorial", keine rasch> irgendwo zusammengestoppelte Hilfe, sondern hinsetzen (oder -legen) und> lesen.
100% Ack! Software entwickeln ist nicht wie Doktorarbeiten in den
Rechtswissenschaften verfassen. Das wird nix mit einfach
zusammenkopieren, weder mit noch ohne Quellenangaben.
@Ballermann: Wenn du allen Ernstes jemandem, der das Konzept eines
Arrays und eines structs noch überhaupt nicht verstanden hat empfiehlst
sich über verkettete Listen zu informieren, dann brauchst du entweder
genau so dringend ein C Buch oder du willst denjenigen ziemlich infantil
reinlegen!
@xXx: Wenn du der Meinung bist das Forum ist nur noch Rotz, dann kannst
du dir doch ein besseres suchen. Ich fühle mich hier ganz wohl und finde
recht viele Informationsperlen zwischen den normalen Labermuschelschalen
MfG
UR Schmitt schrieb:> oder du willst denjenigen ziemlich infantil reinlegen!
...ich will hier garniemanden reinlegen.
Also lasst bitte solche Unterstellungen.
Ich kann nicht beurteilen wieviel der TO genau an Wissen hat.
Klar hat er einiges durcheinander geworfen, allerdings kann man als
Neuling auch einzelne Dinge wie Arrays und Stucts verstehen bei
verketteten Listen dann aber eine Blockade haben.
Ich habe ihm also lediglich einen Brocken hingeworfen.
Die Beurteilung wo er einsteigen muss überlasse ich dabei ihm.
Grüße
Also:
Es geht mir um das Programmieren auf einem AVR.
Habe mein letztes Menue per SwitchCase gemacht, doch leider wurde es so
groß das man keinerlei Uebersicht mehr hatte und mein Speicher voll war.
Nun habe ich vor dieses Menue ueber die anscheind "beste" Loensung so
wie ich gelesen habe als struct zu erstellen und sozusagen fuer jedes
Menue ein anderes Programm aufrufen, fuer welches die Daten aus einem
externen Speicher geladen werden (laden und ausgeben funktioniert
alles).
Sehe ich das richtig das dieses Buch dort kostenfrei Online zur
Verfuegung steht??
Naja tue ich mal weitergucken ... inzwischen bin ich eig. nur noch mehr
verwirrt bzgl. der structs...
Mal schauen was die Zukunft bringt ... hat zufaellig jemand einen
Ausschnitt aus einem alten Code von sich wo er ein Menue ueber Struct
realisiert hat? ... klar habe ich auch schon gesucht, aber entweder
gehts darum das etwas nicht geht, oder es ist nicht gerade fuer mich
erkennbar erklaert.
>Software entwickeln ist nicht wie Doktorarbeiten in den>Rechtswissenschaften verfassen. Das wird nix mit einfach>zusammenkopieren, weder mit noch ohne Quellenangaben.
;-)
xXx schrieb:> Das hier ist ein Mikrocontroller-Forum. Da sind verkettete Listen mit> 99.9%-iger Wahrscheinlichkeit der falsche Ansatz.
Wie kommst du darauf?
Habe das nun mehrfach durchgelesen (das Kapitel der Structs) und auch
bissle davor bissle dahinter, .. von vorne kommt sobald ich das Buch
gedruckt habe ...
Ich bekomme einfach nichts anderes als eine Art Arry in den Kopf ...
Egal wie ich versuche es zu sehen so denke ich immer an ein Arry,
welches einen Namen hat, unter diesem Namen gibts es verschiedene
Variablen mit anderen Namen welche unterschiedlichen Typs und längen
sind...
Ist es möglich "kurz" zu erklären in wiefern sich struct`s von Arrys
unterscheiden? Oder gerne auch länger wenn jemand Lust und Zeit dazu
hat.
Ich weiß natürlich das ihr das alles "ehrenamtlich" macht und finde das
auch super.
>Ist es möglich "kurz" zu erklären in wiefern sich struct`s von Arrys>unterscheiden?
Hast du quasi gerade:
>>Egal wie ich versuche es zu sehen so denke ich immer an ein Arry,>>welches einen Namen hat, unter diesem Namen gibts es verschiedene>>Variablen mit anderen Namen welche unterschiedlichen Typs und längen>>sind...
Nur das das eben kein Array, sondern eine struct ist.
Also nochmal:
Ein Array ist eine Ansammlung, oder besser Aufzählung, gleicher
Datentypen. Wenn Du zB alle eine Minute eine Temperatur speichern
willst, fallen (pro Std) 60 Werte an. Diese zu speichern nutzt man
Arrays. Der Array-index gibt in dem Fall die Minute an, in der gemessen
wurde:
temp[0] = 23 (grad)
temp[1] = ...
Mit Structs kannst du verschiedene Datentypen, die aber irgendwie
logisch zusammenhängen, auch zusammen behandeln.
Stell Dir vor, misst in deinem Auto die Geschwindigkeit, den
Spritverbrauch, die Innentemp, und was weiss ich noch alles. Jetzt
müsstest du für jeden Wert eine eigene Variable anlegen:
uint8_t speed;
uint8_t intemp;
uint8_t outtemp;
...
Das Ansprechen erfolgt normal mit speed=...
Diese Variablen stehen jetzt einfach so da und scheinen unternander
keinen Bezug zu haben. (müssen sie ja auch nicht) Falls Du jetzt aber im
Code kennzeichnen willst, dass diese irgendwie zusammengehören, so nimmt
man eine struct:
struct
{
uint8_t speed;
uint8_t intemp;
uint8_t outtemp;
...
}
Autowerte;
Jetzt kannst du Mitglieder der struct immer über den "Obernamen"
Autowerte ansprechen:
Autowerte.speed=34;
Autowerte.outtemp=...
Beide möglichkeiten werden identisch funktioneren. Die letzte mit
structs hat aber Vorteile.
Ums kompliziert zu machen:
Wenn du jetzt mehrere Autos hast, kannst du auch ein array aus structs
bilden.
Weiterhin ist es möglich, dass Mitglieder der Struktur ebenfalls wieder
structs sind...
Is mir i-wie peinlich schrieb:> Sehe ich das richtig das dieses Buch dort kostenfrei Online zur> Verfuegung steht??
Du kannst es dir auch runterladen damit es kostenlos Offline zur
Verfügung steht.
Matthias Lipinsky schrieb:>>Ist es möglich "kurz" zu erklären in wiefern sich struct`s von Arrys>>unterscheiden?>> Hast du quasi gerade:>>>Egal wie ich versuche es zu sehen so denke ich immer an ein Arry,>>>welches einen Namen hat, unter diesem Namen gibts es verschiedene>>>Variablen mit anderen Namen welche unterschiedlichen Typs und längen>>>sind...>> Nur das das eben kein Array, sondern eine struct ist.>>> Also nochmal:>> Ein Array ist eine Ansammlung, oder besser Aufzählung, gleicher> Datentypen. Wenn Du zB alle eine Minute eine Temperatur speichern> willst, fallen (pro Std) 60 Werte an. Diese zu speichern nutzt man> Arrays. Der Array-index gibt in dem Fall die Minute an, in der gemessen> wurde:> temp[0] = 23 (grad)> temp[1] = ...>>> Mit Structs kannst du verschiedene Datentypen, die aber irgendwie> logisch zusammenhängen, auch zusammen behandeln.> Stell Dir vor, misst in deinem Auto die Geschwindigkeit, den> Spritverbrauch, die Innentemp, und was weiss ich noch alles. Jetzt> müsstest du für jeden Wert eine eigene Variable anlegen:> uint8_t speed;> uint8_t intemp;> uint8_t outtemp;> ...> Das Ansprechen erfolgt normal mit speed=...>> Diese Variablen stehen jetzt einfach so da und scheinen unternander> keinen Bezug zu haben. (müssen sie ja auch nicht) Falls Du jetzt aber im> Code kennzeichnen willst, dass diese irgendwie zusammengehören, so nimmt> man eine struct:>> struct> {> uint8_t speed;> uint8_t intemp;> uint8_t outtemp;> ...> }> Autowerte;>> Jetzt kannst du Mitglieder der struct immer über den "Obernamen"> Autowerte ansprechen:> Autowerte.speed=34;> Autowerte.outtemp=...>> Beide möglichkeiten werden identisch funktioneren. Die letzte mit> structs hat aber Vorteile.>>> Ums kompliziert zu machen:> Wenn du jetzt mehrere Autos hast, kannst du auch ein array aus structs> bilden.> Weiterhin ist es möglich, dass Mitglieder der Struktur ebenfalls wieder> structs sind...
Haha, super danke .. kein Wunder warum ich das nicht kapiere ... hatte
die ersten Antworten als "ein struct hat mit einem Arry nichts zu tun".
Michael K. schrieb:> Is mir i-wie peinlich schrieb:>> Sehe ich das richtig das dieses Buch dort kostenfrei Online zur>> Verfuegung steht??> Du kannst es dir auch runterladen damit es kostenlos Offline zur> Verfügung steht.
Heute morgen gesehen und gleich mal Offline besorgt, nun kann ich
während der Arbeit (wenn mal nicht so viel zu tun ist) da n bissle
lesen.
eine Frage habe ich noch ...
Ich kenne zwar "*zeiger" aber beim durchwühlen des Forums habe ich
häufiger Befehle gesehen wo das Sternchen hinter einer bezeichnung war:
"menuestruktur* my_struct"
Was bedeutet das "*" hinter einer bezeichnung/eines Wertes?
Steht in jedem C-Buch. Man liest von links nach rechts, das Schwarze
sind die Buchstaben.
Willst du jetzt hier alles vorgekaut haben?
Das nervt langsam...
Is mir i-wie peinlich schrieb:> Ich kenne zwar "*zeiger" aber beim durchwühlen des Forums habe ich> häufiger Befehle gesehen wo das Sternchen hinter einer bezeichnung war:> "menuestruktur* my_struct">> Was bedeutet das "*" hinter einer bezeichnung/eines Wertes?
Das ist das Gleiche.
Aber aufpassen, bei
Is mir i-wie peinlich schrieb:> Ich kenne zwar "*zeiger" aber beim durchwühlen des Forums habe ich> häufiger Befehle gesehen wo das Sternchen hinter einer bezeichnung war:> "menuestruktur* my_struct">> Was bedeutet das "*" hinter einer bezeichnung/eines Wertes?
Wieso hinter? Es steht doch davor. my_struct ist der Name, und das
Sternchen steht davor.
dahinter weil das Sternchen direkt hinter menustruktut steht und
zwischen Sternchen und my_struct ein Leerzeichen ist.
Es tut mir ja leid das ich so viel nerve (deswegen auch Annonym) aber
auch in eurem C-Buch habe ich bisher noch nichts gefunden wo das
Sternchen wo hinter war.
Wenn ich euch jetzt richtig verstanden habe ist:
menustruktur* my_struct == menustruktur *my_struct
und wenn ich
menustruktur* struct1, struct2 ist es gleich struct1 als zeiger und
struct ein int ...
Is mir i-wie peinlich schrieb:> Habe das nun mehrfach durchgelesen (das Kapitel der Structs) und auch> bissle davor bissle dahinter, .. von vorne kommt sobald ich das Buch> gedruckt habe ...
So wird das nichts.
Vergiss diese Vorgehensweise.
Fang VORNE an. Schieb Dein momentanes Problem zur Seite, beschäftige
Dich mit den Grundlagen. Die kennst Du nicht, aber die brauchst Du.
Das, was Du jetzt machst, ist der Versuch, Plato im Original zu lesen,
mit den Sprachkenntnissen, die üblicherweise in einfachen griechischen
Restaurants auf der Serviette zu finden sind.
> ...und struct ein int...
Ich denke Du meinst struct2?
Nein, das ist nicht EIN int!
Ein int in einer struct zu erzeugen macht wohl wenig sinn, oder?
Eine struct wird verwendet um mehrere unterschiedliche Datentypen
zusammen zu fassen.
Struct2 ist das, was du definiert hast!
Warum soll ein Array keine struct sein? Es hat zwar unterschiedlich
Syntax und eine andere Funktion, aber im Endeffekt läuft es auf einen
Speicherblock heraus, auf den man sowohl bei der struct als auch beim
Array per Pointer zugreifen kann. Bei Arrays kann man zudem über den
Index darauf zugreifen, bei der struct über die einzelnen Elemente.
Man könnte sich eine Struct wie ein Schachtel vorstellen. Es werden
verschiedene Dinge hinein gesteckt.
Welchen Nutzen habe ich davon? Wenn ich jemandem die Dinge geben will,
muss ich das nicht einzeln tun, sondern kann die ganze Schachtel
übergeben.
Was ist der Unterschied zwischen einem Array und einem Stuct?
In ein Array kann ich nur gleiche Dinge hinein stecken, in eine
Structure aber verschiedene.
In einer Struktur hat jedes Ding seinen Namen. In einem Array haben die
Dinge nur Nummern.
Samuel K. schrieb:> Warum soll ein Array keine struct sein? Es hat zwar unterschiedlich> Syntax und eine andere Funktion, aber im Endeffekt läuft es auf einen> Speicherblock heraus, auf den man sowohl bei der struct als auch beim> Array per Pointer zugreifen kann.
Lies doch bitte ein C-Buch, bevor Du hier derartiges Viertelwissen
publizierst.
Eine Struktur ist ein Datentyp, der auch aus unterschiedlichen
Datentypen zusammengesetzt sein kann, ein Array ist ein Feld mehrerer
Elemente gleichen Datentyps.
Dein "Beispielcode" übrigens verwendet kein Array, sondern einen Pointer
Und Dein "Beispielcode" fliegt auf die Schnauze, sobald die Struktur
unterschiedliche Datentypen kombiniert.
Auch wenn er sich nicht mit C99 beschäftigt, ist der K&R immer noch ein
lesenswertes C-Buch.
Rufus Τ. Firefly schrieb:> Lies doch bitte ein C-Buch, bevor Du hier derartiges Viertelwissen> publizierst.
Ich hab noch nie ein C-Buch gelesen und auf die Idee werde ich auch
nicht kommen - ich habe in C so gut wie keine Probleme.
> Eine Struktur ist ein Datentyp, der auch aus unterschiedlichen> Datentypen zusammengesetzt sein kann, ein Array ist ein Feld mehrerer> Elemente gleichen Datentyps.
Deine Struktur liegt im Ram und belegt x Bytes. Dein Array liegt auch im
Ram und belegt x Bytes. Ich wage sogar zu behaupten, dass für den
Compiler Array und Struktur das gleiche sind. Bei beiden wird die
Startsadresse gespeichert, nur bei der struct weiß er zusätzlich wo
welcher Datentyp steht.
Welche Datentypen im Array oder der Struktur liegen ist erstmal egal.
Ich könnte auch das erste Byte im Array als char nutzen. Die nächsten 4
Bytes als int und dann noch ein paar Words als Pointer. Hab ich jetzt
Feld aus gleichen Datentypen welche bei jedem Zugriff umgecastet werden,
oder sind nun doch verschiedene Datentypen im Array. Oder ist es eine
künstliche struct?
Die Einteilung beim Array ist in gleichen Schritten vorhanden. Wie es
letztendlich gehandhabt wird ist Sache des Programmierers. In der struct
kann man die Einteilung von vornerein festlegen - dennoch wird der
Compiler die Daten Byteweise lesen lassen.
> Dein "Beispielcode" übrigens verwendet kein Array, sondern einen Pointer
Damit sind wir bei der nächsten Grundsatzfrage: Array == Pointer?
Nach meiner Definition ist ein Array ein Pointer der auf einen
Speicherbereich zeigt.
Rufus Τ. Firefly schrieb:> Und Dein "Beispielcode" fliegt auf die Schnauze, sobald die Struktur> unterschiedliche Datentypen kombiniert.
1
struct
2
{
3
unsignedchara;
4
unsignedshortb;
5
}abc;
6
7
intmain(intargc,char*argv[])
8
{
9
unsignedchararray[4]={33,0,12345&0xFF,12345>>8};
10
memcpy(&abc,array,4);
11
12
printf("%d, %d\n",abc.a,abc.b);
13
system("PAUSE");
14
return0;
15
}
Man muss nur darauf achten, dass Words nur an "geraden" Speicherplatz
plaziert werden.
Samuel K. schrieb:> Deine Struktur liegt im Ram und belegt x Bytes. Dein Array liegt auch im> Ram und belegt x Bytes. Ich wage sogar zu behaupten, dass für den> Compiler Array und Struktur das gleiche sind. Bei beiden wird die> Startsadresse gespeichert, nur bei der struct weiß er zusätzlich wo> welcher Datentyp steht.
Du bist einfach nur [Mod: ...].
Nur mal ein weiterer Unterschied: Bei einem Array liegen die Elemente
direkt hintereinander. Bei einer struct können die sonstwo liegen, je
nach Padding.
Martin schrieb:> Du bist einfach nur [Mod:...].
Nur weil ihr es nicht besser wisst bzw. es zu wissen glaubt.
> Nur mal ein weiterer Unterschied: Bei einem Array liegen die Elemente> direkt hintereinander. Bei einer struct können die sonstwo liegen, je> nach Padding.
Ja, weil das Array den selben Typ hat. Bei einer struct liegen die
Elemente auch hintereinander, abgesehen von dem nichtgenutzten Byte nach
einem einzelnen char.
Aber anscheinend hast du meine Hauptaussage nicht begriffen:
Eine struct erzeugt genauso wie ein Array ein Datenfeld, das byteweise
zugegriffen. Was man am Ende mit den einzelnen Bytes macht ist egal.
Und bevor du weiter beleidigst, zeig mir ein Codebeispiel, welches ich
nicht widerlegen kann, und ich halte mich zurück.
PS: Überlegt euch mal die Unterschiede einer implementierten
Struktur/Array in Asm.
Samuel K. schrieb:> Ja, weil das Array den selben Typ hat. Bei einer struct liegen die> Elemente auch hintereinander, abgesehen von dem nichtgenutzten Byte nach> einem einzelnen char.
Nein, das ist falsch. Da kann jede Menge Padding sein. Wo immer der
Compiler es hinlegen will.
Und selbst "nach dem nichtgenutzten Byte" wäre schon der schlagende
Unterschied. Denn beim Array ist es garantiert "contiguous memory".
Also [Mod:...] dich.
Martin schrieb:> Also [Mod:...] dich.
Nein, so schnell wirst du mich nicht los!
Martin schrieb:> Nein, das ist falsch. Da kann jede Menge Padding sein. Wo immer der> Compiler es hinlegen will.
Zeig mal, das will ich sehen.
Das freie Byte in der Struktur hat mit dem Speichermanagments meines PCs
zu tun. Auf einem 8bit µC lässt (avr-)gcc keine Lücke. Außerdem könnte
der Compiler das Array genausogut auf 2 Stellen im Ram verteilen.
Ein Array int x[n] ist (nach mir) eine struct{int x1...xn}. Und da wird
nichts freigelassen.
Zeig mir ein array, dass ich nicht mit einer struct nachbilden kann.
Stefan Ernst schrieb:>> Außerdem könnte>> der Compiler das Array genausogut auf 2 Stellen im Ram verteilen.>> Nein, das lässt der C-Standard nicht zu.
Hmm, und was macht das Programm wenn 2x50MB Blöcke im Ram frei sind,
aber 60MB gebraucht werden? Stürzt es dann ab?
Ich weiß auch nicht, ob der Compiler eine struct überhaupt verteilt.
Samuel K. schrieb:> Zeig mir ein array, dass ich nicht mit einer struct nachbilden kann.
Du bist ein Held. Implementierungsabhängiges Verhalten läßt sich nicht
anhand deiner Implementierung "zeigen".
Samuel K. schrieb:> Hmm, und was macht das Programm wenn 2x50MB Blöcke im Ram frei sind,> aber 60MB gebraucht werden? Stürzt es dann ab?
Schon mal was von virtuellem Speicher gehört?
Und wenn es das auf dem System nicht gibt, dann kann man in solch einem
Fall eben kein einzelnes Array mit 60 MB erzeugen. Ein Array MUSS in
einem kontinuierlich zusammenhängenden Speicherbereich liegen. Da führt
kein Weg dran vorbei.
Man kann ich C viele Dinge machen, aber ob es sinnvoll ist, ist eine
andere Frage. Wozu ein Array missbrauchen wenn man es strukturiert mit
einer Struktur beschreiben kann. So erzeugt man nur unleserlichen Code.
Samuel K. schrieb:>> Eine Struktur ist ein Datentyp, der auch aus unterschiedlichen>> Datentypen zusammengesetzt sein kann, ein Array ist ein Feld mehrerer>> Elemente gleichen Datentyps.>> Deine Struktur liegt im Ram und belegt x Bytes. Dein Array liegt auch im> Ram und belegt x Bytes.
darum gehts doch gar nicht.
Letzten Endes ist alles nur ein paar Bytes im Speicher.
Bei Arrays und Strukturen geht es um logische Konzepte und nicht darum
wie sie realisiert sind.
Strukturen sind eine Möglichkeit, die mir als Programmierer erlauben
einen neuen Datentyp zu erschaffen. Und zwar so, wie ich ihn brauche.
Ausgangspunkt der Überlegung ist es, dass es immer wieder einmal
vorkommt, dass ich Daten habe, die feiner strukturiert sind, die
Einzeldaten aber nur zusammen einen Sinn ergeben und daher beisammen
bleiben sollen.
Ein Datum besteht aus den 3 Elementen: Tag, Monat, Jahr.
Ein kompletter Name besteht aus einem Vornamen und einem Nachnahmen.
Die Beschreibung eines Mitarbeiters einer Firma besteht aus den Teilen:
Personalnummer, Name, Wohnadresse, Geburtsdatum.
Diese Zusammenghörigkeit der Einzelteile hat Priorität vor allem
anderen. Ob ich dann aus den einzelnen Mitarbeiterbeschreibungen wieder
ein Array von Mitarbeitern aufbaue oder ob ich die in eine Hashtabelle
stecke oder in eine verlinkte Liste ist egal. Immer besteht eine
Mitarbeiterbeschreibung aus den Teilen: Personalnummer, Name,
Wohnadresse und Geburtsdatum. Und wenn von einer derartigen Beschreibung
im Programm die Rede ist, dann sind das all diese Teile zusammen.
Und da das so ist, möchte man gerne eine Möglichkeit haben, wie man
diese Zusammengehörigkeit auch im Programm ausdrücken kann: Die
Struktur.
1
structEmployee
2
{
3
intId;
4
charFirstName[30];
5
charLastName[30];
6
intBirthDay;
7
intBirthMonth;
8
intBirthYear;
9
};
Strukturen haben jetzt natürlich den Vorteil, dass man sie wie
Bausteine/Baugruppen benutzen kann. In obiger Beschreibung kommt zb der
Geburttag in Form von Tag/Monat/Jahr vor. Da es sehr wahrscheinlich ist,
dass in einem derartigem Programm auch noch andere Daten vorkommen
werden, macht es Sinn, sich für Daten wieder eine eigene Struktur zu
schaffen
1
structDate
2
{
3
intDay;
4
intMonth;
5
intYear;
6
};
Mit dieser neuen Struktur kann man dann die Personalbeschreibung kürzer
formuieren
1
structEmployee
2
{
3
intId;
4
charFirstName[30];
5
charLastName[30];
6
structDateDateOfBirth;
7
structDateDateOfEntry;
8
};
Da hier DateOfBirth ein struct Date ist, hat er automatisch die Member
Day, Month und Year. Ebenso DateOfEntry (das Datum an dem der
Mitarbeiter in die Firma kam).
Habe ich also einen Mitarbeiter
1
structEmployeeBob;
dann kann ich mittels
1
Bob.DateOfBirth
auf das komplette Geburtsdatum von Bob zugreifen und es zb an eine
Funktion übergeben, die ein Datum ausgeben kann
1
voidprintDate(structDatedate)
2
{
3
printf("%d/%d/%d",date.Day,date.Month,date.Year);
4
}
und weil es dieser Funktion egal ist, woher dieses Datum kommt, kann ich
natürlich auch mittels
1
printDate(&Bob.DateOfEntry);
mit derselben Funktion das Datum ausgeben lassen, an dem Bob in die
Firma kam.
Also: Bei der Frage Array oder Struktur geht es nicht darum, wie sich
die Dinge im Speicher abspielen, sondern es geht darum welche logische
Struktur ich ausdrücken möchte.
Und eine Struktur ist ein Werkzeug, mit dem man zusammengehörende Daten
organisiert in einen Container packen kann. Wenn man so will, wie in
einem Arbeitskoffer eines Akkubohrers, in dem neben der eigentlichen
Maschine auch noch das Ladegerät, ein paar Pits und diverse Bohrer
gepackt sind, so dass ich nur durch Nehmen des Koffers alles beisammen
habe, was ich brauche.
In obigem Beispiel ist das dann die Variable 'Bob'. Sie realisiert
diesen Container, diesen Koffer, in dem alles beisammen ist, was einen
Mitarbeiter (im Programm) ausmacht.
Schreibe ich mir eine Funktion, die überprüft, wer von meinen
Mitarbeitern Geburtstag hat und mir eine Liste dafür zusammenstellt, so
sieht das so aus:
und habe ich ein Array von 500 Mitarbeitern (das mit Daten gefüllt ist)
1
structEmployeeemployees[500];
dann spiele ich einfach in einer Schleife einen nach dem anderen durch
diese FUnktion und die Funktion filtert mir die entsprechenden
Mitarbeiter heraus:
1
...
2
3
structDatetoday;
4
today.Day=30;
5
today.Month=10;
6
today.Year=2011;
7
8
for(i=0;i<nrEmployees;++i)
9
checkForBirthDay(&employees[i],&today);
10
...
An der Stelle des Aufrufs muss ich nicht wissen, wie das herausfiltern
genau geschieht. Ich übergebe einfach den Mitarbeiter (in diesem Fall
einen Zeiger auf den Mitarbeiter) an die Funktion und in dieser Funktion
steckt dann das Wissen, wie genau der Geburtstag beim Mitarbeiter
gespeichert ist und wie man es herausholt.
Die Struktur hat es mir als ermöglicht, auf einer hohen Ebene
("Herausfiltern der Mitarbeiter, die an einem bestimmten Tag Geburtstag
haben"), mich von den Details der Implementierung zu lösen und diese
Details an eine Funktion zu delegieren der ich einen Mitarbeiter als
solches übergeben kann. Das ist zb dann wichtig, wenn ich die
Implementierung verändern will, zb indem ich ein Datum durch eine
Julianische Tageszählung ersetze. An der Stelle des Aufrufs ändert sich
nichts. Der lautet immer noch
1
...
2
for(i=0;i<nrEmployees;++i)
3
checkForBirthDay(&employees[i],&today);
4
...
nur die Funktion die dann den tatsächlichen Vergleich machen soll, muss
an die geänderte Darstellung angepasst werden.
Oder ich erweitere den Namen um einen 2.ten Vornamen. Dann ändert sich
die Struktur und auch die Ausdruckfunktion. Aber der Aufruf sieht nach
wie vor völlig gleich aus. Denn: Die Auswertefunktion bekommt ja einen
Mitarbeiter in seiner vollen Pracht präsentiert - wie immer die auch
aussieht.
>> Lies doch bitte ein C-Buch, bevor Du hier derartiges Viertelwissen>> publizierst.>> Ich hab noch nie ein C-Buch gelesen und auf die Idee werde ich> auch nicht kommen - ich habe in C so gut wie keine Probleme.
Du solltest aber ein Buch lesen.
Dein C würde sich schlagartig verbessern, wenn du über die
Möglichkeiten, die dir dein Werkzeug zur Verfügung stellt, Bescheid
weißt. Und da geht es nicht um Speicherdinge sondern um logische
Konzepte und wie die in C realisiert werden können.
> Damit sind wir bei der nächsten Grundsatzfrage: Array == Pointer?> Nach meiner Definition ist ein Array ein Pointer der auf einen> Speicherbereich zeigt.
Du könntest nicht falscher liegen.
Ein Array ist kein Pointer. Ein Pointer ist kein Array.
> Zeig mir ein array, dass ich nicht mit einer struct nachbilden kann.
Karl Heinz Buchegger schrieb:> Du solltest aber ein Buch lesen.> Dein C würde sich schlagartig verbessern, wenn du über die> Möglichkeiten, die dir dein Werkzeug zur Verfügung stellt, Bescheid> weißt. Und da geht es nicht um Speicherdinge sondern um logische> Konzepte und wie die in C realisiert werden können.
Das sind eher rein programmiertechnische Konzepte, welche man lernen
muss. Ich habe ein C++ und ein C# Buch gelesen. Das c++ Buch müsste
ähnlich wie ein C-Buch sein.
Ich denke, wer Pointer in C verstanden hat wird auch mit dem Rest keine
Probleme haben.
Darf der Compiler nun Strukturen umsortieren oder nicht? Ich möchte von
Assembler auf eine Struktur in C zugreifen, wenn der Compiler anfängt zu
sortieren, könnte ich jedes mögliche Byte bekommen.
Nein, darf er nicht.
Die Reihenfolge bleibt.
Aber er darf zwischen die einzelnen Member Padding Bytes einfügen um zb
Alignment Restriktionen der CPU zu erfüllen und so Zugriffe überhaupt
erst zu ermöglichen bzw. zu beschleunigen.