Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   länge eines 2-Dimensionalen und Dynamischen Array (https://www.delphipraxis.net/135754-laenge-eines-2-dimensionalen-und-dynamischen-array.html)

Teekeks 17. Jun 2009 09:34


länge eines 2-Dimensionalen und Dynamischen Array
 
Hallo!
Kann mir jemand sagen wie ich bei einem 2-Dimensionalen und Dynamischen Array die längen feststellen kann?

gruß Teekeks

Hybrid666 17. Jun 2009 09:40

Re: länge eines 2-Dimensionalen und Dynamischen Array
 
wie sieht denn der array aus?

also wenn so:

Delphi-Quellcode:
var
  myArray : array of array of Integer;
dann so:

Delphi-Quellcode:
  Length (myArray);
  Length (myArray[0]);
also damit bekommste afaik die länge in x und y richtung (wenn mich nicht alles täuscht).

Wenn du Length mit High ersetzt, bekommst du jeweils den höchsten index.

MfG

Teekeks 17. Jun 2009 09:50

Re: länge eines 2-Dimensionalen und Dynamischen Array
 
und wie spreche ich das dann konkret an? also auch so:
Delphi-Quellcode:
thearray[x,y]:={irgentwas};
oder wie?

Hybrid666 17. Jun 2009 09:55

Re: länge eines 2-Dimensionalen und Dynamischen Array
 
wenn du mir deine deklaration zeigen würdest könnt ich es dir sagen, meine variante die ich gepostet hab spricht man mit

Delphi-Quellcode:
myArray[x][y] := 12356
an, man muss aber auch für alle arrays über setlength die länge setzen mit:

Delphi-Quellcode:
const
  X = 10;
  Y = 15;
var
  I : Integer;
begin
  SetLength (myArray,X);
  for I := 0 to High (myArray) do
    SetLength (myArray[I],Y);
end;
Das würde den dynamischen array auf 10x15 felder setzen, aber obs andere möglichkeiten gibt, ka...

Teekeks 17. Jun 2009 09:59

Re: länge eines 2-Dimensionalen und Dynamischen Array
 
hi Danke für deine hilfe.
Mein Array sieht genauso aus wie deins (ich hab nur ´n Record als Type dahinter).
Ich hatte in erinnerung das Setlength so geht:
Delphi-Quellcode:
setlength(thearray,x,y);
Aber da hat der Debugger gemeckert.

Hybrid666 17. Jun 2009 10:03

Re: länge eines 2-Dimensionalen und Dynamischen Array
 
Zitat:

For dynamic arrays, SetLength may take more than one length parameter (up to the number of array dimensions). Each parameter specifies the number of elements along a particular dimension.
Delphi-Quellcode:
  SetLength (myArray,10,10);
funzt bei mir mit meinen integer array wunderbar (wieder was gelernt :D).

Haste ma die genaue meldung?

MfG

himitsu 17. Jun 2009 10:03

Re: länge eines 2-Dimensionalen und Dynamischen Array
 
@Hybrid666: deine Variante kann man auch mit myArray[x, y] ansprechen

und eigentlich ging das mit dem SetLength auch so ... ansonten geht auch jede Ebene einzeln (praktisch wie in "dann so:" aus der #2, nur halt mit Set davor)

Teekeks 17. Jun 2009 10:19

Re: länge eines 2-Dimensionalen und Dynamischen Array
 
ich hab gerade festgestellt das die 3 SEHHR hübschen Meldungen die ich gektigt habe mit was anderem zusammenhängen, ich hab einfach das hier gemacht:
Delphi-Quellcode:
dynarray1:=dynarray2;
und das geht ja erfahrungsweise nicht ^^.

Hybrid666 17. Jun 2009 10:24

Re: länge eines 2-Dimensionalen und Dynamischen Array
 
ne, ist eher schlecht das :D

Teekeks 17. Jun 2009 10:32

Re: länge eines 2-Dimensionalen und Dynamischen Array
 
Hm... hier krig ich nem Speicherzugrifsfehler:
Delphi-Quellcode:
procedure TGame.InsertMap(aMap: TMap);
var x:integer;
begin
  _Act_X:=0;
  _Act_Y:=0;
  _Map_X:=Length(aMap);
  _Map_Y:=Length(amap[0]);
  Setlength(_Map,_Map_X+1);
  for x:=0 to _Map_X do
    setlength(_map[x],_Map_Y+1);
  _Map:=copy(aMap);// hier krig ich den Fehler...
end;

// so wird aufgerufen:
procedure TForm1.Button1Click(Sender: TObject);
var amap:TMap;
    x,y:integer;
    afield:TField;
begin
  SetLength(amap,31);
  for x:=0 to 30 do
    Setlength(amap[x],31);
  afield.Field:='w';
  afield.Player:='0';
  for x:=0 to 30 do
    for y:=0 to 30 do
      amap[x][y]:=afield;
  amap[1][3].Field:='#';
  Map.InsertMap(amap);
  Map.SaveMap('test2');

end;

// TMap ist so deklariert:
  TField=   record
      Field:char;
      Player:char;
    end;

  TMap= array of array of TField;
wisst ihr woran das liegen mag?

Medium 17. Jun 2009 14:52

Re: länge eines 2-Dimensionalen und Dynamischen Array
 
Klassischer Off-By-One Fehler. Length() gibt die Länge des Arrays zurück, was bei 0-basierten Arrays um 1 über dem höchsten Index liegt. Du greifst also knapp dahinter => AV. Nutze High() oder Length()-1.

Muetze1 17. Jun 2009 15:08

Re: länge eines 2-Dimensionalen und Dynamischen Array
 
Und nochwas: Copy() liefert dir eine komplette Kopie zurück, somit kannst du dir das SetLength() auf dem Zielarray komplett sparen, wird dann bei der Zuweisung der Kopie danach eh komplett wieder abgeräumt...

Teekeks 17. Jun 2009 16:09

Re: länge eines 2-Dimensionalen und Dynamischen Array
 
Das hier geht leider auch nicht:
Delphi-Quellcode:
procedure TGame.InsertMap(aMap: TMap);
var x,y:integer;
begin
  _Act_X:=0;
  _Act_Y:=0;
  _Map_X:=High(aMap);
  _Map_Y:=High(amap[0]);
  _Map:=Copy(aMap);// hier bleibt er stecken...
end;
Fehlermeldung:
"Project raised exception class 'RunError(204)'."
Wisst ihr was ich jetzt falschmache?


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:24 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz