![]() |
Meldung: Var nicht initzialisiert obwohl wert zugewiesen?!
Nr. 1 - [Pascal Warnung] Unit1.pas(90): W1036 Variable 'res' ist möglicherweise nicht initialisiert worden
Delphi-Quellcode:
Nr. 2 - [Pascal Warnung] Unit1.pas(143): W1036 Variable 'zei' ist möglicherweise nicht initialisiert worden
procedure TForm1.IstButtonClick(Sender: TObject); // Ergebnis Berechnen
var res, op1, op2 : Double; code : Integer; s : string; begin if mode = 2 then begin Val(strBuff1, op1, code); // strBuff1 in Zahl op1 rückverwandeln Val(strBuff2, op2, code); // strBuff2 in Zahl op2 rückverwandeln case op of '+': res := op1 + op2; '-': res := op1 - op2; '*': res := op1 * op2; '/': res := op1 / op2; end; s:= Format('%g',[res]); // Ergebnis als Gleitkommazahl formatieren Label1.Caption := s; mode := 1; strBuff1 := ''; end; end;
Delphi-Quellcode:
Die Variablen wurden doch initzialisiert?! oder seh ich des falsch? Wertzuweisung = Initialisierung?!
procedure TForm1.ZeiButtonClick(Sender: TObject); // zeichenweise Zahleneingabe
var zei: Char; begin if Sender = Button10 then zei := '0'; if Sender = Button1 then zei := '1'; if Sender = Button2 then zei := '2'; if Sender = Button3 then zei := '3'; if Sender = Button4 then zei := '4'; if Sender = Button5 then zei := '5'; if Sender = Button6 then zei := '6'; if Sender = Button7 then zei := '7'; if Sender = Button8 then zei := '8'; if Sender = Button9 then zei := '9'; if Sender = Button11 then zei := '.'; if mode = 1 then begin strBuff1 := strBuff1 + zei; Label1.Caption := strBuff1; end else begin strBuff2 := strBuff2 + zei; Label1.Caption := strBuff1 + ' ' + op + ' ' + strBuff2; end; end; end. Wenn jemand schlauer is, wovon ich sicherlich ausgehe ;) dann klärt mich mal bidde auf, steig da net dahinter woran des etz hapern soll ^^ |
Re: Meldung: Var nicht initzialisiert obwohl wert zugewiesen
Hab vergessen den Buttons den Event-Handler zuzuweisen :coder2:
sry ... |
Re: Meldung: Var nicht initzialisiert obwohl wert zugewiesen
Zitat:
|
Re: Meldung: Var nicht initzialisiert obwohl wert zugewiesen
Bei Nummer 2 hast du doch
Delphi-Quellcode:
bis
if Sender = Button1
Delphi-Quellcode:
.
if Sender = Button11
Was wäre denn wenn Du als Sender Button12 hast? Dann würde res nichts zugewiesen werden und ist somit nicht initialisiert worden. Sprich: imm wenn eine variable nicht explizit initilisert wird (wenn es z.B. durch ein IF beschränkt ist) spuckt der Compiler eine Warnung aus. @ DeddyH: Da ham wir es uns ja super aufgeteilt :stupid: |
Re: Meldung: Var nicht initzialisiert obwohl wert zugewiesen
Liste der Anhänge anzeigen (Anzahl: 3)
Zitat:
ich kann des progi ja mal posten ^^ is nix besonderes ... nur mal bissl basics ausm Kochbuch nachmachen ... weil ich gewisse dinge versäumt hab :P |
Re: Meldung: Var nicht initzialisiert obwohl wert zugewiesen
Zitat:
Und zu den "if Sender = blubb then": Eine Frage: wenn der Sender nun Button1 ist, warum muss der Prozessor denn danach noch wie doof testen, ob es nicht trotzdem noch Button2 sein kann? Weil das kann dann eigentlich nicht sein - ausser du hast in allen Variablen die gleiche Instanz. Somit: else if verwenden und nicht das Programm unnötigt schwerfälliger zu machen... |
Re: Meldung: Var nicht initzialisiert obwohl wert zugewiesen
Hallo,
es gibt nicht um Code. Die Warnung sagt, dass du auf die Variable res zugreifst (nach dem Case), obwohl sie nicht initialisiert sein könnte. Abhilfe1: else des case verwenden
Delphi-Quellcode:
Abhilfe2:
case bla of
bla1: ; bla2: ; else res:= 0.0; end; vor dem case alle var auf sinnvolle Werte setzen kein code ... Heiko |
Re: Meldung: Var nicht initzialisiert obwohl wert zugewiesen
Das Problem ist doch bereits gelöst !!!
Die beiden Code-Schnipsel waren Events ... diese Events werden ausgeführt wenn bei Nr.1 ein Ziffernbutton des Taschenrechners gedrückt wird und bei Nr2 ein Operatorbutton des Taschenrechners gedrückt wird. Ich hatte nur übersehen dass ich den Operatortasten noch nicht das Event OnOpButtonClick zugewiesen hatte. Das war alles ... und es funktioniert auch ;) könnts ja selber testen. |
Re: Meldung: Var nicht initzialisiert obwohl wert zugewiesen
Zitat:
kleiner schönheitsfehler ... sry |
Re: Meldung: Var nicht initzialisiert obwohl wert zugewiesen
Zitat:
Initialisieren heisst u.a., ihnen einen Initialwert (Startwert) zuweisen. Du hast den Variablen zwar einen Wert zugewiesen, aber es kann Fälle geben, bei denen kein Wert zugewiesen wird. Dann sind sie nicht initialiert. Ich mache es immer so, dass ich in einer Funktion/Prozedur/Methode alle Variablen ganz am Anfang auf einen Startwert setze. String auf '', Integer und Real auf 0, Zeiger auf nil, usw. Wenn der Compiler dann motzt, dass "Variable nicht benutzt", kann ich es immernoch rausnehmen. |
Re: Meldung: Var nicht initzialisiert obwohl wert zugewiesen
Hallo,
Zitat:
Delphi-Quellcode:
Das verhindert auch die Compiler-Warnung.
...;
case op of '+': res := op1 + op2; '-': res := op1 - op2; '*': res := op1 * op2; '/': res := op1 / op2; else raise Eception.CreateFmt('Ungültiger Operator ''%s''!', [op]); end; Zitat:
Delphi-Quellcode:
anhängen. Diese Variante verhindert ebenfalls eine Compiler-Warnung.
else
raise Exception.Create('Unbekannter Button'); jkr |
Re: Meldung: Var nicht initzialisiert obwohl wert zugewiesen
Zitat:
Delphi-Quellcode:
procedure TDemo_Form.ZeiButtonClick(Sender: TObject);
const CharArray: array[1..11] of Char = ('1', '2', '3', '4', '5', '6', '7', '8', '9', '0', ','); var zei: Char; begin . . zei := CharArray[(Sender as TButton).tag]; . . end; |
Re: Meldung: Var nicht initzialisiert obwohl wert zugewiesen
Hallo,
wenn der gezeigte Code Teil eines Taschenrechners sein soll, dann sind doch die Buttons wahrscheinlich mit den Ziffern und dem Komma bzw. Punkt beschriftet. Wieso nimmst Du dann nicht einfach
Delphi-Quellcode:
jkr
if (Sender as TButton).Caption = '' then
raise Exception.Create('Unbeschrifteter Button'); zei := (Sender as TButton).Caption[1] |
Re: Meldung: Var nicht initzialisiert obwohl wert zugewiesen
Man sollte seinen Programmablauf nicht von Inhalten auf der Oberfläche abhängig machen sondern immer von den extra gehaltenen Daten, aus denen die Oberfläche befüllt wird. Die Trennung Oberfläche und Daten ist wichtig und es ist ein Graus, wenn jemand anfängt so etwas zu programmieren. Schon alleine die Codeänderungen, wenn er anstatt dem "-" ein "Minus" reinschreibt und bei "*" ein "Multiplizieren". Schon fängt man an und ändert Code, der schon mal komplett fertig war. Oberflächen immer aus dem Spiel lassen. Anderes gutes Beispiel ist immernoch: funktioniert das Programm noch, wenn es übersetzt wurde? Wenn man so programmiert nicht.
Der gezeigte und genutzte Weg über den Instanzenvergleich ist schon ein gut gehbarer. Der Weg über den Tag ist auch ein Weg, der mir persönlich aber nicht so gefällt, weil man sich damit selbst die Möglichkeiten verbaut. Was ist, wenn es eine ähnliche Funktionalität mit einer andere Gruppe Elemente auf der Oberfläche benötigt wird? Keine eindeutigen Tags und wenn dann noch die Anwendung random features erzeugt, dann landet das falsche Elemente mit dem falschen Tag in der falschen Behandlungsroutine und die löst anhand des Tags was falsches aus. Anderes Gegenargument für Tags: Es ist schwer nachvollziehbar. Es ist für jeden anderen Kollegen, der an den Code ran muss ein riesiger Aufwand über den OI die Tag Verteilung zu ermitteln und auch den entsprechenden Ablauf. Den Code anzuschauen bringt rein gar nichts sondern man muss erst alles im Detail untersuchen. Dies erhöht die Wartbarkeit und die Lesbarkeit in's negativ unermeßliche. Daher: bester Ansatz immernoch der Instanzenvergleich. Man sieht welche Funktion bei welchen Element ausgelöst wird, der Code "dokumentiert" sich durch den benannten (!) Elementenamen fast komplett selbst und es kann ohne Probleme übersetzt werden, etc. |
Re: Meldung: Var nicht initzialisiert obwohl wert zugewiesen
[offtopic]
Ich bin auch ein Verfechter davon, GUI und Daten und Code zu trennen. Manche Leute haben aber einen totalen anderen Standpunkt. z.B. mein Vorgänger. Er hat alles was geht im OI eingetragen. Zudem hat er viel Programmlogik in die Datenbank ausgegliedert. Dadurch wurde der Code natürlich erheblich kürzer, aber sehr viel schlechter überschaubar und schlechter lesbar. Alleine, bis ich durchgestiegen bin, wie welche Query mit welcher Query verknüpft ist (MasterSource, KeySource, usw.) hat es lange gedauert und ich hab bis heute noch nicht alles rausgefunden. Weiterhin bezieht er sich im Code oft auf die Captio irgendwelcher Komponenten. Erschwerend kommt hinzu, dass ein Button mit Beschriftung "Hinzufügen" als Namen "addbtn" oder "Button1" hat. Somit kann man erst mal keine Verbindung vom Text "Hinzufügen" zu "addbtn" finden. Was ich aber gelernt habe: Lass die Leute so arbeiten, wie sie es haben wollen. Nicht jeder möchte seinen Code recyclen oder in einigen Monaten überhaupt noch verstehen. Solange die Typen nicht in meiner Abteilung arbeiten, kann es mir wurscht sein, was sie mit ihrem Code anstellen. Wenn von denen einer zu uns in die Firma kommen würde, würde er erst nochmal zur Welt kommen. Wenn man im Team arbeiten muss, geht so was eben nicht. So, wieder genug aufgeregt. [/offtopic] |
Re: Meldung: Var nicht initzialisiert obwohl wert zugewiesen
[OT]
Dann stell dir vor du würdest in eine Firma kommen und er wäre dein Vorgänger :lol: [/OT] |
Re: Meldung: Var nicht initzialisiert obwohl wert zugewiesen
Zitat:
Viel schlimmer wäre es, wenn er mein Vorgesetzter wäre. Ich glaube, ich würde sofort wieder kündigen. :shock: :? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:41 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