Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - for-do schleife ist fehler haft


Xearox - So 24.01.10 12:02
Titel: for-do schleife ist fehler haft

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
procedure TForm1.Button1Click(Sender: TObject);
var
  I,x:Integer;

begin
  test:=false;
  repeat
    for I:=1 to 10 do
    begin
      if ESchluessel.Text=Schluessel[I] then
      begin
        showmessage('Programm Erfolgreich Aktiviert');
        Test:=True;
      end;
    end;
  until test=true;


  if WrongKey=false then
  begin
    ShowMessage('Falscher Serial-Code, erneut eingeben oder mit eingeschränkter Funktionalität forfahren');
  end;

end;


So hier hab ich eine einfach for-do schleife, die ich mit hilfe einer Variablen I von 1 bis zu 10 laufen lassen möchte.
Gleichzeitig wird im programm geprüft, ob der eingetragene Schlüssel auch dem Schlüssel entspricht, der als Array festgelegt wurde...
Jedoch macht die for-do schleife nicht das, was sie soll, statt: 1,2,3,4,5,6,7,8,9,10 macht die 10,9,8,7,6,5,4,3,2,1...
und wenn ich I:=10 downto 1 mache macht die folgendes: -10,-9,-8,-7,-6,-5,-4,-3,-2,-1

Diese Werte bekomme ich im Debugger angezeigt...
Kann mir da jemand helfen?


jaenicke - So 24.01.10 12:09

Das ist vollkommen normal und eine Optimierung des Compilers. Die Schleife läuft aber korrekt was die verwendeten Werte im Quelltext angeht. Du siehst nur im Debugger die realen optimierten Werte, weil der die Optimierung nicht mitbekommt.

Zum Debuggen solltest du daher die Optimierung in den Compileroptionen ausschalten, musst nur eben daran denken diese wieder zu aktivieren, wenn du das Programm auslieferst. Denn je nach Programm kann dieses ohne Optimierung spürbar langsamer sein.


Xion - So 24.01.10 12:11


Delphi-Quelltext
1:
 if ESchluessel.Text[I]=Schluessel[I] then                    


müsste es nicht so heißen?

Dass der Debugger verbuggt ist, ist normal :D


jaenicke - So 24.01.10 12:13

Ach ja, dabei fällt mir auf:
user profile iconXearox hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
  until test=true;                    
Das wiederum wäre aber keine Folge der Optimierung, wenn da etwas schief geht, denn diese Zeile ist falsch, das kann böse ins Auge gehen [http://www.delphi-forum.de/viewtopic.php?p=548760#548760] und ist noch dazu vollkommen unlogisch [http://www.delphi-forum.de/viewtopic.php?p=560637#560637].
Mehr dazu steht hier [http://www.delphi-treff.de/tutorials/objectpascal/programmierung-mit-boolean-werten/page/4/].


Xearox - So 24.01.10 12:18

aber irgendwie ist das ganze ding schrott...macht nicht das, was er eig. machen soll...


jaenicke - So 24.01.10 12:22

In deinem Quelltext vergleichst du wie user profile iconXion schon geschrieben hat den gesamten Inhalt von ESchluessel mit deinem einzelnen Arrayeintrag. Bist du sicher, dass du das so meintest? Und nicht wie er geschrieben hat? :gruebel:

Zudem: Wenn test nie true wird, hast du eine Endlosschleife...


ALF - So 24.01.10 12:34

hi,

WrongKey wird ja auch nicht gesetzt, lediglich abgefragt.
Du erhälst zum schluss immer die Meldung (Falscher Code).

Gruss Alf


Xearox - So 24.01.10 12:42

so, ich Esel hab natürlich, die Prozedure nicht mit dringehabt, welche dafür da ist, die Arrays zu festzulegen...dadurch wurde das EditFeld immer mit '' überprüft...
also mit nichts...

hab das mit Wrongkey eingefügt, und nun sieht es so aus...

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
procedure TForm1.Button1Click(Sender: TObject);
var
  I,x:Integer;

begin
  I:=1;
  SchluesselFestlegen;
  Test:=false;
  WrongKey:=false;
  repeat
    for I:=1 to 10 do
    begin
      if ESchluessel.Text=Schluessel[I] then
      begin
        showmessage('Programm Erfolgreich Aktiviert');
        Test:=true;
        WrongKey:=true;
      end;
    end;
  until test=true;


  if WrongKey=false then
  begin
    ShowMessage('Falscher Serial-Code, erneut eingeben oder mit eingeschränkter Funktionalität forfahren');
  end;

end;


jaenicke - So 24.01.10 12:44

Wie schon zweimal gesagt, so wie du es hast funktioniert es nur, wenn in ESchluessel genau das drin ist wie in jedem Eintrag des Arrays...
user profile iconXearox hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
    for I:=1 to 10 do
    begin
      if ESchluessel.Text=Schluessel[I] then


Und den Fehler mit den boolschen Werten hast du auch noch drin. Liest du eigentlich die Beiträge?


ALF - So 24.01.10 12:48

Du kannst Dein repeat weglasen und wrongkey in der For schleife setzen und zum Schluss abfragen!

Delphi-Quelltext
1:
2:
3:
4:
5:
if WrongKey then
  showmessage('Programm Erfolgreich Aktiviert')
else
  ShowMessage('Falscher Serial-Code, erneut eingeben oder mit eingeschränkter Funktionalität forfahren')
end;

Gruss Alf


Xearox - So 24.01.10 13:17

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Wie schon zweimal gesagt, so wie du es hast funktioniert es nur, wenn in ESchluessel genau das drin ist wie in jedem Eintrag des Arrays...
user profile iconXearox hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
    for I:=1 to 10 do
    begin
      if ESchluessel.Text=Schluessel[I] then


Und den Fehler mit den boolschen Werten hast du auch noch drin. Liest du eigentlich die Beiträge?

ja klar, sonst würde ich ja nicht hier posten, oder?
und ich weiß auch, was du meinst...wenn im Edit Feld nicht der Key eingetragen wird, der Erwartet wird, kommt eine Endlosschleife zu stande, das problem hab ich ja...
Aber ich steige nicht dahin...wie ich nun das ohne dem machen kann...


ALF - So 24.01.10 13:21

Ich hab es dir auch geschrieben, schmeiss Deine Repaet raus und schon funct es :wink: ;


Xearox - So 24.01.10 13:23

wieso zum Henker mach ich da ein Repeat rein...was hat mich da geritten, wenn es auch ohne geht :(


Delete - So 24.01.10 14:05

Hier noch mal eine genaue Erläuterung, warum deine Schleife rückwärts läuft:
http://www.michael-puff.de/Artikel/ForRueckwaerts.shtml