| Autor |
Beitrag |
Horschdware
      
Beiträge: 744
Erhaltene Danke: 54
Win XP Pro, Win 7 Pro x64
Delphi 7, Delphi XE, C++ Builder 5, SAP R/3
|
Verfasst: Fr 18.06.04 17:23
Sers,
gestern hatte ich mit meinem Info-Lehrer eine kleine Diskussion über den Aufbau bzw, die Ausrichtung eines mehrdimensionalen (, rechteckigen) Arrays.
Seine Aussage ist dass zuerst die Zeile, dann die Spalte angegeben wird.
Ein Array [1..3,1..2] würde seiner Meinnung nach so aussehen:
Quelltext 1: 2: 3: 4:
| 1 2 1 [] [] 2 [] [] 3 [] [] |
Meiner Meinung nach so:
Quelltext 1: 2: 3:
| 1 2 3 1 [] [] [] 2 [] [] [] |
Begründung:
Ein eindimensionales Array [1..3] stelle ich so dar:
Quelltext
und in jeden Speicherplatz stecke ich ein weiteres eindimensionales Array, das dann nach unten gerichtet ist.
Somit kann ich dieses Array genauso wie ein Gitter (zB StringGrid) aufrufen.
Stringgrid.cells[x,y] <-> Array[x,y]
Mein Lehrer meint dass der Compiler das Array von hinten aufbaut.
d.h. bei einem Array array[1..3,1..2] of integer würde erst der Integer gecheckt, dann ein Array [1..2] aufgebaut und in die Zeilen [1..3] des ersten Arrays gesteckt.
Mein Array besteht also aus einem Array [1..3] und 3 Arrays [1..2]
Das meines Lehrers besteht aus einem Array [1..2] und 2 Arrays [1..3]
Irgendwie finde ich beide Auffassungen irgendwo logisch, jedoch besteht bei der Methode meines Lehrers das Problem dass um auf das Array wie ein Stringgrid od ähnliches zugreifen zu können X und Y vertauscht werden müssen.
Stringgrid.cells[x,y] <-> Array[y,x]
Das wäre an sich umständlich.
Kann das mal jemand entwirren? Wie ist es wirklich?
_________________ Delphi: XE - OS: Windows 7 Professional x64
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Fr 18.06.04 18:00
Hallo!
Beides ist richtig. Die Darstellung in tabellarischer Form ist doch nur eine Vorstellung! Und da kann sich jeder aussuchen, was er nun als Zeile und was als Spalte nimmt. In einem Array gibt es einfach nur soviele "Koordinaten" wie das Array Dimensionen hat. Und ob man die erste nun als Zeile oder Spalte bezeichnet, ist völlig willkürlich.
Das es nur eine Vorstellung ist, sieht man spätestens, wenn man versucht, das mit einem 4-dim Array zu machen. Das Array gibt es, mit der Vorstellung hapert es dann doch ein wenig.
Das Argument, dass es dann mit dem StringGrig nicht richtig klappt, ist keines. Erstens wird eine Vorstellung nicht dadurch falsch, weil sie unbequem ist. Zweitens hätte Borland genausogut beim StringGrid cols und rows vertauschen können. An den Arrays hätte das nichts geändert.
MfG
Peter
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
kiwicht
      
