Autor Beitrag
Horschdware
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 744
Erhaltene Danke: 54

Win XP Pro, Win 7 Pro x64
Delphi 7, Delphi XE, C++ Builder 5, SAP R/3
BeitragVerfasst: 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:

ausblenden Quelltext
1:
2:
3:
4:
  1  2
1 [] []
2 [] []
3 [] []


Meiner Meinung nach so:

ausblenden Quelltext
1:
2:
3:
  1  2  3
1 [] [] []
2 [] [] []


Begründung:

Ein eindimensionales Array [1..3] stelle ich so dar:

ausblenden Quelltext
1:
2:
1  2  3
[] [] []


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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1021

Win 7, MacOS
Delphi x, VBA, PHP, ...
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.Button1Click(Sender: TObject);
var
  szArray: array [1..21..3of 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
szArray: array [1..21..3of 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:
ausblenden 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: 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.. :oops:

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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 531

WinXP
D5 Ent
BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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



BeitragVerfasst: Sa 19.06.04 14:10 
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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



BeitragVerfasst: 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 :P)
UC-Chewie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 531

WinXP
D5 Ent
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
szArray: array [1..21..3of 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 531

WinXP
D5 Ent
BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 531

WinXP
D5 Ent
BeitragVerfasst: 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