![]() |
Wieder ein Variablen Problem - komme nicht weiter.
Hallo, muss erst mal sagen, dass bis Gestern nie Probleme oder Fehler mit Variablen hatte, aber seit Gestern schon das zweite und zwar:
Habe bis jetzt diesen Code gehabt:
Delphi-Quellcode:
und hab diesen etwas auf diese Version geändert, aber der spinnt jetzt auf ein mal und ich bekomme eine Warnung "[Warnung] MAIN.pas(134): Variable 'cache' ist möglicherweise nicht initialisiert worden" Weiß nicht wo der Fehler liegt.
function RundeAufStelle(zahl: double; stellen: integer): double;
var multi: double; begin multi:=IntPower(10, stellen); zahl:=round(zahl*multi); result:=zahl/multi; end; procedure TForm1.Note; var note: Real; begin if (FiCountCorrect=0) and (jkeins=1) and (jkzwei=1) then begin note:=7; end else if (FiCountCorrect=0) and (jkeins=1) then begin note:=65/10; end else if (FiCountCorrect=0) and (jkzwei=1) then begin note:=65/10; end else if (FiCountCorrect=0) then begin note:=6; end else if (jkeins=1) then begin note:=StrToFloat(Label3.Caption); note:=note+1/2; end else if (jkzwei=1) then begin note:=StrToFloat(Label3.Caption); note:=note+1/2; end else begin note:=StrToFloat(Label3.Caption); note:=note-5/15; end; Label3.Caption:=FloatToStr(note); Label7.Caption:=FloatToStr(RundeAufStelle(StrToFloat(Label3.Caption), 1)); end;
Delphi-Quellcode:
function RundeAufStelle(zahl: double; stellen: integer): double;
var multi: double; begin multi:=IntPower(10, stellen); zahl:=round(zahl*multi); result:=zahl/multi; end; procedure TForm1.Note; var note, cache: Real; begin if (FiCountCorrect=0) and (jkeins=1) and (jkzwei=1) then begin note:=7; end else if (FiCountCorrect=0) and (jkeins=1) then begin note:=65/10; end else if (FiCountCorrect=0) and (jkzwei=1) then begin note:=65/10; end else if (FiCountCorrect=0) then begin note:=6; end else if (jkeins=1) then begin note:=cache; note:=note+1/2; end else if (jkzwei=1) then begin note:=cache; note:=note+1/2; end else begin note:=cache; note:=note-5/15; end; cache:=note; Label7.Caption:=FloatToStr(RundeAufStelle(cache, 1)); end; |
Re: Wieder ein Variablen Problem - komme nicht weiter.
Sagt doch die Fehlermeldung, sie kann einen nicht definierten Wert annehmen.
Du gibst sie am Ende aus
Delphi-Quellcode:
Aber welchen Wert hat sie, wenn schon die erste if-Bedingung nicht zutrifft?
Label7.Caption:=FloatToStr(RundeAufStelle(cache, 1));
Und du solltest dringend dein Einrückungsstil überdenken und zumindest bei Postings hier im Forum dich ungefähr an den Borlandstil halten. |
Re: Wieder ein Variablen Problem - komme nicht weiter.
Aber wenn ich die Variable cache durch Labe3.Caption ersetzte funktionier alles bestens. Ich verstehe die Logik nicht, hab ja nix verändert, nur label durch Variable ersetzt.
|
Re: Wieder ein Variablen Problem - komme nicht weiter.
Die Caption deines Labels hat einen definierten Anfangswert.
|
Re: Wieder ein Variablen Problem - komme nicht weiter.
Zitat:
|
Re: Wieder ein Variablen Problem - komme nicht weiter.
Luckie kannst du mir vielleicht wenigstens nen Tipp geben wie ich den Code richtig schreiben soll. :gruebel:
|
Re: Wieder ein Variablen Problem - komme nicht weiter.
Und wie kannst du da erkennen, welches end zu welchem begin gehört?
Was ist besser lesbar? Deins:
Delphi-Quellcode:
Oder meins:
procedure TForm1.Note;
var note, cache: Real; begin if (FiCountCorrect=0) and (jkeins=1) and (jkzwei=1) then begin note:=7; end else if (FiCountCorrect=0) and (jkeins=1) then begin note:=65/10; end else if (FiCountCorrect=0) and (jkzwei=1) then begin note:=65/10; end else if (FiCountCorrect=0) then begin note:=6; end else if (jkeins=1) then begin note:=cache; note:=note+1/2; end else if (jkzwei=1) then begin note:=cache; note:=note+1/2; end else begin note:=cache; note:=note-5/15; end; cache:=note; Label7.Caption:=FloatToStr(RundeAufStelle(cache, 1)); end;
Delphi-Quellcode:
Und dann sieht man auf den ersten Blick den Grund der Warnung.
procedure TForm1.Note;
var note, cache : Real; begin if (FiCountCorrect = 0) and (jkeins = 1) and (jkzwei = 1) then begin note := 7; end else if (FiCountCorrect = 0) and (jkeins = 1) then begin note := 65 / 10; end else if (FiCountCorrect = 0) and (jkzwei = 1) then begin note := 65 / 10; end else if (FiCountCorrect = 0) then begin note := 6; end else if (jkeins = 1) then begin note := cache; note := note + 1 / 2; end else if (jkzwei = 1) then begin note := cache; note := note + 1 / 2; end else begin note := cache; note := note - 5 / 15; end; cache := note; Label7.Caption := FloatToStr(RundeAufStelle(cache, 1)); end; |
Re: Wieder ein Variablen Problem - komme nicht weiter.
Ich würde "cache" als Übergabeparameter definieren, dann kann m.E. nicht viel schiefgehen.
|
Re: Wieder ein Variablen Problem - komme nicht weiter.
Ich hab mich schon an meine bzw. staatliche (ist wirklich so, zu mindest in meiner Schule) Schreibweise gewöhnt, aber danke für die Muster. :thumb:
Ich komme mir schon dumm vor, aber sehe nix. Also die vierte Bedingung wird am Anfang immer erfüllt - note:=6; danach wird nach unten gesprungen und
Delphi-Quellcode:
ausgeführt, somit ist die Variable cache gefüllt. Als nächste wird die letzte Anweisung immer ausgeführt, dabei sind doch alle zwei Variablen schon gefühlt. :wall:
cache:=note;
Label7.Caption:=FloatToStr(RundeAufStelle(cache, 1)); |
Re: Wieder ein Variablen Problem - komme nicht weiter.
Aber das weiß ja der Compiler nicht, denn woher soll er wissen, dass FiCountCorrect immer null ist. Da stellt sich mir die Frage, warum nimmst du es als Bedingung auf, wenn es doch sowieso immer null?
Und was das else angeht:
Delphi-Quellcode:
cache ist undefiniert und es wird auch nicht definierter, wenn du es hin und her schiebst. Denn dann machst du:
else
begin note := cache; note := note - 5 / 15; end;
Delphi-Quellcode:
cache := note;
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:06 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