Beiträge: 1021
Win 7, MacOS
Delphi x, VBA, PHP, ...
|
Verfasst: Sa 19.06.04 00:00
aber eine Variant ist "richtiger", oder?
Ich empfehle die Eselbrücke:
Erst ran an den Baum, dann kommt man rauf.
Also erst die horizontale, dann senkrecht
Soweit meine Erklärung, ganz un-wissenschaftlich, und so wirds zum Beispiel auch in einem Koordinate-Gitter bei der Orientierung gehandhabt.
ki
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Sa 19.06.04 12:38
Der RAM-Speicher ist ja nur eindimensional, daher ist die Veranschaulichung mit einer Tabelle nicht ganz korrekt. Aber man kann sich ja mal ganz einfach anschaun wie so ein Array im Speicher ausschaut:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TForm1.Button1Click(Sender: TObject); var szArray: array [1..2, 1..3] of Integer; i, j: Integer; begin for i := 1 to 2 do for j := 1 to 3 do Memo1.Lines.Add('szArray[' + IntToStr(i) + ',' + IntToStr(j) + ']: '+ Format('%p', [@szArray[i, j]])); end; |
Dieser Code führt zu folgender Ausgabe:
| Zitat: | szArray[1,1]: 0012F4FC
szArray[1,2]: 0012F500
szArray[1,3]: 0012F504
szArray[2,1]: 0012F508
szArray[2,2]: 0012F50C
szArray[2,3]: 0012F510 |
Und damit sieht man auch in welcher Reihenfolge die Elemente des Arrays im Speicher liegen. Im Endeffekt ist es ja auch egal wie die Elemente im Speicher liegen, da ja der Compiler dafür verantwortlich ist bei einem Zugriff auf ein Element die Speicherposition zu berechnen auf die zugegriffen werden soll. Und das ist ja alles komplett transparent...
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Sa 19.06.04 12:44
| kiwicht hat folgendes geschrieben: | aber eine Variant ist "richtiger", oder?  |
Nein, wieso?
| kiwicht hat folgendes geschrieben: | Ich empfehle die Eselbrücke:
Erst ran an den Baum, dann kommt man rauf.
Also erst die horizontale, dann senkrecht  |
Diese Eselsbrücke empfiehlst Du ja aber nur, weil Du bereits eine bestimmte Vorstellung hast. Das klärt in keinster Weise, welche nun richtig oder falsch.
| kiwicht hat folgendes geschrieben: |
Soweit meine Erklärung, ganz un-wissenschaftlich, und so wirds zum Beispiel auch in einem Koordinate-Gitter bei der Orientierung gehandhabt. |
Bei Matritzen macht man es wiederrum genau anders herum. Bei den Elementen einer Matrix indiziert man erst die Zeile und dann die Spalte.
@Motzi: Die Frage klärt das aber nicht, oder habe ich das jetzt irgendwie verpasst? 
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Sa 19.06.04 12:58
| Peter Lustig hat folgendes geschrieben: | @Motzi: Die Frage klärt das aber nicht, oder habe ich das jetzt irgendwie verpasst?  |
Naja.. so richtig "klären" kann man es ja nicht, da im Prinzip beide Varianten nicht stimmen, da sie nicht in das Speichermodell reinpassen... Der RAM ist nunmal nur "eindimensional".. mehrdimensionale Felder müssen also irgendwie so "simuliert" werden, dass sie trotzdem in den eindimensionalen Speicher passen. Und ich wollte einfach mal zeigen wie das der Compiler macht, also in welcher Reihenfolge er die Felder im Speicher ablegt. Und das schaut bei diesem Array:
Delphi-Quelltext 1:
| szArray: array [1..2, 1..3] of Integer; |
eben so aus:
| Zitat: | szArray[1,1]: 0012F4FC
szArray[1,2]: 0012F500
szArray[1,3]: 0012F504
szArray[2,1]: 0012F508
szArray[2,2]: 0012F50C
szArray[2,3]: 0012F510 |
Und wenn man darauf dann wieder das "zweidimensionale Tabellenmodell" anwendet würde das Ergebnis im Prinzip so ausschauen:
Quelltext 1: 2: 3:
| 1 2 3 1 [1,1] [1,2] [1,3] 2 [2,1] [2,2] [2,3] |
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Sa 19.06.04 13:03
| Motzi hat folgendes geschrieben: |
Und wenn man darauf dann wieder das "zweidimensionale Tabellenmodell" anwendet würde das Ergebnis im Prinzip so ausschauen:
Quelltext 1: 2: 3:
| 1 2 3 1 [1,1] [1,2] [1,3] 2 [2,1] [2,2] [2,3] | |
Warum? Ich habe da nur fortlaufende Zahlen. Ob ich die nun zeilen- oder spaltenweise fortlaufend schreibe, bleibt doch mir überlassen.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Sa 19.06.04 13:10
| Peter Lustig hat folgendes geschrieben: | | Warum? Ich habe da nur fortlaufende Zahlen. Ob ich die nun zeilen- oder spaltenweise fortlaufend schreibe, bleibt doch mir überlassen. |
Stimmt.. das is dann Interpretationssache.. für mich war das in dem Moment einfach das naheliegendste..
Damit wird aber wieder das bestätigt was ich oben geschrieben hab.. keine von beiden Interpretationen stimmt (oder auch beide - je nachdem wie man es sieht), da das ganze auf den eindimensionalen Speicher abgebildet werden muss und es einfach Sache des Compilers ist wie er das umsetzt und die Felder im RAM ablegt...
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Sa 19.06.04 13:13
Gut. Dann sind wir uns ja einig! 
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Sa 19.06.04 13:18
| Peter Lustig hat folgendes geschrieben: | Gut. Dann sind wir uns ja einig!  |
Jap.. absolut..! 
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
UC-Chewie
      
