Forum: Compiler & IDEs struct sind eine art Arry oder hab ich das falsch verstanden?


von Is mir i-wie peinlich (Gast)


Lesenswert?

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
void Name[0]() {
2
    Programm;
3
}
auf
1
void Name[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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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)

von Ballermann (Gast)


Lesenswert?

Schau mal nach "verkettete Listen".
Das ist in meinen Augen der Softeinstieg...

von xXx (Gast)


Lesenswert?

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.

von Ballermann (Gast)


Lesenswert?

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...

von xXx (Gast)


Lesenswert?

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.

von Ballermann (Gast)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von UR Schmitt (Gast)


Lesenswert?

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

von Ballermann (Gast)


Lesenswert?

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

von Cyblord -. (cyblord)


Lesenswert?

Würde auch erstmal ordentliche Grundlagen in einem C Buch lesen.
Hier z.B. Online und Kostenlos:

http://openbook.galileocomputing.de/c_von_a_bis_z/

gruß cyblord

von Is mir i-wie peinlich (Gast)


Lesenswert?

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.

von Matthias L. (Gast)


Lesenswert?

>Software entwickeln ist nicht wie Doktorarbeiten in den
>Rechtswissenschaften verfassen. Das wird nix mit einfach
>zusammenkopieren, weder mit noch ohne Quellenangaben.

;-)

von Martin (Gast)


Lesenswert?

xXx schrieb:
> Das hier ist ein Mikrocontroller-Forum. Da sind verkettete Listen mit
> 99.9%-iger Wahrscheinlichkeit der falsche Ansatz.

Wie kommst du darauf?

von Rolf Magnus (Gast)


Lesenswert?

Vermutlich denkt er an AVRs mit 64 Byte RAM und dynamisch allokierte 
Listenelemente.

von Is mir i-wie peinlich (Gast)


Lesenswert?

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.

von Matthias L. (Gast)


Lesenswert?

>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...

von M. K. (kichi)


Lesenswert?

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.

von Is mir i-wie peinlich (Gast)


Lesenswert?

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?

von Klaus W. (mfgkw)


Lesenswert?

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...

von DirkB (Gast)


Lesenswert?

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
1
int* p, i;
ist nur p ein Zeiger. i ist ein int.

von Rolf Magnus (Gast)


Lesenswert?

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.

von Is mir i-wie peinlich (Gast)


Lesenswert?

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 ...

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von SNR (Gast)


Lesenswert?

> ...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!

von Volkmar D. (volkmar)


Lesenswert?

struct2 ist eine Variable vom Typ menustruktur.
struct1 ist ein Zeiger auf eine Variable vom Typ menustruktur.

von Sam .. (sam1994)


Lesenswert?

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.
1
struct
2
{
3
    unsigned char a,b,c;
4
}abc;
5
6
int main(int argc, char *argv[])
7
{
8
  unsigned char *array = &abc;
9
  
10
  abc.a = 3;
11
  abc.b = 5;
12
  abc.c = 6;
13
  
14
  unsigned char i;
15
  for(i = 0; i < 3; i++)
16
    printf("%d,", *array++);
17
    
18
  system("PAUSE");  
19
  return 0;
20
}

struct* = array

von chris (Gast)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Sam .. (sam1994)


Lesenswert?

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
    unsigned char a;
4
    unsigned short b;
5
}abc;
6
7
int main(int argc, char *argv[])
8
{
9
  unsigned char array[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
  return 0;
15
}
Man muss nur darauf achten, dass Words nur an "geraden" Speicherplatz 
plaziert werden.

von Martin (Gast)


Lesenswert?

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.

: Wiederhergestellt durch Moderator
von Sam .. (sam1994)


Lesenswert?

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.

von Martin (Gast)


Lesenswert?

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.

: Wiederhergestellt durch Moderator
von Sam .. (sam1994)


Lesenswert?

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.

von Stefan E. (sternst)


Lesenswert?

Samuel K. 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.

von Sam .. (sam1994)


Lesenswert?

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.

von Martin (Gast)


Lesenswert?

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".

von Stefan E. (sternst)


Lesenswert?

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.

von Sam .. (sam1994)


Lesenswert?

Ok - in dem Punkt habt ihr recht. Aber das beweist noch lange nicht dass 
das nicht auch für eine struct gleichen Typs gilt.

von Volkmar D. (volkmar)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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
struct Employee
2
{
3
  int  Id;
4
  char FirstName[30];
5
  char LastName[30];
6
  int  BirthDay;
7
  int  BirthMonth;
8
  int  BirthYear;
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
struct Date
2
{
3
  int Day;
4
  int Month;
5
  int Year;
6
};

Mit dieser neuen Struktur kann man dann die Personalbeschreibung kürzer 
formuieren
1
struct Employee
2
{
3
  int  Id;
4
  char FirstName[30];
5
  char LastName[30];
6
  struct Date DateOfBirth;
7
  struct Date DateOfEntry;
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
struct Employee Bob;

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
void printDate( struct Date date )
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:
1
void checkForBirthDay( struct Employee* employee, struct Date* today )
2
{
3
  if( isDateEqual( employee->DateOfBirth, today ) )
4
    printf( "%s %s\n", employee->FirstName, employee->LastName );
5
}
6
7
uint8_t isDateEqual( struct Date* lhs, struct Date* rhs )
8
{
9
  if( lhs->Day != rhs->Day )
10
    return FALSE;
11
12
  if( lhs->Month != rhs->Month )
13
    return FALSE;
14
15
  return TRUE;
16
}

und habe ich ein Array von 500 Mitarbeitern (das mit Daten gefüllt ist)
1
struct Employee employees[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
  struct Date today;
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.
1
  int* myArray;
2
  int  n, i;
3
4
  printf( "Arraysize " );
5
  scanf( "%d", n );
6
  myArray = malloc( n * sizeof( int ) );
7
8
  for( i = 0; i < n; ++i )
9
    myArray[i] = i;

(OK. Geb ich zu. Ist ein bischen geschummelt)

von (unknown) (Gast)


Lesenswert?

Wer wird denn hier sachlich werden?

von Sam .. (sam1994)


Lesenswert?

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.

von Sam .. (sam1994)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.