switch/goto
-
Hallo
Kann mir jemand bei meinem Problem helfen?Ich habe ein Gitter mit L*L=N Punkten.
Auf dieses Gitter setze ich irgendwo zwei Variable i1 und i2.
Im Loop:
Wenn i1=i2 wird entweder i1 zu irgendeinem Nachbar verschoben (shift()), oder beide Variable werden wieder zufällig auf einen anderen Punkt gesetzt (mit einer bestimmten Wahrscheinlichkeit - move()).
Wenn beide Variable umplatziert werden, wird die Schleife verlassen.
Wird verschoben, dann solange bis i1 wieder mit i2 zusammenfällt.Nun kommt der Punkt bei dem ich Probleme habe:
Die Schleife wird dann noch nicht verlassen, sondern es wird wieder entschieden, ob umplatziert wird oder ob i1 verschoben wird...Ich weiss, man soll goto nicht unbedingt verwenden, aber ich habe sonst keine Idee. Ja, und nebenbei funktioniert das mit dem goto sowieso nicht (endlosschleife!)
Hier mal mein Idee:
for (int t = 0; t < steps; t++) //# of closed path { double p = drand48(); int x; again: if ((i1 == 12) && (p < p0)) { x = 1; } else if ((i1 == i2) && (p >= p0)) { x = 2; } switch (x) { case 1: move(); break; case 2: do shift(); while (i1 != i1); default: p = drand48(); goto again; break; } count_bonds(); }kann mir jemand sagen, wie man das elegant löst. Zerbreche mir schon seit Stunden den Kopf.
danke
nijntje
-
continue - na gut. nicht ganz, da stehen ja noch 2 zeilen drüber

-
Du hast bei
while (i1 != i1);einen Tippfehler. Außerdem fehlt dir in diesem Zweig dasbreak. Wenn i1 != i2 ist, werden beide Variablen nicht verändert und du bist in einer Endlosschleife. Ist die Gleichheit etwa immer gegeben?Edit: Achso, es gibt einen Pfad, bei dem
xnichts zugewiesen wird, sodass du undefiniertes Verhalten hast. Praktisch gesehen, könnte in x zufällig der Wert 1 oder 2 stehen, weil du x nicht initialisierst.
-
Jetzt hab ich ganz vergessen, auf dein Problem einzugehen:
for (int t = 0; t < steps; t++) //# of closed path { if(i1 == i2) { while(drand48() >= p0) shiftUntilEqual(); move(); return; } count_bonds(); }Ergibt natürlich noch nicht so viel Sinn, weil ich aus deinem Code aus obigen Gründen nicht ganz schlau werde.
-
continue geht doch. hast ja dort das gleiche stehen.
for (int t = 0; t < steps; t++) //# of closed path { double p = drand48(); int x; //initialisierung fehlt if ((i1 == 12) && (p < p0)) { x = 1; } else if ((i1 == i2) && (p >= p0)) { x = 2; } switch (x) { case 1: move(); break; case 2: do shift(); //spielt das ne rollt, was shift macht? while (i1 != i1); //? default: continue; } count_bonds(); }
-
Danke für die schnelle Antwort.

Also ich bin leider nur anfängerin in c++.
ich dachte, wenn man das break weglässt, wird der nächste schritt im switch auch ausgeführt, das ist ja das was ich eigentlich will.
wenn i1 sich mit i2 auf dem Punkt wieder trifft, soll zuerst entschieden werden (mit p), ob jetzt beide Punkte versetzt werden sollen (move()) und damit die Schleife verlassen, oder ob i1 wieder zu einem Nachbar geht (das wieder solange, bis i1=12).void Worm::move(void) { double c = drand48(); i = c*N; i1 = i; //both endpoints on the same site i2 = i; cout << "move to: i=" << i << endl; }ja und shift() ist etwas sehr lang. hier nur der schritt indem die variable verändert werden:
i1 = j; i = i1;wobei i nach j geht. j ist der nächste Nachbar.
p.s. danke wegen dem tippfehler
-
es wird eben zuerst vorgeschlagen mit einer bestimmten wahrscheinlichkeit zu move() oder shift(). move() wird mit p=1 akzeptiert, falls vorgeschlagen.
shift() wird mit einer bestimmten wahrscheinlichkeit akzeptiert, die eben in dieser funktion integriert ist.(In shift wird noch gezeichnet und gelöscht und die nachbarn vorgeschlagen und die wahrscheinlichkeiten berechnet... aber das spielt jetzt keine rolle, oder?)
initialisierung von x=0??
nochmals danke ihr beiden
-
ach ja, da fehlt nur die Initialisierung...
dann klappts!
danke