Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Wieder ein Variablen Problem - komme nicht weiter. (https://www.delphipraxis.net/121566-wieder-ein-variablen-problem-komme-nicht-weiter.html)

jfheins 30. Sep 2008 14:17

Re: Wieder ein Variablen Problem - komme nicht weiter.
 
Zitat:

Zitat von AlexII
Zitat:

Zitat von jfheins
Woher sind die denn bitte gefüllt? Vom vorherigen Aufruf?

Etwa nicht? :coder2:

Bei lokalen Variablen: Nein, natürlich nicht ;)

AlexII 30. Sep 2008 14:21

Re: Wieder ein Variablen Problem - komme nicht weiter.
 
Zitat:

Zitat von nahpets
Der Compiler weiss nicht, dass FiCountCorrect = 0, was ist denn, wenn FiCountCorrect = 42 (warum auch immer).

Wieso nicht? Beim FormCreate wird die auf Null gesetzt und danach in ner Schleife immer verändert. Also sie ist immer im Griff.



Zitat:

Zitat von nahpets
Bau doch am Anfang einfach direkt hinter dem ersten begin
Delphi-Quellcode:
cache := StrToFloat(Label3.Caption);

Ich wollte die Label3 gerade los werden, aber anscheinend lasse ich den Code so wie am Anfang, mit dem Label halt.

nahpets 30. Sep 2008 14:39

Re: Wieder ein Variablen Problem - komme nicht weiter.
 
Hallo,
Zitat:

Zitat von Alex
Wieso nicht? Beim FormCreate wird die auf Null gesetzt und danach in ner Schleife immer verändert. Also sie ist immer im Griff.

Der Compiler guckt nicht den gesamten Quelltext und alle eingebundenen Units... durch, ob für eine bestimmte Situation eventuell unter Umständen vielleicht zu einem bestimmten Zeitpunkt eine bestimmte Bedingung irgendwo Aufgrund des Setzens von irgendwelchen Variabeln im Quelltext (ggfls. auch das Auslesen von Dateien, Datenbanken...) erfüllt sein könnte.
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:

Zitat von Alex
Ich wollte die Label3 gerade los werden, aber anscheinend lasse ich den Code so wie am Anfang, mit dem Label halt.

Einmal musst Du den Wert von Label3.Caption in die Prozedur bekommen, entweder in der Prozedur per Zuweisung oder eben als Parameter, wie von DeddyH schon beschrieben.

Stephan

DeddyH 30. Sep 2008 14:46

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.

nahpets 30. Sep 2008 14:50

Re: Wieder ein Variablen Problem - komme nicht weiter.
 
Zitat:

Zitat von DeddyH
Aber als Übergabeparameter ist sie laut Luckie ja auch nicht initialisiert :zwinker:. Ich frag mich nur, wozu es die Dinger dann überhaupt gibt.

Was? die Variabeln, schreiben wir überall 42 rein 8)
Stephan

AlexII 30. Sep 2008 14:51

Re: Wieder ein Variablen Problem - komme nicht weiter.
 
Ok danke dir. Muss mir mal heute alles über Proceduren durchlesen. :roll:

Luckie 30. Sep 2008 14:51

Re: Wieder ein Variablen Problem - komme nicht weiter.
 
Delphi-Quellcode:
procedure foo(c: Real);
begin
  // tu was
end;

// ...;

procedure bar;
var
  cache: Real;
begin
  foo(cache);
end;
Wo ist sie jetzt initialisiert?

DeddyH 30. Sep 2008 14:53

Re: Wieder ein Variablen Problem - komme nicht weiter.
 
Davon war ja nicht die Rede. Das Spiel kannst Du natürlich endlos treiben.

Eos-PVU 30. Sep 2008 15:10

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:
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;
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.
Dabei könnte man dann auch gleich die übrigen globalen Werte per Parameter übergeben:

Delphi-Quellcode:
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;
Gruß

Eos-PVU

AlexII 30. Sep 2008 15:22

Re: Wieder ein Variablen Problem - komme nicht weiter.
 
Delphi-Quellcode:
procedure TForm1.Note (const FiCountCorrect, jkeins, jkzwei: integer; var cache: real);
Aber FiCountCorrect, jkeins, jkzwei sind doch nicht constant oder wie meinst du das?


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:27 Uhr.
Seite 3 von 4     123 4      

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