Code: Alles auswählen
SetLength(Items, Length(Items) + 1);
Code: Alles auswählen
{$modeswitch arrayoperators}
Code: Alles auswählen
SetLength(Items, Length(Items) + 1);
Code: Alles auswählen
{$modeswitch arrayoperators}
Code: Alles auswählen
Array3 := Array2 + Array1;
Aber Achtung. Wenn sich jemand eine Vektor-Bibliothek für dynamische Arrays mit überladenem '+' Operator für die Vektor-Addition geschrieben hat, wird er feststellen, dass sie nicht mehr kompiliert, sofern der modeswitch aktiv ist: "Impossible operator overload":Winni hat geschrieben: ↑Mi 7. Okt 2020, 20:54Und endlich auch
Kann man die sebstgeschnitzen Routinen endlich zum Alteisen packen.Code: Alles auswählen
Array3 := Array2 + Array1;
Code: Alles auswählen
program Project1;
{$modeswitch arrayoperators}
uses
SysUtils;
type
TVector = array of double;
operator + (a, b: TVector): TVector; // Compiliert NICHT mit modeswitch
var
i: Integer;
begin
if Length(a) <> Length(b) then
raise Exception.Create('Die zu addierenden Vektoren müssen dieselbe Länge haben.');
SetLength(Result, Length(a));
for i := Low(a) to High(a) do
Result[i] := a[i] + b[i];
end;
var
a: TVector = (1, 2, 3, 4, 5);
b: TVector = (10, 20, 30, 40, 50);
c: TVector;
i: Integer;
begin
c := a + b;
for i := Low(c) to High(c) do
WriteLn('a[i] = ', a[i]:0:2, ' b[i] = ', b[i]:0:2, ' c[i] = a[i] + b[i] = ', c[i]:0:2);
ReadLn;
end.
Bitte beachte, dass es meist was Speicherfragmentierung angeht eine schlechte Idee ist Arrays um einzelne Element wachsen zu lassen. Deshalb nutzen Klassen wie TStringList, die intern auch Arrays verwenden, exponentielles Wachstum (sollten wir ja dank diesem Jahr alle Wissen was das ist ) für das Array selbst (Stichwort: Capacity), während die eigentliche Länge als Feld in der Klasse gespeichert ist (eventuell wird ab 'ner bestimmten Größe wieder auf lineares Wachstum umgestellt, das hängt aber von der jeweiligen Klasse ab).Mathias hat geschrieben: ↑Mi 7. Okt 2020, 16:18Wen man eine dynamische Array um ein Element vergrössern will, muss man folgendes schreiben:Code: Alles auswählen
SetLength(Items, Length(Items) + 1);
Nur im Modus Delphi, da dieses Feature auf Grund von Kompatibilität zu Delphi eingeführt wurde.
Beschwer' dich bei den Entwicklern von Delphi, wobei Delphi ja nie globale Überladung von Operatoren unterstützt hat im Gegensatz zu FPC. Aber genau deswegen haben wir das als Modeswitch gemacht, damit man zumindest unitglobal die Kontrolle darüber hat. Du kannst zum Beispiel im Modus Delphi den Modeswitch wie folgt deaktivieren:
Code: Alles auswählen
{$mode delphi}
{$modeswitch arrayoperators-}
Sorry, ich hatte es daraus geschlossen, dass mir auch schon ohne diesen Schalter Insert, Concat und Delete für dynamische Arrays angeboten wurde und der von mir verlinkte Text neben '+' eben auch diese erwähnt. Gibt es irgendwo noch eine Zusammenfassung, was sozusagen 'immer' geht, und welche Erweiterungen den Schalter brauchen?PascalDragon hat geschrieben: ↑Do 8. Okt 2020, 09:56Nur im Modus Delphi, da dieses Feature auf Grund von Kompatibilität zu Delphi eingeführt wurde.
Bei meiner Array mit max. 20 Elementen ist dies sicher kein Problem.Bitte beachte, dass es meist was Speicherfragmentierung angeht eine schlechte Idee ist Arrays um einzelne Element wachsen zu lassen. Deshalb nutzen Klassen wie TStringList, die intern auch Arrays verwenden, exponentielles Wachstum (sollten wir ja dank diesem Jahr alle Wissen was das ist ) für das Array selbst (Stichwort: Capacity), während die eigentliche Länge als Feld in der Klasse gespeichert ist (eventuell wird ab 'ner bestimmten Größe wieder auf lineares Wachstum umgestellt, das hängt aber von der jeweiligen Klasse ab).
Code: Alles auswählen
const step = 100;
var ar : array of something;
someValue: something;
i : integer = 0;
....
setLength (ar,0);
while i <= BerechneMaximum do
begin
if high(ar) < i then setLength(Length(ar) + step);
....
ar[i] := someValue;
inc(i);
end;
SetLength(ar,i);