Stichwort Managed Records:Mathias hat geschrieben: Sa 11. Jan 2025, 16:51Wen ich das so lese, kann man den Bezeichner noch anders befüllen, als nur mit $00 ?Und FillChar ist kein venünftiges Substitut für Initialize, denn Managed types müssen nicht unbedingt mit 0 Initialisiert werden.
ZB. Das ein Vector aus 3 single 1,, 0, 1 hat ?
Code: Alles auswählen
program tmngdrec;
{$mode objfpc}
{$modeswitch advancedrecords}
type
TVector3 = record
v: array[0..2] of Single;
class operator Initialize(var aVec: TVector3);
end;
class operator TVector3.Initialize(var aVec: TVector3);
begin
aVec.v[0] := 1.0;
aVec.v[1] := 0.0;
aVec.v[2] := 1.0;
end;
var
v: TVector3;
begin
Writeln(v.v[0], ' ', v.v[1], ' ', v.v[2]);
end.
Initialize initialisiert nur verwaltete Typen, da diese einen korrekten Wert benötigen, damit die Verwaltungsfunktionen keine Fehler erzeugen.Mathias hat geschrieben: Sa 11. Jan 2025, 16:51 Da ist mir auch noch etwas aufgefallen, wieso kommt da nicht 3mal 0 raus, sondern die Zufallszahlen ?Code: Alles auswählen
procedure Test; var v: TVec; begin v := [Random, Random, Random]; Initialize(v); WriteLn(v[0]: 4: 2,' ', v[1]: 4: 2,' ', v[2]: 4: 2); end;
In FPC main sollte man Default() verwenden, da dieses sowohl verwaltete als auch nicht verwaltete Felder auf sinnvolle Werte setzt. In der 3.2 Serie wird der Initialize()-Operator von Managed Records nicht aufgerufen. Solange du also keine managed Records verwendest (also nur Strings und Interfaces), dann heißt die Empfehlung auch Default().