Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi setlength bei dynamischen array (https://www.delphipraxis.net/25823-setlength-bei-dynamischen-array.html)

Scottsman 13. Jul 2004 09:11


setlength bei dynamischen array
 
Ich hab ein problem dass mein dynamisches array jedesmal wenn ich die länge mit setlength erhöhe, komplett überschrieben wird, das heisst alle die einträge die ich gemacht habe werden alle gelöscht und nur der neue eintrag bleibt bestehen!!

hoffentlich versteht einer was ich zu erklären versuche, und hoffentlich weiss einer was ich machen kann!ü! :D

choose 13. Jul 2004 09:15

Re: setlength bei dynamischen array
 
Hallo Scottsman,

der OH ist folgendes zu entnehmen:
Zitat:

Zitat von OH
Bei einer langen String- oder einer dynamischen Array-Variable weist SetLength dem mit S referenzierten String oder Array die angegebene Länge zu. Dabei bleiben die Zeichen im String oder die Elemente im Array erhalten, jedoch ist der Inhalt des neu zugewiesenen Speicherbereichs nicht definiert.

Demzufolge, kann ich Dein Problem nicht ganz nachvollziehen. Könntest Du das etwas genauer aussführen?

Mario 13. Jul 2004 09:21

Re: setlength bei dynamischen array
 
Kannst Du ein Beispiel zeigen, wo Dein Problem auftritt? In entsinne mich auch nicht an solche Effekte.

Scottsman 13. Jul 2004 09:22

Re: setlength bei dynamischen array
 
ich habe ein dynamisches array, und jedesmal wenn ich eine zeile ins array einfügen will, erhöhe ich mit setlength die länge des arrays um einen wert: "setlength(<array>,i+1)" i ist eine variable mit der ich die zeilen zähle

So dann habe ich das problem: ich erhöhe die länge, und wenn ich dann schon etwas im array hatte, löscht er die ersten zeilen, und schreibt nur etwas in die letzte.
so sieht der array dann aus
array mit länge 1: <array>('<wert1>')
array mit länge 2: <array>('','<wert2>')

diese information habe ich aus der Watch List!

choose 13. Jul 2004 09:29

Re: setlength bei dynamischen array
 
Hallo Scottsman,

vielleicht hilft das?
Delphi-Quellcode:
procedure AddItem(var AnArray: TMyTypeArray; const AnItem: TMyType);
var
  iLast : Integer;
begin
  iLast := Length(AnArray);
  SetLength(AnArray, Succ(iLast));
  AnArray[iLast] := AnItem;
end;

Mario 13. Jul 2004 09:31

Re: setlength bei dynamischen array
 
Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type tIntArray = array of Integer;

var intArray: tIntArray;
    i: Integer;

begin

  SetLength(intArray, 1);
  IntArray[0] := 13;

  for i := 0 to High(intArray) do Writeln(intArray[i]);

  Writeln;

  SetLength(intArray, 2);
  IntArray[1] := 16;

  for i := 0 to High(intArray) do Writeln(intArray[i]);

  Writeln;

  Readln;


end.
Bildschirmausgabe:
Zitat:

13

13
16
Ich kann den Effekt also nicht nachvollziehen.

Scottsman 13. Jul 2004 09:37

Re: setlength bei dynamischen array
 
Hier ist mal mein code!!konnte noch nicht richtig etwas mit den antworten anfangen!!!

Delphi-Quellcode:
while not eof(ffinished) do
     begin
        readln(ffinished,temp);
        if temp = 'M-GET CONFIRMATION (' then
          begin
             for m := 0 to 1 do readln(ffinished,temp);
             mget_conf := mget_conf + 2;
             extr_line(temp,ar_words,j);
             if (ar_words[0] = 'MANAGED') and (ar_words[1] = 'OBJECT') and
                (ar_words[2] = 'CLASS') then
               begin
                 setlength(a_mget_conf,i+1);
                 a_mget_conf[i] := inttostr(mget_conf) + ';' + ar_words[3];
                 inc(i);
               end
             else
               begin
                 readln(ffinished,temp);
                 inc(mget_conf);
                 extr_line(temp,ar_words,j);
                 if (ar_words[0] = 'MANAGED') and (ar_words[1] = 'OBJECT') and
                    (ar_words[2] = 'CLASS') then
                   begin
                      setlength(a_mget_conf,i+1);
                      a_mget_conf[i] := inttostr(mget_conf) + ';' + ar_words[3];
                      inc(i);
                   end; {if 3}
               end; {else}
          end; {if 1}
          inc(mget_conf);
     end; {while}
[edit=sakura] [code] :arrow: [delphi] Mfg, sakura[/edit]

choose 13. Jul 2004 09:44

Re: setlength bei dynamischen array
 
Wenn Du ohnehin ausschließlich mit Strings arbeitest, warum verwendest Du nicht TStringList oä?

Scottsman 13. Jul 2004 09:47

Re: setlength bei dynamischen array
 
danke für den hinweis!!

ich habe TStringlist nicht benutzt da ich diesen type nicht kenne!!

ich weis überhaupt nicht was es sonst noch alles von modulen in delphi gibt!!in der schule haben wir nur 100 verschiedene zeichenprogramme gemacht und da ist nun eben mal nix mit strings!! :D

Mario 13. Jul 2004 09:48

Re: setlength bei dynamischen array
 
Der Code den Du gezeigt hast, ist OK. Bist Du Dir sicher dass nicht noch Zugriffe aus anderen Bereichen erfolgen?

Trotzdem schliesse ich mich meinem Vorredner an, eine StringList dürfte die bessere Wahl sein. Zudem ist das ständige erhöhen mit SetLength nicht umproblematisch, da es ein Speicherfresser ist. Besser, SetLength in größeren Dosen einsetzen (hat aber mit Deinem Problem nichts zu tun).

Alfons_G 13. Jul 2004 09:53

Re: setlength bei dynamischen array
 
Ich kann den Effekt auch nicht nachvollziehen :gruebel: und ich verwende viele dynamische Arrays - auch mehrdimensional und array of TObject usw. - da gab es nie Probleme. Die einzige Fehlerquelle, die mir einfällt, wäre, dass MEHRERE Arrays erwendet werden, die überlaufen. Dann könnten die Werte eines Arrays das dahinter liegende überschreiben.

:coder:

Scottsman 13. Jul 2004 10:01

Re: setlength bei dynamischen array
 
jetzt bekomme ich eine access-violation, wenn ich etwas in die TStringlist einfügen will!! :(

Code:
var a_mget_conf : TStringList;


a_mget_conf.Append(inttostr(mget_conf) + ';' + ar_words[3]);

Mario 13. Jul 2004 10:08

Re: setlength bei dynamischen array
 
Delphi-Quellcode:
astringList := TStringlist.Create;
aStringList.Add('First');
...
aStringList.Free;

Scottsman 13. Jul 2004 10:11

Re: setlength bei dynamischen array
 
ach sooo!!!
die klasse muss man noch zuerst erstellen!!!

Steve 13. Jul 2004 10:24

Re: setlength bei dynamischen array
 
Zitat:

Zitat von Scottsman
die klasse muss man noch zuerst erstellen!!!

[ot]Man muss ein Objekt bzw. eine Instanz der Klasse erstellen, nicht die Klasse selbst :zwinker: [/ot]

Gruß
Stephan

Scottsman 13. Jul 2004 10:39

Re: setlength bei dynamischen array
 
jaja!!! ;-) hab das ja gemeint ;-)









Gruss
Alain


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