![]() |
AW: Record als Result einer Funktion
Zitat:
|
AW: Record als Result einer Funktion
Hallo NoGAD,
Du könntest Deinen eigenen Boolean-Typ deklarieren, bei dem dieses Problem nicht auftritt:
Delphi-Quellcode:
Und schon sind Deine Variablen beim Anlegen & Löschen "automatisch" auf boUndef gesetzt.
Type
MyBoolean = (boUndef, boFalse, boTrue); Gruß, Andreas |
AW: Record als Result einer Funktion
Zitat:
Zitat:
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 ![]() |
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 |
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.
|
AW: Record als Result einer Funktion
Zitat:
Delphi 2010 = OK
Delphi-Quellcode:
lässt man die Initialisierung 'x := 0;' weg kommt diese Meldung Variable: 'x' wurde nicht initialisiert.
var
x, i: Integer; begin x := 0; for i := 0 to 10 do if i mod 2 then x := i; end; Delphi 10.3 = Warnung: Auf 'x' zugewiesener Wert wird niemals benutzt. Eine Faustregel gibt es nicht. |
AW: Record als Result einer Funktion
Zitat:
Delphi-Quellcode:
Bitte selber überprüfen.
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. Gruß, Andreas |
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:
Auch dann funktioniert es.
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; Gruß, Andreas |
AW: Record als Result einer Funktion
Zitat:
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. |
AW: Record als Result einer Funktion
Inzwischen bin auch ich etwas klüger geworden... :oops:
Delphi-Quellcode:
Andreas
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:01 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 by Thomas Breitkreuz