Autor |
Beitrag |
Caesar44
      
Beiträge: 44
|
Verfasst: Di 02.06.09 20:10
Guten Abend, nachdem gerade ebend mein anderes Problem großartig gelöst wurde habe ich folgendes Problem
In einer For-Schleife die wie folgt lautet
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| For i := 40 to 45 do begin .... .... .. end; |
dachte ich heißt i wird als 40 definiert und startet mit diesem Wert die Schleife
Im nächsten Schleifendurchgang müsste dann i doch 41 sein oder???
Bei mir wird i aus unerfindlichen Gründen nähmlich im zweiten durchlauf 1, obwohl ich es nicht nochmal definiert habe.
Grüße
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: Di 02.06.09 20:14
Sollte auch so sein.  Zeig doch mal, was in der For-Schleife passiert. Wie hast du denn die Werte von i überprüft?
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Di 02.06.09 20:15
Hm ne, 1 kann eigentlich nicht vorkommen.
Was passiert denn in der Schleife? Kann es sein, dass du i da veränderst (sollte eigentlich ne Compiler Warnung erzeugen..)
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 02.06.09 20:21
Moin!
Xentar hat folgendes geschrieben : | Hm ne, 1 kann eigentlich nicht vorkommen. |
Doch, der Compiler "optimiert" die Laufvariable, wenn in der Schleife nicht darauf zugegriffen wird.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Caesar44 
      
Beiträge: 44
|
Verfasst: Di 02.06.09 20:30
Hier passierts: Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| For p := 1 to 10 do begin If i-p*8 < 0 then break; Feld[i-8*p] :=1; end; Feld[i]:=2; |
Sobald Feld[i]:= 2 dran kommt wird i =1
Ist das diese "optimierung"?
Und ja es kommt eine Warnung: For-Schleifenvariable muss einfache Lokalvariable sein.
Muss ich i also lokal definieren?
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Di 02.06.09 20:33
Caesar44 hat folgendes geschrieben: | Und ja es kommt eine Warnung: For-Schleifenvariable muss einfache Lokalvariable sein.
Muss ich i also lokal definieren? |
Ja, steht da ja
Theoretisch müsste da auch noch eine 2. Warnung kommen, denn nach der Schleife ist i undefiniert. Genau das müsste er dir eigentlich auch noch sagen?
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: Di 02.06.09 20:34
Martok hat folgendes geschrieben : | Theoretisch müsste da auch noch eine 2. Warnung kommen, denn nach der Schleife ist i undefiniert. Genau das müsste er dir eigentlich auch noch sagen? |
Warum denn in diesem Beispiel nach der For-Schleife und nicht schon vorher?
Achso, du vermutest, dass die Schleifen in jeweils seperaten Prozeduren ausgeführt werden?
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Di 02.06.09 20:42
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Di 02.06.09 20:45
Ich hab jetzt einfach mal unmittelbar auf den Code geantwortet, da der erste da irgendwie keinen Zusammenhang mit hat
 ach, das ist ja ne andere Variable? Wo kommt denn die jetzt her?
Okay, ich erkläre offiziell dass ich nicht weiß, in welcher Reihenfolge der Code jetzt aufgerufen wird
Marc. hat folgendes geschrieben : | Warum denn in diesem Beispiel nach der For-Schleife und nicht schon vorher?  |
Vorher auch, klar.
Mit undefiniert meinte ich, dass man sich nicht darauf verlassen kann, dass die schleife Variable auch wirklich in der Richtung durchläuft. Der Compiler wird immer versuchen, auf 0 zu zählen, dazu werden ggf. noch interne Variablen benutzt. Oder auch nicht, wie Narses schon gesagt hat.
Wird unter anderem hier beschrieben, wo genau, müsste ich auch erst suchen 
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
Caesar44 
      
Beiträge: 44
|
Verfasst: Di 02.06.09 20:59
Hallo ihr seid klasse, Problem hat sich in Wohlgefallen aufgelöst, also kommt das nächste: Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| For p := 1 to 10 do begin If (i+p*7 > 64) and (i+p*7<>1) and (i+p*7<>9) and (i+p*7<>17) and (i+p*7<>25) and (i+p*7<>33) and (i+p*7<>41) and (i+p*7<>49) and (i+p*7<>57) then break; Feld[i+p*7]:=1; end; |
Ich habe unter anderem definiert das die Schleife enden soll,wenn i+p*7 = 49 ist.
Das müsste doch eigentlich bei p=3 eintreten oder?
28 plus 21 = 49.
Aber das Programm scheint das zu ignorieren. Villeicht mag es mich nicht mehr
Gruß Caesar
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: Di 02.06.09 21:08
|
|
koegi
      
