Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Swap in FOR - NEXT Schleife funktioniert nicht?

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 16.07.2012, 18:17    Titel: Swap in FOR - NEXT Schleife funktioniert nicht? Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 16.07.2012, 18:31    Titel: Antworten mit Zitat

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, 18:35, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 16.07.2012, 18:35    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4597
Wohnort: ~/

BeitragVerfasst am: 16.07.2012, 19:03    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 16.07.2012, 19:04    Titel: Antworten mit Zitat

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 happy

btw: versteh ich den Sinn hinter dieser For/Next ohnehin nicht..
wozu die schleife wenn 'i' gar nicht genutzt wird?
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 16.07.2012, 19:14    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 16.07.2012, 19:19    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 16.07.2012, 19:23    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4597
Wohnort: ~/

BeitragVerfasst am: 16.07.2012, 23:15    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 17.07.2012, 17:24    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4597
Wohnort: ~/

BeitragVerfasst am: 17.07.2012, 17:42    Titel: Antworten mit Zitat

Zitat:
Edit: Beides überprüft das gleiche.

Natürlich. Sonst hätte ich es ja auch nicht so hingeschrieben. zwinkern
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 17.07.2012, 18:13    Titel: Antworten mit Zitat

nemored hat Folgendes geschrieben:
Zitat:
Edit: Beides überprüft das gleiche.

Natürlich. Sonst hätte ich es ja auch nicht so hingeschrieben. zwinkern


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
Benutzer-Profile anzeigen Private Nachricht senden
Muttonhead



Anmeldungsdatum: 26.08.2008
Beiträge: 562
Wohnort: Jüterbog

BeitragVerfasst am: 18.07.2012, 22:22    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1037
Wohnort: Niederbayern

BeitragVerfasst am: 27.07.2012, 01:57    Titel: Antworten mit Zitat

@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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz