Code: Alles auswählen
if not assigned(fMyIntf) then fMyIntf := TIrgendWas.create;
Das größere Problem könnte die Freigabe sein
Code: Alles auswählen
if not assigned(fMyIntf) then fMyIntf := TIrgendWas.create;
Nö, der Record Nutzer soll sich darum eben nicht kümmern müssen.BeniBela hat geschrieben:Der record Nutzer ist dafür verantwortlich es auf nil zu setzenCode: Alles auswählen
if not assigned(fMyIntf) then fMyIntf := TIrgendWas.create;
Das größere Problem könnte die Freigabe sein
Code: Alles auswählen
var x: trec;
Code: Alles auswählen
new(rec);
dispose(rec);
Code: Alles auswählen
getmem(rec);
freemem(rec);
Unsinn. Der Wert kommt nicht zufällig, sondern ist der Wert, den der letzte Record dort hattetheo hat geschrieben:
Eine Möglichkeit habe ich mir überlegt. Man könnte eine QWord Kontrollvariable mitführen und diese nach dem Createn auf einen bestimmten konstanten Wert setzen.
Vorher kann man diese Variable gegen die Konstante prüfen. Dass die Variable zufällig diesen einen, bestimmten Anfangswert bekommt, ist extrem unwahrscheinlich.
Kann ich nicht bebachten.BeniBela hat geschrieben: Unsinn. Der Wert kommt nicht zufällig, sondern ist der Wert, den der letzte Record dort hatte
Code: Alles auswählen
type
TRec=Record
wd:QWord;
end;
...
procedure TForm1.Button1Click(Sender: TObject);
var a:TRec;
begin
Memo1.lines.Add(IntToStr(a.wd));
a.wd:=1234;
Memo1.lines.Add(IntToStr(a.wd));
end;
Unmittelbar, nachdem du den Speicher für den gesamten Record reservierst. Der Record erscheint ja nicht zufällig im Speicher.theo hat geschrieben:Und wann wäre das innerhalb eines Records?Socke hat geschrieben:Dann setz die Variable doch auf nil, sobald sie verfügbar ist!
Wie meinst du das?Socke hat geschrieben:Unmittelbar, nachdem du den Speicher für den gesamten Record reservierst. Der Record erscheint ja nicht zufällig im Speicher.theo hat geschrieben:Und wann wäre das innerhalb eines Records?Socke hat geschrieben:Dann setz die Variable doch auf nil, sobald sie verfügbar ist!
Damit du das nicht an allen Stellen in deinem Code machen musst, an denen du diese Records erzeugst, kannst du dir auch eine Factory-Prozedur bauen (die dann selbstverständlich nicht zum Record gehört).
Im Prizip gehört jeder Entwickler geteert und gefedert, der auf einen Record lesend zugreift, ohne ihn vorher zu initialisieren. Das kann er entweder selbst machen (für mich wäre das "nichts spezielles" sondern etwas selbstverständliches) oder du forderst (Dokumentation!), dass der Record ausschließlich über eine Factory-Prozedur erstellt wird (bei Ablage auf dem Heap) oder du entscheidest dich doch für ein Objekt.theo hat geschrieben:Wie meinst du das?
Ich möchte nicht, dass der User irgendwas spezielles machen muss mit dem Record, sonst würde ich das Create einer Klasse benutzen.
New() und Dispose() rufen fpc_initialize bzw. fpc_finailize auf, wenn referenzgezählte Typen (COM-Interfaces, Unicode-/AnsiStrings, dynamische Arrays, NICHT für Objekte/Klassen, CORBA-Interfaces, statische Arrays und Shortstrings) im Record verwendet werden. Diese Typen benötigen zwingend eine Initialisierung. Dies fehlt in der Tat in der Dokumenation.BeniBela hat geschrieben:New ruft automatisch fpc_initialize auf (obwohl das der Dokumentation widerspricht) und dispose fpc_finalize.Ruft nichts auf. Nicht verwenden!Code: Alles auswählen
getmem(rec); freemem(rec);
Wird ein record nicht mit Nullen/LeerString aufgefüllt, oder war dies Zufall ?Im Prizip gehört jeder Entwickler geteert und gefedert, der auf einen Record lesend zugreift, ohne ihn vorher zu initialisieren.
Code: Alles auswählen
var
r: record
a, b, c: integer;
s: string;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
with r do begin
WriteLn(a);
WriteLn(b);
WriteLn(c);
WriteLn(s);
end;
end;
Nein, was ich allerdings zumindest schade finde.Mathias hat geschrieben:Wird ein record nicht mit Nullen/LeerString aufgefüllt,Im Prizip gehört jeder Entwickler geteert und gefedert, der auf einen Record lesend zugreift, ohne ihn vorher zu initialisieren.
Code: Alles auswählen
var
r: record
a, b, c: integer;
s: string;
end
= (a: 0; b: 0; c: 0; s: '');
Müsste beiNein, was ich allerdings zumindest schade finde.
Code: Alles auswählen
WriteLn(r.a);
Code: Alles auswählen
type
tr= record
a, b, c: integer;
s: string;
end ;
....
procedure TForm1.Button1Click(Sender: TObject);
var r:tr;
re: record
a, b, c: integer;
s: string;
end;
begin
writeln(r.a);
writeln(re.a);
end;
Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject);
var
i:Integer;
begin
writeln(i);
end;
Einschränkung: es werden nur die referenzgezählten Typen initialisiert; alle anderen Felder bleiben uninitialisiert.Socke hat geschrieben:New() und Dispose() rufen fpc_initialize bzw. fpc_finailize auf, wenn referenzgezählte Typen (COM-Interfaces, Unicode-/AnsiStrings, dynamische Arrays, NICHT für Objekte/Klassen, CORBA-Interfaces, statische Arrays und Shortstrings) im Record verwendet werden. Diese Typen benötigen zwingend eine Initialisierung. Dies fehlt in der Tat in der Dokumenation.