Beiträge: 18
Win 7 64 bit
Delphi 2009 Professional
|
Verfasst: Di 02.06.09 21:20
Caesar44 hat folgendes geschrieben : | Hallo ihr seid klasse, Problem hat sich in Wohlgefallen aufgelöst, also kommt das nächste: Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| For p := 1 to 10 do begin If (i+p*7 > 64) and (i+p*7<>1) and (i+p*7<>9) and (i+p*7<>17) and (i+p*7<>25) and (i+p*7<>33) and (i+p*7<>41) and (i+p*7<>49) and (i+p*7<>57) then break; Feld[i+p*7]:=1; end; |
Ich habe unter anderem definiert das die Schleife enden soll,wenn i+p*7 = 49 ist.
Das müsste doch eigentlich bei p=3 eintreten oder?
28 plus 21 = 49.
Aber das Programm scheint das zu ignorieren. Villeicht mag es mich nicht mehr
Gruß Caesar |
Hallo, Caesar!
Oben steht if (i+p*7 > 64) and ...
Kann es sein, dass Du dich bei der ersten Bedingung vertan hast? ( if (i+p*7 <> 64) ...
Wenn ein Wert größer 64 ist, dann ist eine Prüfung auf Werte, die kleiner als 64 sind, sinnlos.
Den sinn des obigen Codes begreife ich leider auch nicht ganz...
Viele Grüße
Thomas
|
|
Caesar44 
      
Beiträge: 44
|
Verfasst: Di 02.06.09 21:31
Tut mir leid, der Code ist tatsächlich nicht ganz verständlich, wenn man das Programm nicht kennt.
es ist das acht Damen Problem. dabei müssen um die Dame bestimmte der 64 Felder besetzt werden. Die reihe also jedes +-feld8, die Spalte und noch die schrägen Felder. dabei rechne ich +7 felder in dem Fall des Quelltextes um die Felder nach schräg oben als besetzt zu markieren. Allerding soll die Schleife stoppen, wenn ein feld am obersten Rand bestzt wurde, weil die Schleife Sonst in der nächsten Spalte wieder von unten anfängt, was ja nicht sinn der sache ist.
Ich hoffe ich konnte es einigermaßen verständlich machen. Ich könnte statt "and" "or" nehmen oder?
So jetzt hab ich es richtig gemacht: Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| For p := 1 to 10 do begin If (i+p*7 > 64) or (i+p*7=1) or (i+p*7=9) or (i+p*7=17) or (i+p*7=25) or (i+p*7=33) or (i+p*7=41) or (i+p*7=49) or (i+p*7=57) then begin Feld[i+p*7]:=1; break; end; |
Jetzt werden alle Felder schräg oberhalb der Dame bis an die Kante besetzt
Grüße
|
|
koegi
      
Beiträge: 18
Win 7 64 bit
Delphi 2009 Professional
|
Verfasst: Di 02.06.09 21:44
Caesar44 hat folgendes geschrieben : | Tut mir leid, der Code ist tatsächlich nicht ganz verständlich, wenn man das Programm nicht kennt.
es ist das acht Damen Problem. dabei müssen um die Dame bestimmte der 64 Felder besetzt werden. Die reihe also jedes +-feld8, die Spalte und noch die schrägen Felder. dabei rechne ich +7 felder in dem Fall des Quelltextes um die Felder nach schräg oben als besetzt zu markieren. Allerding soll die Schleife stoppen, wenn ein feld am obersten Rand bestzt wurde, weil die Schleife Sonst in der nächsten Spalte wieder von unten anfängt, was ja nicht sinn der sache ist.
Ich hoffe ich konnte es einigermaßen verständlich machen. Ich könnte statt "and" "or" nehmen oder?
So jetzt hab ich es richtig gemacht: Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| For p := 1 to 10 do begin If (i+p*7 > 64) or (i+p*7=1) or (i+p*7=9) or (i+p*7=17) or (i+p*7=25) or (i+p*7=33) or (i+p*7=41) or (i+p*7=49) or (i+p*7=57) then begin Feld[i+p*7]:=1; break; end; |
Jetzt werden alle Felder schräg oberhalb der Dame bis an die Kante besetzt
Grüße |
Ei, sieh mal einer guck!
Plötzlich präsentierst Du uns hier eine or-Abfrage statt einer and-Abfrage!
So macht das ganze schon mehr Sinn...
Viele Grüße
Thomas
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 02.06.09 22:57
|
|