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
Seite 1 von 3  1 23      
Edelfix

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

Records

  Alt 3. Nov 2023, 09:59
Hallo,

letzte Zeit bemerke ich immer öfter das Records nicht korrekt initialisiert sind.
In unserem gigantischem Projekt sind Records eigentlich nie initialisiert. Deswegen kommt es immer wieder vor das unsere Kunden ein Fehler melden der bei uns aber nicht auftritt. Oder ein Fehler nur auf einem von zehn identischen Arbeitsplätzen auftritt. Ich habe das Gefühl das es häufiger geworden ist seit wir auf 64 Bit umgestellt haben.
Aktuell suche ich stunden lang nach genau dieser Stelle und initialisiere diesen einen Record.

Wie macht ihr das? Gibt es da eine Lösung die mir nicht bekannt ist?

Beispiel:

Delphi-Quellcode:
unit Unit1;

interface

type
  TRQRec = record
    isActiv: Boolean;
  end;

implementation

procedure Test1;
var
  RQRec: TRQRec;
begin
  //RQRec := Default(TRQRec); // zur Sicherheit initialisieren
  if RQRec.isActiv then // es ist manchmal true
  begin
    // do amasing things
  end;
end;

end.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.585 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Records

  Alt 3. Nov 2023, 10:41
Records werden dort durch Delphi nicht automatisch initialisiert. Die Werte sind bis zum Setzen eines Wertes pseudo-zufällig.

Anders sieht es bei referenzgezählten Felder in einem Record aus. Die werden initialisiert.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#3

AW: Records

  Alt 3. Nov 2023, 10:46
In unserem gigantischem Projekt sind Records eigentlich nie initialisiert.
Meinst du damit, man geht einfach davon aus, dass Record-Felder automatisch genau so initialisiert werden wie Felder in Klassen? Also das Boolean immer False und Integer immer 0 sind? Dann wäre das allerdings grob fahrlässig und ebenso verwunderlich, dass es nicht schon früher zu solchen Problemen gekommen ist.

Wie macht ihr das? Gibt es da eine Lösung die mir nicht bekannt ist?
Eine von mir gern genutzte Alternative sind Konstruktoren, denen ich gleich ein paar Feldwerte als Parameter mitgeben kann.
Delphi-Quellcode:
type
  TRQRec = record
    isActiv: Boolean;
  public
    constructor Create(AisActiv: Boolean);
  end;

constructor TRQRec.Create(AisActiv: Boolean);
begin
  isActiv := AisActiv;
end;

procedure Test1;
var
  RQRec: TRQRec;
begin
  RQRec := TRQRec.Create(False);
  if RQRec.isActiv then
  begin
    // do amazing things
  end;
end;
Die mit neueren Delphi-Versionen verfügbaren Managed Records bieten da noch weitere Möglichkeiten:
Delphi-Quellcode:
type
  TRQRec = record
    isActiv: Boolean;
  public
    class operator Initialize(out Dest: TRQRec);
  end;

class operator TRQRec.Initialize(out Dest: TRQRec);
begin
  Dest.isActiv := False;
end;

procedure Test1;
var
  RQRec: TRQRec;
begin
  if RQRec.isActiv then // ist immer False
  begin
    // do amazing things
  end;
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.159 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Records

  Alt 3. Nov 2023, 10:55
Dann wäre das allerdings grob fahrlässig und ebenso verwunderlich, dass es nicht schon früher zu solchen Problemen gekommen ist.
Kann man einem da wirklich einen großen Vorwurf draus machen wenn der Compiler noch nicht einmal vor so etwas warnen kann?
  Mit Zitat antworten Zitat
Edelfix

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

AW: Records

  Alt 3. Nov 2023, 10:59
Ich bin kein gelernter Delphi Programmierer. Versuche mir alles selbst bei zu bringen.

Haptsächlich versuche ich durch bestehenden Code zu lernen. Es wird aber schwieriger wenn meine Vorgänger mir keinen korekten Code überlassen haben.

Sehe ich das richtig das "Records" hauptsächlich oder ausschließlich ein Delphi Ding sind?

Auf jeden Fall schwinden die Vorteile eines Records beim Vergleich: Record vs. Class

Die einzige Zeile die ich einsparre ist die Freigabe des Records.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.159 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Records

  Alt 3. Nov 2023, 11:10
Sehe ich das richtig das "Records" hauptsächlich oder ausschließlich ein Delphi Ding sind?
Ich weiß nicht, mit welchen Sprachen du vergleichen möchtest. Java beispielsweise hat kein Gegenstück, die Delphi-Records sind aber praktisch 1:1 das, was in C oder C++ structs sind.

Klassen und Records haben beide legitime Anwendungsfälle, das eine ist nicht per se "besser" als das andere.
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.354 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Records

  Alt 3. Nov 2023, 11:11
Die einzige Zeile die ich einsparre ist die Freigabe des Records.
Und auch das kann man sich sparen, wenn man interfaces korrekt nutzt.

Records sind bei mir nur noch selten im Einsatz. Zur Initialisierung benutze ich den Fällen meistens:
Delphi-Quellcode:
type
  TMyRec = Record
    ...
  end;

var
  MyRec : TMyRec;
begin
  MyRec := Default(TMyRec);
end;
Peter
  Mit Zitat antworten Zitat
Frickler

Registriert seit: 6. Mär 2007
Ort: Osnabrück
591 Beiträge
 
Delphi XE6 Enterprise
 
#8

AW: Records

  Alt 3. Nov 2023, 11:57
Ich habe in Records immer eine Methode "Init", die den Record genau so initialisiert, wie ich das jeweils gerne hätte:
Delphi-Quellcode:
type
  TMyRec = Record
    ...
    procedure Init;
  end;

procedure TMyRec.Init;
begin
  ...
end;

var
  MyRec : TMyRec;
begin
  MyRec.Init;
  ...
end;
P.S.: für "Managed Records" haben wir eine zu alte Delphi-Version.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#9

AW: Records

  Alt 3. Nov 2023, 12:09
Kann man einem da wirklich einen großen Vorwurf draus machen wenn der Compiler noch nicht einmal vor so etwas warnen kann?
Meiner Meinung nach, ja. Es ist natürlich einfach, die Schuld an einem Programmfehler dem Compiler zu geben, der nicht clever genug ist, diesen zu entdecken. Vielleicht bin ich aber auch einfach nur zu altmodisch.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.585 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Records

  Alt 3. Nov 2023, 12:28
Das Problem ist dabei aber z.B., dass ein Record ja wiederum weitere strukturierte Typen enthalten kann. Dazu kommt dann mittlerweile, dass ein Record auch Initialisierungsroutinen haben kann, deren Funktion der Compiler nicht kennen kann.

Solche Intelligenz ist daher vorerst Wunschdenken. Möglich wäre so etwas nur, wenn man den gesamten Quelltext an eine KI verfüttert.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 06:52 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