Delphi-PRAXiS
Seite 3 von 7     123 45     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Record als Result einer Funktion (https://www.delphipraxis.net/203816-record-als-result-einer-funktion.html)

DieDolly 28. Mär 2020 13:01

AW: Record als Result einer Funktion
 
Zitat:

Sind sie nicht. Ein Boolean hat die Speichergröße eines Bytes und es ist halt so, daß alles was in dem Byte steht außer 0 als True interpretiert wird. Daher ist die Wahrscheinlichkeit recht hoch, daß ein nicht-initialisierter Boolean eben als True gemeldet wird.
Bei mir ist Boolean False nach dem Erzeugen des Hauptformulars. Das ist ein größeres Projekt. Ist sowas Zufall?

Andreas13 28. Mär 2020 13:32

AW: Record als Result einer Funktion
 
Hallo NoGAD,
Du könntest Deinen eigenen Boolean-Typ deklarieren, bei dem dieses Problem nicht auftritt:
Delphi-Quellcode:
Type
  MyBoolean = (boUndef, boFalse, boTrue);
Und schon sind Deine Variablen beim Anlegen & Löschen "automatisch" auf boUndef gesetzt.
Gruß, Andreas

himitsu 28. Mär 2020 16:22

AW: Record als Result einer Funktion
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1460695)
Sind sie nicht.

Jupp, 255 zu 1 ist die Chance auf True, beim Boolean und ByteBool ... beim LongBool sind es da schon 4 Milliarden zu 1. :thumb:

Zitat:

Zitat von Andreas13 (Beitrag 1460705)
Du könntest Deinen eigenen Boolean-Typ deklarieren, bei dem dieses Problem nicht auftritt.
Und schon sind Deine Variablen beim Anlegen & Löschen "automatisch" auf boUndef gesetzt.

Eben nicht.
Also im Prinzip ist es ach deiner Definition ein Variant, der von Haus aus erstmal NULL ist und anschließens True oder False (WordBool) aufnehmen kann.

Mit dem Unterschied dass der Variant immer initialisiert ist und dein ENUM nicht.
siehe auch https://www.delphipraxis.net/203800-...string%3B.html

NoGAD 28. Mär 2020 17:19

AW: Record als Result einer Funktion
 
Lieben Dank an euch alle.


Da ich nur als Hobby programmiere, fehlen mir sicherlich wichtige Voraussetzungen, welche man durch eine entsprechende Ausbildung erhält. Lernen hingegen möchte ich immer. Daher freue ich mich, dass ich auch bei solchen Kleinigkeiten eines Besseren belehrt werde. :thumb:

Bisher war ich auch immer der falschen Annahme erlegen, dass Boolean immer automatisch als False initialisiert werden.

Falls noch jemand im Code eklatante Fehler, außer den bereits angesprochenen, findet, wäre ich über Rückmeldungen sehr erfreut.


LG Mathias

Luckie 28. Mär 2020 18:03

AW: Record als Result einer Funktion
 
Einfach angewöhnen alles zu initialisieren und das Standardverhalten kann einem egal sein. So mache ich es schon seit Ewigkeiten und bin bisher gut damit gefahren.

venice2 28. Mär 2020 18:15

AW: Record als Result einer Funktion
 
Zitat:

Zitat von Luckie (Beitrag 1460721)
Einfach angewöhnen alles zu initialisieren und das Standardverhalten kann einem egal sein. So mache ich es schon seit Ewigkeiten und bin bisher gut damit gefahren.

Solange wie Delphi es zulässt.

Delphi 2010 = OK
Delphi-Quellcode:
var
  x, i: Integer;
begin
 
  x := 0;
  for i := 0 to 10 do
    if i mod 2 then
      x := i;
end;
lässt man die Initialisierung 'x := 0;' weg kommt diese Meldung Variable: 'x' wurde nicht initialisiert.


Delphi 10.3 = Warnung: Auf 'x' zugewiesener Wert wird niemals benutzt.

Eine Faustregel gibt es nicht.

Andreas13 29. Mär 2020 12:14

AW: Record als Result einer Funktion
 
Zitat:

Zitat von himitsu (Beitrag 1460715)
Zitat:

Zitat von Andreas13 (Beitrag 1460705)
Du könntest Deinen eigenen Boolean-Typ deklarieren, bei dem dieses Problem nicht auftritt.
Und schon sind Deine Variablen beim Anlegen & Löschen "automatisch" auf boUndef gesetzt.

Eben nicht.
Also im Prinzip ist es ach deiner Definition ein Variant, der von Haus aus erstmal NULL ist und anschließens True oder False (WordBool) aufnehmen kann.

Mit dem Unterschied dass der Variant immer initialisiert ist und dein ENUM nicht.
siehe auch https://www.delphipraxis.net/203800-...string%3B.html

