AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Ein Record 'auf null setzen'

Ein Thema von kagi3624 · begonnen am 28. Jul 2020 · letzter Beitrag vom 28. Jul 2020
Antwort Antwort
kagi3624

Registriert seit: 3. Feb 2020
138 Beiträge
 
Delphi 6 Enterprise
 
#1

Ein Record 'auf null setzen'

  Alt 28. Jul 2020, 08:41
Delphi-Version: 6
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
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.623 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Ein Record 'auf null setzen'

  Alt 28. Jul 2020, 09:08
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.
Thomas Mueller
  Mit Zitat antworten Zitat
kagi3624

Registriert seit: 3. Feb 2020
138 Beiträge
 
Delphi 6 Enterprise
 
#3

AW: Ein Record 'auf null setzen'

  Alt 28. Jul 2020, 09:39
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
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Ein Record 'auf null setzen'

  Alt 28. Jul 2020, 09:52
SetLength() kann bei dyn. Arrays helfen.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
719 Beiträge
 
Delphi XE5 Professional
 
#5

AW: Ein Record 'auf null setzen'

  Alt 28. Jul 2020, 10:34
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 ZeroMemory(@MyRecord,SizeOf(MyRecord)); oder Result:= Default(MB_Record); oder  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
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.623 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Ein Record 'auf null setzen'

  Alt 28. Jul 2020, 11:57
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.
Thomas Mueller
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

AW: Ein Record 'auf null setzen'

  Alt 28. Jul 2020, 15:19
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)
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:57 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