Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Records (https://www.delphipraxis.net/213990-records.html)

Edelfix 3. Nov 2023 08:59

Records
 
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.

jaenicke 3. Nov 2023 09:41

AW: Records
 
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.

Uwe Raabe 3. Nov 2023 09:46

AW: Records
 
Zitat:

Zitat von Edelfix (Beitrag 1528940)
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.

Zitat:

Zitat von Edelfix (Beitrag 1528940)
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;

Der schöne Günther 3. Nov 2023 09:55

AW: Records
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1528943)
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?

Edelfix 3. Nov 2023 09:59

AW: Records
 
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.

Der schöne Günther 3. Nov 2023 10:10

AW: Records
 
Zitat:

Zitat von Edelfix (Beitrag 1528945)
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.

Jasocul 3. Nov 2023 10:11

AW: Records
 
Zitat:

Zitat von Edelfix (Beitrag 1528945)
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;

Frickler 3. Nov 2023 10:57

AW: Records
 
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.

Uwe Raabe 3. Nov 2023 11:09

AW: Records
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1528944)
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.

jaenicke 3. Nov 2023 11:28

AW: Records
 
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:48 Uhr.
Seite 1 von 3  1 23      

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