Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Low() / High() bei mehrdimensionalen Arrays


Arne - Mo 17.11.08 09:27
Titel: Low() / High() bei mehrdimensionalen Arrays
Moin zusammen,

die Suche hat nix erbracht und die online-Hilfe von D2007 hält sich zu dem Thema bedeckt:

Wie kann ich bei einem mehrdimesionalen Array die Funktionen Low() und High() auf die einzelnen Dimensionen anwenden? Wie sage ich den o.g. Funktionen von welcher Dimension ich gerne die Grenzen haben möchte?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var
  myIndexX, myIndexY : Integer;
  myArray            : array[0..30..15of Byte;
begin
  for myIndexX := Low(myArray) to High(myArray) do begin
    for myIndexY := Low(myArray) to High(myArray) do begin
    ...
    end;
  end;
end;

Wie lasse ich also myIndexX von 0..3 laufen und myIndexY von 0..15? oder geht das mit Low() / High() gar nicht?

thanx, Arne


ene - Mo 17.11.08 09:33

Müsste doch eigentlich so gehen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var
  myIndexX, myIndexY : Integer;
  myArray            : array[0..30..15of Byte;
begin
  for myIndexX := Low(myArray) to High(myArray) do begin
    for myIndexY := Low(myArray[myIndexX]) to High(myArray[myIndexX]) do begin
    ...
    end;
  end;
end;


BenBE - Mo 17.11.08 14:31

Low \ High arbeiten immer auf dem äußerten Array was ihnen übergeben wird. Somit liefert High(Arr) die Größe des äußerten Arrays, High(Arr[0]) die Anzahl der Arrayelemente des Arrays vom 0. Eintrag in Arr und so weiter.

WENN man rechteckige Arrays hat UND jede Ebene immer gleich viele Einträge hat, kann man statt MyIndex auch 0 übergeben, was etwas mehr Performance liefert. Ansonsten ist die Lösung von user profile iconene die allgemeingültige.


matze - Mo 17.11.08 18:16

user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
WENN man rechteckige Arrays.

Mal so am Rande: Was sind denn bitte rechteckige Arrays?


Xentar - Mo 17.11.08 18:38

Ich denke, er meint zweidimensionale, weil die halt "aussehen", wie ein Rechteck.


BenBE - Mo 17.11.08 18:45

user profile iconmatze hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
WENN man rechteckige Arrays.

Mal so am Rande: Was sind denn bitte rechteckige Arrays?


Darf ich ich mit einem Nicht-Rechteckigen Array antworten?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var nonrectangular_array: array of array of Foo; bar: Integer;
const baz = 42;
begin
    SetLength(nonrectangular_array, Baz);
    for Bar := 0 to Baz - 1 do
        SetLength(nonrectangular_array[Bar], Bar + 1);
end;


Yogu - Mo 17.11.08 19:27

user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
WENN man rechteckige Arrays hat UND jede Ebene immer gleich viele Einträge hat

Wenn ich das mit rechteckigen Arras jetzt richtig verstanden habe, sind die beiden Bedingungen doch immer gleich - ein rechteckiges Array hat doch immer in jeder Ebene gleich viele Einträge. :gruebel:


Tilo - Mo 17.11.08 20:07

Der Vorteil von "rechteckigen" Arrays ist das man einmalig low(Array) und high(Array) Variablen zu ordnen kann und dan diese verwenden kann.


Wolle92 - Mo 17.11.08 22:31

Ihr meint quadratisch, nicht rechteckig...


Delphi-Quelltext
1:
2:
var only_rectangular_array: array [1..10of array [1..18of Integer;
var quadratic_array: array [1..10of array [1..10of Integer;

Und wenn das zweite der Fall ist, dann kann man halt nur einmal High(quadratic_array); speichern und damit dann alle ebenen durchgehen...

Rechteck ist vieles...
Quadrat beschränkt sich da schon ziemlich...


BenBE - Mo 17.11.08 22:34

user profile iconWolle92 hat folgendes geschrieben Zum zitierten Posting springen:
Ihr meint quadratisch, nicht rechteckig...


Delphi-Quelltext
1:
2:
var only_rectangular_array: array [1..10of array [1..18of Integer;
var quadratic_array: array [1..10of array [1..10of Integer;

Und wenn das zweite der Fall ist, dann kann man halt nur einmal High(quadratic_array); speichern und damit dann alle ebenen durchgehen...

Ich meine nicht-rechteckig ;-) Um genau zu sein, war mein Array dreieckig ;-)

user profile iconWolle92 hat folgendes geschrieben Zum zitierten Posting springen:
Rechteck ist vieles...
Quadrat beschränkt sich da schon ziemlich...

Und nicht-rechteckig noch viel mehr ...


ene - Di 18.11.08 08:18

Weil Worte..


alzaimar - Di 18.11.08 08:30

Oder, vom Bauchgefühl her:
Ritter-Sport = Quadratisch
Alpia = Rechteckig
Von ein paar Duplo abgebissen und übereinandergelegt = Nichtgeometrisch
Von ein paar Duplo abgebissen, der Länge nach sortiert und übereinandergelegt = Rautenförmig

usw.


matze - Di 18.11.08 10:06

user profile iconalzaimar hat folgendes geschrieben Zum zitierten Posting springen:
Oder, vom Bauchgefühl her:
Ritter-Sport = Quadratisch
Alpia = Rechteckig
Von ein paar Duplo abgebissen und übereinandergelegt = Nichtgeometrisch
Von ein paar Duplo abgebissen, der Länge nach sortiert und übereinandergelegt = Rautenförmig

Ich finde diesen Vergleich wunderbar. Damit habe auch ich es verstanden! Ich hätte mir nur etwas kalorienärmeres gewünscht!


ene - Di 18.11.08 10:32

Rechteckig ist Knäckebrot, Quadratisch ist der Kraftklotz (heißt bei uns so).
Nichtgeometrisch sind dann angebissene Knäckebrote...nur fürs Dosenbrot fehlt mir der Verlgeich.


Tilo - Di 18.11.08 14:40

user profile iconene hat folgendes geschrieben Zum zitierten Posting springen:
Rechteckig ist Knäckebrot, Quadratisch ist der Kraftklotz (heißt bei uns so).
Nichtgeometrisch sind dann angebissene Knäckebrote...nur fürs Dosenbrot fehlt mir der Verlgeich.



Vorschlag: Dosenbrot=ein in einer Datenstruktur gekapseltes Array. (z.B. Tlist)


Arne - Mi 19.11.08 07:41

user profile iconene hat folgendes geschrieben Zum zitierten Posting springen:
Müsste doch eigentlich so gehen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var
  myIndexX, myIndexY : Integer;
  myArray            : array[0..30..15of Byte;
begin
  for myIndexX := Low(myArray) to High(myArray) do begin
    for myIndexY := Low(myArray[myIndexX]) to High(myArray[myIndexX]) do begin
    ...
    end;
  end;
end;


Danke, genau so gehts auch. Schade, dass sowas nicht in der Onlinehilfe steht.


Wolle92 - Mi 19.11.08 17:01

weils in der Onlinehilfe nicht alles gibt...

Und sowas ist halt etwas, was man sich selbst ausdenken muss, wenn alles in Bausteinen in der Onlinehilfe stünde, dann müssten Programmierer ja nichts mehr selbst machen...