AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Variable Arrays (mal wieder)

Ein Thema von Golem · begonnen am 4. Sep 2003 · letzter Beitrag vom 4. Sep 2003
Antwort Antwort
Golem

Registriert seit: 4. Sep 2003
3 Beiträge
 
#1

Variable Arrays (mal wieder)

  Alt 4. Sep 2003, 19:03
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 ....

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.
  Mit Zitat antworten Zitat
MSCH

Registriert seit: 8. Mai 2003
Ort: Berlin
42 Beiträge
 
Delphi 6 Enterprise
 
#2

Re: Variable Arrays (mal wieder)

  Alt 4. Sep 2003, 19:11
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
  Mit Zitat antworten Zitat
Golem

Registriert seit: 4. Sep 2003
3 Beiträge
 
#3

Re: Variable Arrays (mal wieder)

  Alt 4. Sep 2003, 19:27
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]
  Mit Zitat antworten Zitat
Ducky_2

Registriert seit: 1. Sep 2003
Ort: Deutschland
11 Beiträge
 
#4

Re: Variable Arrays (mal wieder)

  Alt 4. Sep 2003, 19:45
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
alles was schief gehen kann wird zwangsläufig schief gehen !!!
  Mit Zitat antworten Zitat
Golem

Registriert seit: 4. Sep 2003
3 Beiträge
 
#5

Re: Variable Arrays (mal wieder)

  Alt 4. Sep 2003, 19:49
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:54 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