![]() |
Re: Wieder ein Variablen Problem - komme nicht weiter.
Zitat:
|
Re: Wieder ein Variablen Problem - komme nicht weiter.
Zitat:
Zitat:
|
Re: Wieder ein Variablen Problem - komme nicht weiter.
Hallo,
Zitat:
Er betrachtet die Prozudur losgelöst vom "Rest der Welt". Für ihn ist innerhalb der Prozedur nicht erkennbar, das cache immer und zu jedem Zeitpunkt einen Wert hat und er verlässt sich nicht darauf, dass eine Prozedur immer nur so aufgerufen wird, dass jede Variabel immer einen Wert hat. Wenn er immer und überall überprüfen müsste, dass jede Variabel zu jeder Zeit, zu jeder Bedingung immer über gültige Werte verfügt, so müsste er zur Compilezeit das Programm mit sämtlichen möglichen Kombinationen von Werten... durchrechnen. Der Compiler, der das kann, der weiß auch, das die Antwort auf alle Fragen 42 ist :wink: Zitat:
Stephan |
Re: Wieder ein Variablen Problem - komme nicht weiter.
Aber als Übergabeparameter ist sie laut Luckie ja auch nicht initialisiert :zwinker:. Ich frag mich nur, wozu es die Dinger dann überhaupt gibt.
|
Re: Wieder ein Variablen Problem - komme nicht weiter.
Zitat:
Stephan |
Re: Wieder ein Variablen Problem - komme nicht weiter.
Ok danke dir. Muss mir mal heute alles über Proceduren durchlesen. :roll:
|
Re: Wieder ein Variablen Problem - komme nicht weiter.
Delphi-Quellcode:
Wo ist sie jetzt initialisiert?
procedure foo(c: Real);
begin // tu was end; // ...; procedure bar; var cache: Real; begin foo(cache); end; |
Re: Wieder ein Variablen Problem - komme nicht weiter.
Davon war ja nicht die Rede. Das Spiel kannst Du natürlich endlos treiben.
|
Re: Wieder ein Variablen Problem - komme nicht weiter.
Hi!
Zuerst mal haben wir hier wohl das Mißverständnis, daß eine lokale Variable beim nächsten Prozeduraufruf noch ihren alten Wert habe - das mag bei anderen Programmiersprachen so sein, bei Delphi ist das nicht der Fall. Aufgrund des unter Windows ereignisgesteuerten Programmablaufs kann man ja auch nicht vorhersagen, in welcher Reihenfolge was aufgerufen wird - Tastatur- Maus- und Fensterereignisse passieren nun mal unvorhersehbar und rufen (sofern vom Programmierer da etwas geschrieben wurde) ihre Ereignisverarbeitungen auf. Wenn dann lokale Variablen als Zwischenspeicher verwendet werden könnten, kämen die merkwürdigsten Ergebnisse heraus. Bei Verwendung globaler Variablen kann das auch unter Delphi passieren. Leider hat der Fragesteller nicht die Zeile genannt, in der der Fehler gemeldet wird - die letzte Zeile dürfte es nicht sein. Hier mal Luckies Umformung des Codes mit meinen Anmerkungen, wo der Compiler warnen sollte:
Delphi-Quellcode:
Entweder cache als globale Variable im Formular haben oder als VAR-Parameter übergeben - dann natürlich vor dem ersten Aufruf der Prozedur das Initialisieren nicht vergessen.
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; //==> cache möglicherweise nicht initialisiert note := note + 1 / 2; end else if (jkzwei = 1) then begin note := cache; //==> cache möglicherweise nicht initialisiert note := note + 1 / 2; end else begin note := cache; //==> cache möglicherweise nicht initialisiert note := note - 5 / 15; end; cache := note; Label7.Caption := FloatToStr(RundeAufStelle(cache, 1)); end; Dabei könnte man dann auch gleich die übrigen globalen Werte per Parameter übergeben:
Delphi-Quellcode:
Gruß
procedure TForm1.Note (const FiCountCorrect, jkeins, jkzwei: integer; var cache: real);
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 := 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; Eos-PVU |
Re: Wieder ein Variablen Problem - komme nicht weiter.
Delphi-Quellcode:
Aber FiCountCorrect, jkeins, jkzwei sind doch nicht constant oder wie meinst du das?
procedure TForm1.Note (const FiCountCorrect, jkeins, jkzwei: integer; var cache: real);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:57 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