Bei allem Respekt, aber folgendes kleines Demoprogramm widerlegt Deine Thesen:
Delphi-Quellcode:
program Aufzaehlungstyp_Initialisierung_Test_1;
{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

Type
  MyBoolean = (boUndef, boFalse, boTrue);

CONST
  MyBooleanStr: Array[MyBoolean] of String = ('Undefiniert', 'Nein', 'Ja');
  n_Daten = 150;
 
VAR
  MB: MyBoolean;
  MB_Array: Array[1..n_Daten] of MyBoolean;
  i      : Integer;
   
Begin
  Try
    // OHNE eigene Initialisierung:

    WriteLn('MB: MyBooleanStr[MB] = ', MyBooleanStr[MB]);
    WriteLn;

    For i:= 1 To n_Daten Do
    Begin
      WriteLn('MyBooleanStr[MB_Array[', i.ToString.PadLeft(3), ']] = ', MyBooleanStr[MB_Array[i]]);
    End;
   
    ReadLn;

  Except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  End;
End.
Bitte selber überprüfen.
Gruß, Andreas

Andreas13 29. Mär 2020 12:38

AW: Record als Result einer Funktion
 
Und - damit wir beim Thema bleiben (Record als Result einer Funktion) - fügen wir noch folgenden Code zusätzlich ins obige Programm ein:
Delphi-Quellcode:
Type
  MB_Record = Record
    MB1: MyBoolean;
    MB2: MyBoolean;
    MB3: MyBoolean;
    MB4: MyBoolean;
    MB5: MyBoolean;
    MB6: MyBoolean;
    MB7: MyBoolean;
  End;
...

VAR
  MB_Rec: MB_Record;
...
    WriteLn('MB_Rec.MB1 = ', MyBooleanStr[MB_Rec.MB1]);
    WriteLn('MB_Rec.MB2 = ', MyBooleanStr[MB_Rec.MB2]);
    WriteLn('MB_Rec.MB3 = ', MyBooleanStr[MB_Rec.MB3]);
    WriteLn('MB_Rec.MB4 = ', MyBooleanStr[MB_Rec.MB4]);
    WriteLn('MB_Rec.MB5 = ', MyBooleanStr[MB_Rec.MB5]);
    WriteLn('MB_Rec.MB6 = ', MyBooleanStr[MB_Rec.MB6]);
    WriteLn('MB_Rec.MB7 = ', MyBooleanStr[MB_Rec.MB7]);
    WriteLn;
Auch dann funktioniert es.
Gruß, Andreas

Uwe Raabe 29. Mär 2020 12:50

AW: Record als Result einer Funktion
 
Zitat:

Zitat von Andreas13 (Beitrag 1460742)
Bitte selber überprüfen.

Das ist doch kein Beweis, sondern zeigt nur, daß nach einem Programmstart eine bestimmte Speicherbelegung wahrscheinlich ist. Probier mal dieses Testprogramm:
Delphi-Quellcode:
program Project652;

{$APPTYPE CONSOLE}

uses
  System.SysUtils;

Type
  MyBoolean = (boUndef, boFalse, boTrue);

CONST
  MyBooleanStr: Array[MyBoolean] of String = ('Undefiniert', 'Nein', 'Ja');

procedure Test;
var
  MB: MyBoolean;
begin
  if (MB < boUndef) or (MB > boTrue) then
    Writeln('Range Error!')
  else
    WriteLn('MB: MyBooleanStr[MB] = ', MyBooleanStr[MB]);
end;

procedure Dummy;
var
  B: Byte;
begin
  B := Random(256);
end;

procedure RandomTest;
var
  I: Integer;
begin
  for I := 1 to 1000 do begin
    Dummy;
    Test;
  end;
end;

begin
  try
    RandomTest;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;
end.

Andreas13 29. Mär 2020 12:54

AW: Record als Result einer Funktion
 
Inzwischen bin auch ich etwas klüger geworden... :oops:
Delphi-Quellcode:
Function Get_Record: MB_Record;
VAR
  MB_Rec_Neu: MB_Record;
 
Begin
  // OHNE eigene Initialisierung:
  Result:= MB_Rec_Neu;
End;
...
    MB_Rec:= Get_Record;
    // Himitsu hat recht: Das funktioniert NICHT mehr...
    // Das Funktions-Ergebnis kommt uninitialisiert vom Stack zurück
   
    WriteLn('MB_Rec.MB1 = ', MyBooleanStr[MB_Rec.MB1]);
    WriteLn('MB_Rec.MB2 = ', MyBooleanStr[MB_Rec.MB2]);
    WriteLn('MB_Rec.MB3 = ', MyBooleanStr[MB_Rec.MB3]);
    WriteLn('MB_Rec.MB4 = ', MyBooleanStr[MB_Rec.MB4]);
    WriteLn('MB_Rec.MB5 = ', MyBooleanStr[MB_Rec.MB5]);
    WriteLn('MB_Rec.MB6 = ', MyBooleanStr[MB_Rec.MB6]);
    WriteLn('MB_Rec.MB7 = ', MyBooleanStr[MB_Rec.MB7]);
    WriteLn;
Andreas


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:35 Uhr.
Seite 3 von 7     123 45     Letzte »    

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