Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Variable Arrays (mal wieder) (https://www.delphipraxis.net/8448-variable-arrays-mal-wieder.html)

Golem 4. Sep 2003 19:03


Variable Arrays (mal wieder)
 
Hallo

Ich schreibe zu Demonstrationszwecken ein ein kleines Programm in dem ich den Schülern gerne (noch) Pointer vorenthalten würde.

Mit einem variablen Array komme ich nicht so recht weiter.

Zwar kann ich mit SetLength(Arrayname, x) eine Größe festsetzen nur leider kommen zur Laufzeit (rekursiv!) neue Elemente hinzu. Ein SetLength(Arrayname, x+1) löscht leider alle schon vorhandenen Einträge was auch sinn macht, ist schließlich eine neue "Deklaration".

Das umkopieren mit

ArraynameB := Copy(Arrayname);
Setlength(Arrayname, x+1);
Arrayname := Copy(ArraynameB)

ist leider Performancemäßig unter aller .... :spin:

Hat jemand einen Tip oder komme ich um Pointer nicht herrum?

Danke
Golem

PS: Sorry wenn dieses Thema schon mal da war. Habe zwar einige Threads zu dyn Array gefunden aber nichts was recht zu meinem Problem passt.

MSCH 4. Sep 2003 19:11

Re: Variable Arrays (mal wieder)
 
Zitat:

Zitat von Golem
Zwar kann ich mit SetLength(Arrayname, x) eine Größe festsetzen nur leider kommen zur Laufzeit (rekursiv!) neue Elemente hinzu. Ein SetLength(Arrayname, x+1) löscht leider alle schon vorhandenen Einträge was auch sinn macht, ist schließlich eine neue "Deklaration".

was leider falsch ist. SetLength(Array,x+1) vergrößert das Array und löscht keine vorhandenen Einträge, lediglich beim Verkleinern verschwinden logischerweise die Einträge am Ende.

Der Vorteil von DynArrays ist ja, zur Laufzeit die Arraygröße festzulegen und sich nicht von vorherein auf eine feste Größe zu beschränken. Übrigens ist ein DynArray ein nettes Beispiel, wie Delphi die Zeiger "verschwinden" lässt, da ein DynArray rein aus Zeigern besteht.
grez
msch

Golem 4. Sep 2003 19:27

Re: Variable Arrays (mal wieder)
 
Hi

.was leider falsch ist. SetLength(Array,x+1) vergrößert das Array und löscht keine vorhandenen Einträge, lediglich beim Verkleinern verschwinden logischerweise die Einträge am Ende.

Bei mir wird gelöscht. Habe es nochmal ausprobiert. Hier etwas Code:

Delphi-Quellcode:
type
  mlist = record
    von : integer;
    nach : integer;
    schlag : boolean;
  end;

movelist1  : array of mlist;

procedure storemove(mcount : integer; von : integer; nach : integer; schlag : boolean);
begin
  setlength(movelist1, mcount);     //  Dynamisches Array festlegen!
  movelist1[mcount].von    := von;
  movelist1[mcount].nach   := nach;
  movelist1[mcount].schlag := schlag;
end;
Diese Procedure ist wirklich simpel und speichert eine Zug "von" - "nach" wobei mcount in der aufrufenden Procedur um eins erhöht wird.

Gebe ich nach einem Durchlauf alle Züge "von nach" aus sind alle von "0" nach "0" ausser dem zuletzt erzeugten.

Mache ich irgendetwas grundlegend falsch?

Danke nochmal und Bye
Golem

[edit=Daniel B]Delphi-Tags eingefügt. Mfg, Daniel B[/edit]

Ducky_2 4. Sep 2003 19:45

Re: Variable Arrays (mal wieder)
 
Hallo erst mal,

also bei Dynamischen Arrays hab ich es nicht das bei
SetLenght(Name,x+1) die vorhandenen Daten gelöscht werden.
Vieleicht solltest du dein SetLenght vor Procedureaufruf einmalig setzen, um einen zähler mehr als beim ersten aufruf der proceure benötigt wird.

Gruß Jörg

Golem 4. Sep 2003 19:49

Re: Variable Arrays (mal wieder)
 
Hallo

Erstmal Danke allen, aber der Fehler lag doch bei mir.


Hier ist das Problem:
Delphi-Quellcode:
procedure storemove(mcount : integer; von : integer; nach : integer; schlag : boolean);
begin
  setlength(movelist1, mcount);     //  Dynamisches Array festlegen!
  movelist1[mcount-1].von    := von;
  movelist1[mcount-1].nach   := nach;
  movelist1[mcount-1].schlag := schlag;
end;
Es muß logischerweise mcount-1 heißen da ein Setlength[movelist1,1] ein Element mit dem Indize 0 erzeugt. Anfängerfehler! :(

Thx again
Golem


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:22 Uhr.

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