Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Keine dynamischen Arrays vom Typ TStringList möglich? (https://www.delphipraxis.net/91001-keine-dynamischen-arrays-vom-typ-tstringlist-moeglich.html)

Bastler 27. Apr 2007 09:52


Keine dynamischen Arrays vom Typ TStringList möglich?
 
Ich habe folgenden Code:

Delphi-Quellcode:
 
var history:array of array of TStringList;
//...
   for k:=anfang to ende do
      begin
      History[i]:=TStringlist.Create; //1)
      History[i].lines.add:=(Richedit1.Lines.Strings[k]);
      SetLength(History,Length(History+1));
      end;
Aber der Kompiler sagt mir: Inkompatible Typen 'TStringList' und 'dynamic array' (bei 1) )...

Geht es einfach nicht, oder hab ich einfach etwas falsch gemacht, denn eigentlich sollte er doch schon oben bei der Variabeldeklaration n Fehler ausgeben, wenn es generell nicht geht... :gruebel:

Danke im Voraus :thumb:

mkinzler 27. Apr 2007 09:53

Re: Keine dynamischen Arrays vom Typ TStringList möglich?
 
Du hast auch ein 2-dimensionalen dynamischen Array

Tormentor32 27. Apr 2007 09:57

Re: Keine dynamischen Arrays vom Typ TStringList möglich?
 
history[x][y] := TStringlist.Create

wäre hier richtig

edit: Du brauchst dann auch ne doppelte for-schleife
Delphi-Quellcode:
for x := 0 to MaxX do
  for y := 0 to MaxX do

Bastler 27. Apr 2007 14:51

Re: Keine dynamischen Arrays vom Typ TStringList möglich?
 
:wall: :wall: :wall:
Danke, manchmal muss einfach nur wer anders mal einen Blick drauf werfen...

Namenloser 27. Apr 2007 14:55

Re: Keine dynamischen Arrays vom Typ TStringList möglich?
 
im übrigen sind auch sonst noch ein paar fehler drin:

FALSCH:
Delphi-Quellcode:
      History[i].lines.add:=(Richedit1.Lines.Strings[k]);
      SetLength(History,Length(History+1));
RICHTIG:
Delphi-Quellcode:
      History[i].lines.add(Richedit1.Lines.Strings[k]);
      SetLength(History,high(History)+2);

3_of_8 27. Apr 2007 14:59

Re: Keine dynamischen Arrays vom Typ TStringList möglich?
 
Wieso "high(History)+2"?

DGL-luke 27. Apr 2007 15:08

Re: Keine dynamischen Arrays vom Typ TStringList möglich?
 
Die zwei Codestücke sind praktisch identisch. Nur wird die Variante mit "Length" langsamer sein.

alzaimar 27. Apr 2007 15:21

Re: Keine dynamischen Arrays vom Typ TStringList möglich?
 
Zitat:

Zitat von DGL-luke
Die zwei Codestücke sind praktisch identisch. Nur wird die Variante mit "Length" langsamer sein.

Wieso?

dominikkv 27. Apr 2007 15:37

Re: Keine dynamischen Arrays vom Typ TStringList möglich?
 
Zitat:

Zitat von 3_of_8
Wieso "high(History)+2"?

weil length-1 = high

MStoll 27. Apr 2007 15:52

Re: Keine dynamischen Arrays vom Typ TStringList möglich?
 
hi

ja und warum soll der Ausdruck length(History)-1+2 schneller sein als length(History) + 1? Da kommt eher noch der Overhead der Funktion High hinzu...

Korrigiert mich, wenn ich mich irre, aber soweit ich weiß, steht einige Bytes vor dem "Beginn" eines dynamischen Arrays die Länge als Zahl drin und da müsste doch das Auslesen einer Zahl und dann die Addition von 1 schneller sein als das Auslesen + Overhead für High + Substraktion von 1 + Addition von 2, oder?

Gruß
Michael

3_of_8 27. Apr 2007 16:00

Re: Keine dynamischen Arrays vom Typ TStringList möglich?
 
Ich glaube kaum, dass der Compiler so dumm ist, dass er das nicht wegoptimiert. Die zwei Möglichkeiten sollten also genau gleich lang brauchen. Allerdings wird die high-Methode bei statischen Arrays, die nicht 0-basiert sind, überhaupt nicht funktionieren und bei dynamischen Arrays, wie dem hier, oder statischen, 0-basierten Arrays zumindest die Lesbarkeit vermindern.

dominikkv 27. Apr 2007 16:05

Re: Keine dynamischen Arrays vom Typ TStringList möglich?
 
hmmm... ich hab mal nen test gemacht^^
also ich hab jeweils 99999999 mal Dummy := High(Array) bzw Dummy := Length(Array) aufgerufen und siehe da... High braucht ca 200 ms länger

3_of_8 27. Apr 2007 16:11

Re: Keine dynamischen Arrays vom Typ TStringList möglich?
 
Da hast du sicher eine Menge Messungenauigkeit durch das Multitasking mit drin...

EDIT: Ich hab mir mal den erzeugten Assembler-Code angesehen.

Bei length(a)+1 ist es (vereinfacht) das:

Delphi-Quellcode:
call @DynArrayLength
inc eax
Bei high(a)+2 das:

Delphi-Quellcode:
call @DynArrayHigh
add eax, 2
@DynArrayHigh sieht so aus:

Delphi-Quellcode:
call @DynArrayLength
dec eax
Man sieht also: Die length-Methode ist um ein paar Anweisungen kürzer. Das fällt natürlich überhaupt nicht ins Gewicht, da die length-Methode aber darüber hinaus auch verständlicher ist, würde ich diese bevorzugen.

alzaimar 27. Apr 2007 17:11

Re: Keine dynamischen Arrays vom Typ TStringList möglich?
 
Zitat:

Zitat von 3_of_8
Allerdings wird die high-Methode bei statischen Arrays, die nicht 0-basiert sind, ...

Doch, denn der Compiler weiss doch, wie das statische Array dimensioniert ist, und fügt daher die Konstante ein.

Es ist ja auch wartbarer:
Delphi-Quellcode:
Type
  TMyArray = Array [0..1234] of TFoobar;
...
Var
  A : TMyArray;

Begin
  For i:=Low (A) To High(A) Do A[i] := ..
...
Statt:
Delphi-Quellcode:
...
Begin
  For i:= 0 to 1234 Do A[i] := ...
...
Zitat:

Zitat von Franz Beckenbauer oder das Stoiber
Ja gutehh, eine Konstante kannst halt auch nehmen eh...


3_of_8 27. Apr 2007 17:30

Re: Keine dynamischen Arrays vom Typ TStringList möglich?
 
Ich dachte an das mit dem SetLength. Gerade ist mir aber aufgefallen, dass man die Länge von statischen Arrays gar nicht ändern kann. :lol:

Für einen For-Durchlauf ist high geeigneter (lesbarer und für statische Arrays geeignet), für Längenveränderung length.


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