AGB  ·  Datenschutz  ·  Impressum  







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

Records

Ein Thema von Edelfix · begonnen am 3. Nov 2023 · letzter Beitrag vom 7. Nov 2023
Antwort Antwort
Benutzerbild von Sinspin
Sinspin

Registriert seit: 15. Sep 2008
Ort: Dubai
717 Beiträge
 
Delphi 10.3 Rio
 
#1

AW: Records

  Alt 3. Nov 2023, 12:15
Eine Record-Variable/Feld die in einer Klasse enthalten ist, sollte mit Null initialisiert sein, so wie alle anderen Felder der Klasse auch. Aber in Methoden/Proceduren/Funktionen sind lokale Variablen egal welchen Typs nie initialisiert.
Stefan
Nur die Besten sterben jung
A constant is a constant until it change.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Records

  Alt 3. Nov 2023, 14:59
Die Lösung nennt sich Custom Managed Records.
https://docwiki.embarcadero.com/RADS...anaged_Records

Delphi-Quellcode:
type
  TMyRecord = record
    Value: Integer;
    class operator Initialize(out Dest: TMyRecord);
  end;

class operator TMyRecord.Initialize(out Dest: TMyRecord);
begin
  Dest.Value := 10;
end;
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke
Online

Registriert seit: 10. Jun 2003
Ort: Berlin
9.963 Beiträge
 
Delphi 12 Athens
 
#3

AW: Records

  Alt 3. Nov 2023, 16:33
Ja, in diesem Fall ist das sicher die einfachste Lösung, da man dafür nur die Records selbst anfassen muss, nicht aber deren Verwendung im Quelltext.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
TSchnuckenbock

Registriert seit: 20. Jul 2017
Ort: Lüneburger Heide
74 Beiträge
 
Delphi XE5 Professional
 
#4

AW: Records

  Alt 3. Nov 2023, 18:57
Ich hab' eben mal im Code geschaut, wie ich generell programmiere....meine Vermutung war, daß ich generell alle Variablen initialisiere. Und genauso ist es. Ich verlasse mich nirgends darauf, wie eine eventuell Vorbelegung aussehen könnte. (Ich habe wenigstens auf die Schnelle keinen Code gefunden, in dem es anders ist.)
Bei Klassen geschieht das im Kontruktor oder es gibt z.B. eine Methode "Init" oder sowas in der Art. Da werden dann alle Felder einer Klasse mit Default-Werten vorbelegt, Events kriegen z.B. nil zugewiesen.

Im alten Code, den ich übernommen habe, könnte es aber anders aussehen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Records

  Alt 3. Nov 2023, 19:12
Managed Typen sind immer initialisiert (außer jemand pfuscht mit Pointern rum und verwendet die falsche Methode, zum Reservieren des Speichers)

Globale Variablen und Thread-Variablen werden durch Windows immer initialisiert (standardmäßig mit 0),
außer es wurde für eine globale Variable ein Initialisierungs-Wert angegeben.
Genauer gesagt, liegen globale Varaiblen in eine Sektion (Speicherbereich) der EXE/DLL.

Objekt-Felder (die Variablen in Delphi-Objekten) sind ebenfalls immer mit 0 initialisiert.
siehe das FillChar in TObject.InitInstance

Lokale Variablen (also auf dem Stack) sind normal nicht initialisiert.
* Ausnahme sind Managed Typen
Result ist nicht initialisiert
* Ausnahme sind Managed Typen (nur sind sie nicht dort initialisiert, wo ihr es denkt )
* neuerdings werden z.B. Boolean-Results mit False initialisiert, weil ständig zuviele Leute grob fahrlässig die Compiler-Warnungen nicht lesen.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
TSchnuckenbock

Registriert seit: 20. Jul 2017
Ort: Lüneburger Heide
74 Beiträge
 
Delphi XE5 Professional
 
#6

AW: Records

  Alt 3. Nov 2023, 21:32
Ach ja, die Compiler-Meldungen bzgl. eventuell nicht initialisierten Sachen, schaue ich mir an und behebe das.
Das hat unsere Software übigens merklich stabiler gemacht.
  Mit Zitat antworten Zitat
Edelfix

Registriert seit: 6. Feb 2015
Ort: Stadtoldendorf
238 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Records

  Alt 6. Nov 2023, 08:50
Währe es so nicht noch besser?

Delphi-Quellcode:
class operator TMyRecord.Initialize(out Dest: TMyRecord);
begin
  //Dest.Value := 10;
  Dest := Default(TMyRecord);
end;
Scheint aber nicht zu funktionieren.
  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 16:03 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz