|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1047 Wohnort: Niederbayern
|
Verfasst am: 16.07.2012, 17:17 Titel: Swap in FOR - NEXT Schleife funktioniert nicht? |
|
|
Code: | SWAP paarungen(ppr,1), paarungen(ppr,2) |
Code: | for i = 2 to ppr
SWAP paarungen(ppr,1), paarungen(ppr,2)
next |
Bei dem Befehl Swap sollte er die Paarungen tauschen, was er aber in der For - Next Schleife nicht macht.
Wer mehr Quellcode benötigt, schaut sich den Code von Stop an. Da ist so ein Swapbefehl drin. Únd dieses Swap habe ich in eine For - Next Schleife gesetzt. Normalerweise sollte er alle Paarungen tauschen. Genau obiger Code funktioniert nicht. Er sollte alle Paarungen tauschen? Sollte er nur jede 2. (gerade) Paarung tauschen, habe ich folgendes überlegt:
Code: | for i = 2 to ppr
IF ppr/2 = int(ppr/2) THEN
SWAP paarungen(ppr,1), paarungen(ppr,2)
END IF
NEXT |
Auch das funktioniert nicht! Warum? Habe ich einen Denkfehler?
Nur wenn es funktioniert, könnte ich einen Algorithmus für Rutschsystem schreiben.
Habe sonst keine Idee.
Gruß
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
Eternal_pain
Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 16.07.2012, 17:31 Titel: |
|
|
Wichtig wäre noch zu wissen von welchen Typ 'paarungen()' ist
Ohne das Problem genauer auf den Grund gegangen zu sein hatte ich mit Swap selbst schon so meine Probleme gehabt.
Swap vertauscht einen wert wie er ihn übergeben bekommt, als UDT oder Pointer swapt er zB dann nicht die darin beinhalteten Werte sondern nur die Adresse (hier vermutlich die Basisadresse, welches die selbe ist), was im Verlauf des Programms schon zu recht unerwarteten 'Ereignisen' führen kann...
sowas hier aber funktioniert problemlos...
Code: |
Dim test(0 to 10,0 to 1) as Integer
For l as Integer=0 to 10
for d as integer = 0 to 1
test(l,d) = (l+1)*(d+1)
next d
next l
for l as integer=0 to 10
locate (l+1),1:?test(l,0),test(l,1)
swap test(l,0),test(l,1)
locate (l+1),25:?test(l,0),test(l,1)
next l
sleep |
Wenn Du mit UDT's/Adressen arbeitest musst zu den Inhalt explizit 'swappen'
zB
Code: |
swap paarungen(ppr,1).inhalt,paarungen(ppr,2).inhalt
|
_________________
Zuletzt bearbeitet von Eternal_pain am 16.07.2012, 17:35, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1047 Wohnort: Niederbayern
|
Verfasst am: 16.07.2012, 17:35 Titel: |
|
|
Im Quellcode habe ich folgende Zeile drin:
Code: | REDIM SHARED AS INTEGER paarungen(1 to 1, 1 to 2) |
liegt es vielleicht an der Zeile, weil die Werte nur bis 1 declariert sind?
Gruß
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4648 Wohnort: ~/
|
Verfasst am: 16.07.2012, 18:03 Titel: |
|
|
Wie groß ist ppr? Wenn ppr <> 1 ist, hast du einen Speicherzugriffsfehler (auch wenn du vielleicht "Glück" hast und das Programm weiterläuft). Ist ppr = 1 dann wird die Schleife
Code: | for i = 2 to ppr
SWAP paarungen(ppr,1), paarungen(ppr,2)
next |
nicht ausgeführt. Von 2 nach 1 in Schrittweite 1 - da kann nichts ausgeführt werden. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
Eternal_pain
Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 16.07.2012, 18:04 Titel: |
|
|
Ich glaube das hat hier nichts mit Swap zu tun.
Wenn ich mir deine For/Next schleife angucke und sehe das bei dir ppr eigentlich (jedenfalls aus den codesnippets herauslesend) nur 1 sein kann
du aber eine for/next (2 to 1) hast ohne ein step -1 dann wird die For/Next schleife gar nicht ausgeführt...
Edit: nemored war schneller und ausführlicher
btw: versteh ich den Sinn hinter dieser For/Next ohnehin nicht..
wozu die schleife wenn 'i' gar nicht genutzt wird? _________________
|
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1047 Wohnort: Niederbayern
|
Verfasst am: 16.07.2012, 18:14 Titel: |
|
|
nemored hat Folgendes geschrieben: | Wie groß ist ppr? Wenn ppr <> 1 ist, hast du einen Speicherzugriffsfehler (auch wenn du vielleicht "Glück" hast und das Programm weiterläuft). Ist ppr = 1 dann wird die Schleife
Code: | for i = 2 to ppr
SWAP paarungen(ppr,1), paarungen(ppr,2)
next |
nicht ausgeführt. Von 2 nach 1 in Schrittweite 1 - da kann nichts ausgeführt werden. |
ppr íst unterschiedlich groß.
ppr kann 13 sein oder aber auch 500 oder sogar nur 3.
Die For - Next Schleife wird schon ausgeführt. Das habe ich getestet!
Guß
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
Eternal_pain
Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 16.07.2012, 18:19 Titel: |
|
|
In diesem Fall jedenfalls liegt das Problem nicht an Swap, eher an den Restlichen Code.
Ich vermute mal das ganze sollte eher so aussehen:
Code: | for i = 2 to ppr
SWAP paarungen(i,1), paarungen(i,2)
next |
Wobei vorher noch zu prüfen wäre ob das Array auch ausreichend gross dimensioniert wurde... _________________
|
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1047 Wohnort: Niederbayern
|
Verfasst am: 16.07.2012, 18:23 Titel: |
|
|
Eternal_pain hat Folgendes geschrieben: | In diesem Fall jedenfalls liegt das Problem nicht an Swap, eher an den Restlichen Code.
Ich vermute mal das ganze sollte eher so aussehen:
Code: | for i = 2 to ppr
SWAP paarungen(i,1), paarungen(i,2)
next |
Wobei vorher noch zu prüfen wäre ob das Array auch ausreichend gross dimensioniert wurde... |
Selbst so funktioniert es nicht in meinem Quellcode nicht.
Habe ich auch schon versucht!
Edit: Jetzt funktioniert es!
Das war der Fehlerhafte Code:
Code: | for i = 2 to ppr
IF ppr/2 = int(ppr/2) THEN
SWAP paarungen(i,1), paarungen(i,2)
END IF
next |
Gruß
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4648 Wohnort: ~/
|
Verfasst am: 16.07.2012, 22:15 Titel: |
|
|
Trotzdem solltest du DRINGEND das Array groß genug dimensionieren!
Code: | REDIM SHARED AS INTEGER paarungen(1 to 1, 1 to 2) |
ist zu klein für einen Zugriff auf paarungen(500, 1) - außer du hast vorher noch ein weiteres REDIM, das es auf die benötigte Größe anpasst.
Code: | IF ppr/2 = int(ppr/2) THEN |
eleganter und schneller wäre
Code: | IF (ppr mod 2) = 0 THEN |
_________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1047 Wohnort: Niederbayern
|
Verfasst am: 17.07.2012, 16:24 Titel: |
|
|
nemored hat Folgendes geschrieben: | Trotzdem solltest du DRINGEND das Array groß genug dimensionieren!
Code: | REDIM SHARED AS INTEGER paarungen(1 to 1, 1 to 2) |
ist zu klein für einen Zugriff auf paarungen(500, 1) - außer du hast vorher noch ein weiteres REDIM, das es auf die benötigte Größe anpasst.
Code: | IF ppr/2 = int(ppr/2) THEN |
eleganter und schneller wäre
Code: | IF (ppr mod 2) = 0 THEN |
|
Ich habe das so nicht geschrieben! Das war die Idee von Muttonhead!
Aber ich glaube das eine überprüft gerade Zahlen und das andere ungerade Zahlen. Oder?
Edit: Beides überprüft das gleiche.
Edit2: Habe das vorher schon groß genug dimensioniert! Habe nur die Zeile aus dem alten Quellcode genommen. _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4648 Wohnort: ~/
|
Verfasst am: 17.07.2012, 16:42 Titel: |
|
|
Zitat: | Edit: Beides überprüft das gleiche. |
Natürlich. Sonst hätte ich es ja auch nicht so hingeschrieben. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1047 Wohnort: Niederbayern
|
Verfasst am: 17.07.2012, 17:13 Titel: |
|
|
nemored hat Folgendes geschrieben: | Zitat: | Edit: Beides überprüft das gleiche. |
Natürlich. Sonst hätte ich es ja auch nicht so hingeschrieben. |
Mittlerweile habe ich keine der beiden Zeilen im Quellcode mehr drin, da ich den Algorithmus für Rutschsystem nicht hinbekomme. _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
Muttonhead
Anmeldungsdatum: 26.08.2008 Beiträge: 564 Wohnort: Jüterbog
|
Verfasst am: 18.07.2012, 21:22 Titel: |
|
|
ALWIM hat Folgendes geschrieben: |
Mittlerweile habe ich keine der beiden Zeilen im Quellcode mehr drin, da ich den Algorithmus für Rutschsystem nicht hinbekomme. |
mal überprüfen,ist nur ne Idee:
Code: | dim shared as integer spieler,runden,ppr,merkespieler,rotation,r,i
redim shared as integer paarungen(1 to 1, 1 to 2)
input "Anzahl Spieler:",spieler
if spieler<3 then end
'Partien pro Runde,Rundenzahl festlegen
if (spieler mod 2) = 0 then
runden=spieler-1
ppr=spieler/2
else
runden=spieler
ppr=(spieler-1)/2
end if
redim paarungen(1 to ppr, 1 to 2)
if (spieler mod 2) = 0 then merkespieler=2 else merkespieler=1
for r as integer=1 to runden
if (spieler mod 2) = 0 then 'gerade Spielerzahl
'Spieler 1 immer an Brett 1 erstmal "oben"
paarungen(1,1)=1
'restliche "obere" Spieler setzen von Brett 2 bis letztes Brett(ppr)
rotation=merkespieler
for i=2 to ppr
paarungen(i,1)=rotation
rotation +=1
if rotation>spieler then rotation=2
next i
'"untere" Spieler setzen vom letztem Brett bis ersten Brett
for i=ppr to 1 step -1
paarungen(i,2)=rotation
rotation +=1
if rotation>spieler then rotation=2
next i
merkespieler=paarungen(1,2)
else 'ungerade Spielerzahl
'"obere" Spieler setzen von Brett 1 bis letztes Brett(ppr)
rotation=merkespieler
for i=1 to ppr
paarungen(i,1)=rotation
rotation +=1
if rotation>spieler then rotation=1
next i
'"untere" Spieler setzen vom letztem Brett bis ersten Brett
for i=ppr to 1 step -1
paarungen(i,2)=rotation
rotation +=1
if rotation>spieler then rotation=1
next i
'merkespieler ist hier auch der Spieler, der in dieser Runde aussetzt
merkespieler=paarungen(1,2)+1
if merkespieler>spieler then merkespieler=1
end if
'damit müßten die Paarungen sowohl bei gerader als auch bei ungerader Spielerzahl stimmen
'Bretter drehen
'da im Array der "obere" Spieler immer weiß hat (das Brett ist am Tisch angenagelt), müssen halt die Spieler die Plätze tauschen.
'wäre dies in der Realität auch so, würden alle Spieler in Schlangenlinien beim Rutschen um die Tische laufen!!!
'bei gerader Spielerzahl dreht Brett 1 einmal pro Runde, bedeutet alle geraden Runden ist schwarz oben
if ((spieler mod 2)=0) and ((r mod 2) = 0) then swap paarungen(1,1),paarungen(1,2)
'egal ob gerade oder ungerade Spielerzahl, jedes 2. Brett ist gedreht
for i=2 to ppr step 2
swap paarungen(i,1),paarungen(i,2)
next i
'Ausgabe:
print "R:"& r
for i=1 to ppr
print paarungen(i,1)&"-"&paarungen(i,2)&" ";
next i
print:print
next r
sleep
end |
Mutton
edit:
Fehlerteufel:code funzt nur bei gerader Spielerzahl....
edit2:
so, jetzt aber. Stimmendie Paarungen???
edit3:
Code nochmals überarbeitet!! Final? |
|
Nach oben |
|
|
ALWIM
Anmeldungsdatum: 08.08.2006 Beiträge: 1047 Wohnort: Niederbayern
|
Verfasst am: 27.07.2012, 00:57 Titel: |
|
|
@Muttonhead:
Quellcode funktioniert! Müsste richtig auslosen. Habe aber den Code noch nicht so ganz genau mit Swiss-Chess überprüfen können.
Da ich den Fehler endlich gefunden habe, funktionieren jetzt auch die Paarungen in meinem STOP-Programm.
Fehler:
Zitat: | Ich lag mit meiner Vermutung am Anfang doch richtig. Ein Bezeichner bekam im Quellcode keinen Wert zugewiesen! Damit konnte er nichts auslosen. |
Ein paar Kleinigkeiten müssen noch überprüft werden und dann kann Projekt 2 (Punkteeingabe) beginnen!!!
Ich habe schon mal in Qbasic für Stop eine Punkteeingabe realisiert, aber halt mit Kreuztabelle! Ob ich die andere Möglichkeit die es noch gibt hinbringe, kann ich noch nicht sagen. Ich kann es ja mal versuchen.
Zitat: | Möglichkeit 2:
Müller Jens - Weber Didi 0-1
Gruber Hans - Huber Daniel 1/2
Bauer Markus - Kust Severin 1-0
Rem Otto - Schnelldorfer Egwin +/- |
Gruß
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|