Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Ein Record 'auf null setzen' (https://www.delphipraxis.net/205054-ein-record-auf-null-setzen.html)

kagi3624 28. Jul 2020 07:41

Delphi-Version: 6

Ein Record 'auf null setzen'
 
Hallo, ich benutze einen Record immer wieder in einer Schleife, wie setze ich es auf null bzw. lösche dort alle werte richtig, bevor ich es neu beschreibe?

ZeroMemory(@MyRecord,SizeOf(MyRecord));

habe ich gefunden, es gibt aber auch die Funktion Default, aber da weiß ich nicht ob es mit Delphi 6 läuft. Thx

dummzeuch 28. Jul 2020 08:08

AW: Ein Record 'auf null setzen'
 
Zitat:

Zitat von kagi3624 (Beitrag 1470527)
Hallo, ich benutze einen Record immer wieder in einer Schleife, wie setze ich es auf null bzw. lösche dort alle werte richtig, bevor ich es neu beschreibe?

ZeroMemory(@MyRecord,SizeOf(MyRecord));

habe ich gefunden, es gibt aber auch die Funktion Default, aber da weiß ich nicht ob es mit Delphi 6 läuft. Thx

Default gibt es erst seit neueren Delphi-Versionen. ZeroMemory oder FillChar sind die Funktionen, die man zu Delphi 6 Zeiten verwendet hat und solange man in dem Record keine Managed Types verwendet (String (ShortString oder String[n] ist OK), Interface, dyn. Array), funktioniert das auch super.

kagi3624 28. Jul 2020 08:39

AW: Ein Record 'auf null setzen'
 
Zitat:

Zitat von dummzeuch (Beitrag 1470532)
Default gibt es erst seit neueren Delphi-Versionen. ZeroMemory oder FillChar sind die Funktionen, die man zu Delphi 6 Zeiten verwendet hat und solange man in dem Record keine Managed Types verwendet (String (ShortString oder String[n] ist OK), Interface, dyn. Array), funktioniert das auch super.

Ich hab aber leider dynamische Arrays in meinem Record

KodeZwerg 28. Jul 2020 08:52

AW: Ein Record 'auf null setzen'
 
Delphi-Quellcode:
SetLength()
kann bei dyn. Arrays helfen.

Andreas13 28. Jul 2020 09:34

AW: Ein Record 'auf null setzen'
 
Hallo,
Automatismen sind schön und gut, aber manchmal können Null-Werte einer Variablen numerische Probleme bei den nachfolgenden Berechnungen verursachen. Daher verwende ich nach / anstelle
Delphi-Quellcode:
ZeroMemory(@MyRecord,SizeOf(MyRecord));
oder
Delphi-Quellcode:
Result:= Default(MB_Record);
oder
Delphi-Quellcode:
 FillChar(Result, SizeOf(Result), 0);
etc. stets eigene Proceduren, die die kritischen Variablen auf "ungefährliche" oder "sinnlose" Werte setzt. Dazu habe ich für die meisten Datentypen eine überladene Funktion namens Sinnlos deklariert, die den jeweiligen Variablen die passenden Werte zuweist:
Delphi-Quellcode:
Function Sinnlos: Extended; Overload;
Begin
  Result:= ... ; // wie +/-Unendlich, NaN, negativ, MaxExtended etc.
End;
Gruß, Andreas

dummzeuch 28. Jul 2020 10:57

AW: Ein Record 'auf null setzen'
 
Zitat:

Zitat von kagi3624 (Beitrag 1470536)
Zitat:

Zitat von dummzeuch (Beitrag 1470532)
Default gibt es erst seit neueren Delphi-Versionen. ZeroMemory oder FillChar sind die Funktionen, die man zu Delphi 6 Zeiten verwendet hat und solange man in dem Record keine Managed Types verwendet (String (ShortString oder String[n] ist OK), Interface, dyn. Array), funktioniert das auch super.

Ich hab aber leider dynamische Arrays in meinem Record

Dann solltest Du die vor einem ZeroMemory mittels SetLength(Arrayname, 0) freigeben. Danach ist ein ZeroMemory kein Problem mehr, da intern ein dynamisches Array der Länge 0 ein NIL-Pointer ist, sich also durch ZeroMemory nichts ändert. Dasselbe gilt für AnsiStrings: Auf '' setzen, macht daraus einen NIL-Pointer. Dito Interfaces sollte man direkt auf NIL setzen.

Wichtig ist das wegen des Reference-Countings. ZeroMemory geht an den vom Compiler eingebauten Machanisme für Reference-Counting vorbei und verursacht ggf. spaßige Effekte wie Access Violations.

himitsu 28. Jul 2020 14:19

AW: Ein Record 'auf null setzen'
 
Sind da gemangtae Typen im Record?
Strings, Interfaces usw.?

Dann vor dem Zero unbedingt ein Finalize (FinalizeArray mit Count=1 oder FinalizeRecord, sie System-Unit)


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