Beiträge: 531
WinXP
D5 Ent
|
Verfasst: Sa 19.06.04 13:41
Wie sieht das in anderen Programmiersprachen aus? Hat sich da auch die zeilenweise Linearisierung, also die von rechts nach links, durchgesetzt, oder gibts auch verbreitete Sprachen, die von links nach rechts rechnen?
_________________ Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Sa 19.06.04 14:04
Ich verstehe nicht ganz, was Du meinst. Es hat sich nichts durchgesetzt. Die Vorstellung ist doch jedem selbst überlassen.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
obbschtkuche
Gast
Erhaltene Danke: 1
|
Verfasst: Sa 19.06.04 14:10
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Sa 19.06.04 14:12
Die sagen da nur nichts über Zeilen und Spalten. Sie sprechen von "Dimensionen".
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
obbschtkuche
Gast
Erhaltene Danke: 1
|
Verfasst: Sa 19.06.04 14:13
Ja, weil in der dritten Dimension nichts mehr mit Zeilen und Spalten ist. (Und spätestens in der 4 oder 5 sowieso nicht mehr  )
|
|
UC-Chewie
      
Beiträge: 531
WinXP
D5 Ent
|
Verfasst: Sa 19.06.04 14:45
Mit zeilen- und spaltenweise meine ich nicht die Vorstellung, sondern die Berechnung. So wird gerechnet (bei 2 Dimensionen):
Sei i1 der gewünschte Index der 1. Dimension, i2 der der 2.
Seien j1, j2 die unteren Grenzen und k1, k2 die oberen Grenzen.
Dann berechnet sich die Adresse einer Array-Komponente wie folgt:
zeilenweise:
Basisoffset + (i1 - j1) * (k2 - j2 + 1) * sizeof(Elementgröße) + (i2 - j2) * sizeof(Elementgröße)
spaltenweise:
Basisoffset + (i2 - j2) * (k1 - j1 + 1) * sizeof(Elementgröße) + (i1 - j1) * sizeof(Elementgröße)
Beispiel:
Delphi-Quelltext 1:
| szArray: array [1..2, 1..3] of Integer; |
Wie berechnen szArray[1,2] (mit dem Offset von weiter oben)
zeilenweise: $0012F4FC + (1 - 1) * (3 - 1 + 1) * 4 + (2 - 1) * 4 = $0012F4FC + 4 = $0012F500 (also 2. Element, s.u.)
spaltenweise: $0012F4FC + (2 - 1) * (2 - 1 + 1) * 4 + (1 - 1) * 4 = $0012F4FC + 8 = $0012F504 (also 3. Element)
Zeilenweise liegt das Array so im Speicher:
[1,1], [1,2], [1,3] [2,1] [2,2] [2,3]
Und spaltenweise so:
[1,1], [2,1], [1,2], [2,2], [1,3] [2,3]
Das ganze lässt sich für belibige Dimensionen fortsetzen.
_________________ Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Sa 19.06.04 14:50
Und wieso ist das eine zeilen- und das andere spaltenweise? Ich kann es doch genausogut umgekehrt benennen. Es gibt in einem Array keine Zeilen oder Spalten. Es gibt nur Dimensionen. Und ob Du die erste oder die zweite Dimension nun Zeile nennst, ist ganz alleine Dir überlassen.
Folglich kann sich auch keines von beidem "durchgesetzt" haben, weil man es willkürlich benennen kann.
| Zitat: | | Ja, weil in der dritten Dimension nichts mehr mit Zeilen und Spalten ist. (Und spätestens in der 4 oder 5 sowieso nicht mehr |
Das ist doch das, was ich in meinem ersten Posting geschrieben habe. Ich dachte, Du wolltesst mit dem Link zeigen, dass die Borlander festgelegt hätten, was man als Zeilen und was als Spalten bezeichnet. So als Konvention.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
UC-Chewie
      
Beiträge: 531
WinXP
D5 Ent
|
Verfasst: Sa 19.06.04 15:23
Hmm, ist eine gute Frage, wieso das so heißt. So hab ichs in meinen Vorlesungen gelernt, werd mich mal umschauen, woher der Name genau kommt.
Ach so: Aber wichtig ist doch nicht die Frage, wie es heißt, sondern die Frage, ob andere Programmiersprachen/Compiler Array-Indizierungen von rechts (was ich als zeilenweise kenn) oder von links betreiben.
_________________ Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Sa 19.06.04 16:23
| Zitat: | | Aber wichtig ist doch nicht die Frage, wie es heißt, |
Wenn man sich das Thema dieses Threads ansieht, dann schon. Und dabei wollen wir ja bleiben!
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
UC-Chewie
      
Beiträge: 531
WinXP
D5 Ent
|
Verfasst: Sa 19.06.04 16:39
Gut, dann mach ich halt einen neuen Thread auf.
_________________ Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
|
|
|