Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Array konstant? (https://www.delphipraxis.net/41175-array-konstant.html)

Skyrunner2 27. Feb 2005 13:52


Array konstant?
 
hallo,
Ich Programiere ein Labyrinth, und hab's momentan wie folgt implimentiert:

Delphi-Quellcode:
const constXSize=10;
      constYSize=10;

Type TMaze=class
        Private
           TargetCanvas:TCanvas;
           MazeMemImg:array[0..constXSize, 0..constYSize] of Record
                                                                N,E,S,W:boolean;
                                                             end;

        Public
           constructor Create(width, height : Integer);

           
        end;
Problem: ConstxSize und constYSize sind KOnstant ;) und ich kann (soweit ich weiß) nicht die constanten ändern wenn ich den typ via constructor initialisiere...


also was ich suche ist eigentlich ein dynamisches array. so wie mann es z.b. auch in TStrings findet. mit [Zeile][Zeichen].

doch wie kann ich ein solches 2 dimensionales, dynamisches array erstellen?

xineohp 27. Feb 2005 14:04

Re: Array konstant?
 
moin,

Dynamische Arrays:

Deklaration:
Delphi-Quellcode:
D2Array: array of array of {beliebiger Typ};
Die Größe wird mit setlength geregelt:
Delphi-Quellcode:
setlength( D2Array, countX, countY );
Zugriff:
Delphi-Quellcode:
x := D2Array[X,Y]; // wobei der Index immer von 0 bis length(D2Array)-1 (=high(D2Array) läuft
und zur Vollständigkeit noch:
man kann auch dynamische Arrays mit unterschiedlicher Zeilenlänge erzeugen. z.B:
Delphi-Quellcode:
setlength( D2Array, 3 ); // drei "Zeilen"
setlength( D2Array[0], 5 ); // die erste Zeile hat 5 Elemente
setlength( D2Array[1], 3 ); // die zweite Zeile hat 3 Elemente
setlength( D2Array[2], 1 ); // die dritte Zeile hat 1 Element

Skyrunner2 27. Feb 2005 14:25

Re: Array konstant?
 
WOW!!!

DANKE für diese wirklich sehr sehr schnelle Antwort.

Hab eine frage zum beispiel:
Delphi-Quellcode:
setlength( D2Array, 3 ); // drei "Zeilen"
setlength( D2Array[0], 5 ); // die erste Zeile hat 5 Elemente
setlength( D2Array[1], 3 ); // die zweite Zeile hat 3 Elemente
setlength( D2Array[2], 1 ); // die dritte Zeile hat 1 Element
wären das nicht 4 "Zeilen" da, [0] bis [3].. ?

und eine weitere frage:

besteht eine funktion welche die größ des arrays ausgiebt? (wie ubound(Array) & lbound(Array) in VBS(Upper bzw Lower bound))
also Groesse( setlength(array, 5) ) -> 5

malo 27. Feb 2005 14:29

Re: Array konstant?
 
1. Nein. Es wird schon angegeben, wieviele Zeilen es insgesamt gibt. Gezählt wird trotzdem von 0 an. Also 0-2 = 3 Zeilen ;)

2. Schau mal unter Delphi-Referenz durchsuchenhigh, Delphi-Referenz durchsuchenlow und Delphi-Referenz durchsuchenlength :zwinker:

Die Gesamtgröße ist Length ;)

High und Low geben die Entfernungen zur 0 an (wenn man ein Array [-5] hat z.B. is low = 5)

Flogo 27. Feb 2005 14:34

Re: Array konstant?
 
Zitat:

Zitat von Skyrunner2
wären das nicht 4 "Zeilen" da, [0] bis [3].. ?

nein weil die Länge des Arrays auf 3 gesetzt wird, d.h. es geht dann von 0 bis 2
Zitat:

Zitat von Skyrunner2
und eine weitere frage:

besteht eine funktion welche die größ des arrays ausgiebt? (wie ubound(Array) & lbound(Array) in VBS(Upper bzw Lower bound))
also Groesse( setlength(array, 5) ) -> 5

Das erledigt Length bzw. High und Low:

Delphi-Quellcode:
var Arr: array[0..2, 1..5] of Integer;

[...]
 
  Length(Arr)   -> 3
  High(Arr)     -> 2
  Low(Arr)      -> 0

  Length(Arr[0]) -> 5
  Length(Arr[1]) -> 5
  High(Arr[0])  -> 5
  Low(Arr[0])   -> 1


[Edit]
Zu langsam!! hätte ich nicht eigentlich von der DP darauf aufmerksam gemacht werden sollen?
[/Edit]

xineohp 27. Feb 2005 14:35

Re: Array konstant?
 
mit setlength() legst du die Anzahl der Elemente fest; und mit length() fragst du sie wieder ab: d.h. das Array läuft immer von 0 bis length()-1. wobei du statt length()-1 auch high() verwenden kannst.

Skyrunner2 27. Feb 2005 14:49

Re: Array konstant?
 
wow echt super! sind ja wirklich viel leute die helfen! DANKE DANKE DANKE!

Ich habe allerdings ein problem mit setlenght():

---------------------------
Mazebacktracker
---------------------------
Access violation at address 00404A49 in module 'MazeBacktracker.exe'. Read of address 6D726F42.
---------------------------
OK
---------------------------

:shock:

Delphi-Quellcode:
unit MazeClass;

interface

uses Graphics;

Type TMaze=class
        Private
           TargetCanvas:TCanvas;
           MazeMemImg: array of array of Record
                                                    N,E,S,W:boolean;
                                                 end;

        Public
           constructor Create;
        end;


implementation


constructor TMaze.Create;
begin
    setlength(MazeMemImg,10,10);
end;

end.
und:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var test:TMaze;

begin
test.Create();
end;
ich bekomme die oben stehende fehler meldung wenn die prozedure button1click aufgerufen wird.
was habe ich falsch gemacht? :gruebel:

xineohp 27. Feb 2005 15:05

Re: Array konstant?
 
Zitat:

test.Create();
ist falsch ... einer der leidigen Fehler die einem öftermal passieren und die man erst als letztes findet :mrgreen:
es müsste lauten:
Delphi-Quellcode:
test := tMaze.Create()

Skyrunner2 27. Feb 2005 15:08

Re: Array konstant?
 
ahh danke!


ist das erstem mal das ich mit mit klassen beschäftige, und selber eine schribe..

freu mich schon über was auch mich zukommen wird (an fehler meldungen) :P


Nochaml ein SUPER GROßES DANKE!!!! :dp:


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:12 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