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-Länge in Prozedur verändern? (https://www.delphipraxis.net/69049-array-laenge-prozedur-veraendern.html)

simlei 9. Mai 2006 15:22


Array-Länge in Prozedur verändern?
 
Delphi-Quellcode:
procedure add2array(var ziel: array of integer; wert:integer);
begin
SetLength(ziel, Length(ziel)+1);
ziel[Length(ziel)-1] := wert;
end;
[Error] Unit1.pas(203): Incompatible types - bei SetLength(ziel, Length(ziel)+1);

warum? ich habe doch mit 'var' Schreibzugriff gesetzt...

Brainshock 9. Mai 2006 15:35

Re: Array-Länge in Prozedur verändern?
 
nimm mal statt "array of integer" den Typ "TIntegerDynArray" aus der Unit Types.pas (also unter uses eintragen). Dann sollte es funktionieren.

Gruß

marabu 9. Mai 2006 15:54

Re: Array-Länge in Prozedur verändern?
 
Matthias hat die Lösung, die Erklärung ist in der Online-Hilfe zu finden:

Topic: Offene Array-Parameter

Im Rumpf einer Routine gelten die folgenden Regeln für offene Array-Parameter.
  • ...
  • Der Zugriff kann nur auf die einzelnen Elemente erfolgen. Zuweisungen an einen offenen Array-Parameter insgesamt sind dagegen nicht zulässig.

Hier noch eine Umformulierung:

Delphi-Quellcode:
uses
  Types;

procedure AddValue(var ida: TIntegerDynArray; const value: Integer);
begin
  SetLength(ida, Succ(Length(ida)));
  ida[High(ida)] := value;
end;
Grüße vom marabu

inherited 9. Mai 2006 19:19

Re: Array-Länge in Prozedur verändern?
 
Muss es nicht
Delphi-Quellcode:
  High(Array);
statt
Delphi-Quellcode:
  length(Array);
oder irre ich mich grad?

ichbins 9. Mai 2006 19:28

Re: Array-Länge in Prozedur verändern?
 
length(array) gibt dir die Anzahl der Elemente.

high(array) gibt dir die Nummer des höchsten Elements.


Er will aber die Anzahl der Elemente um 1 erhöhen, also braucht er die Anzahl die Elemente.

himitsu 10. Mai 2006 11:22

Re: Array-Länge in Prozedur verändern?
 
Ich nehm da meistens 'ne lokale Variable, dat erspart mir daß mehrmalige auslesen der Länge ... ein Prozeduraufruf weniger ^^
Delphi-Quellcode:
procedure AddValue(var ida: TIntegerDynArray; const value: Integer);
var i: Integer;
begin
  i := Length(ida);
  SetLength(ida, i + 1);
  ida[i] := value;
end;
PS: High(...) ist beim dynamischen Array auch nur Length(...)-1 und wird intern auch so errechnet ;)
PSS: dat const kannst'e och weglassen, macht beim Integer eh keinen Unterschied


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