WPC13
-
TGGC schrieb:
Lösen wir uns von Volkards Beispiel, er sprach ja auch noch von anderen Sachen. Ich mache einfach ((char)0x12345678)= 1000; Was ist daran gegen den Standard? Und wenn dort zufällig die Punktzahl steht? Kann ja mal passieren.
Du sagst es: "Zufällig". Der Standard definiert die Semantik eines Programms. Wenn die Semantik eines Ausdrucks nicht definiert ist, dann kann da natürlich auch was passieren. Normalerweise etwas, das von den speziellen Eigenschafter der Implementation, des Rechners, des Betriebssystems oder der Mondphase abhängt, aber es ist eben "undefiniertes Verhalten". Ein Programm ist standardkonform, wenn es nicht von undefiniertem Verhalten abhängt.
u.a. Abschnitt 1.4§1
-
ness schrieb:
Umdrehen?
Ich sagte, wenn du dich nicht mehr bewegen kannst. Das umfasst u.a. auch, dass umdrehen und weglaufen nicht geht. Weil du z.B. auf dem Startfeld eingekeilt bist o.ä.
-
Ich glaube der Jester wird
field_[x][y] = FieldState(field_[x][y] | 3);
noch in
field_[x][y] = FieldState(field_[x][y] | monster);
ändern
-
ja, werde ich tun. Das war ein Fehler.
Kommt davon wenn man den Code bis spät in die Nacht hackt. Es soll natürlich nicht immer in nem Loch wohnen.Danke für den Hinweis.
-
Bashar schrieb:
TGGC schrieb:
Lösen wir uns von Volkards Beispiel, er sprach ja auch noch von anderen Sachen. Ich mache einfach ((char)0x12345678)= 1000; Was ist daran gegen den Standard? Und wenn dort zufällig die Punktzahl steht? Kann ja mal passieren.
Du sagst es: "Zufällig". Der Standard definiert die Semantik eines Programms. Wenn die Semantik eines Ausdrucks nicht definiert ist, dann kann da natürlich auch was passieren.
Nun erzeugt dieser Ausdruck aber nicht per se undefiniertes Verhalten.
Bye, TGGC (Wähle deine Helden)
-
TGGC schrieb:
[((char)0x12345678)= 1000;]
Nun erzeugt dieser Ausdruck aber nicht per se undefiniertes Verhalten.Nicht? Dann zeig die Stelle im Standard, wo das Verhalten definiert ist. BTW denke ich dass die Dikussion hier nicht hergehört.
-
So, ich habe jetzt das Framework upgedated.
Die neue main und der eingebaut L33tBot stammen von TGGC: vielen Dank dafür.
Außerdem habe ich volkards kürzere Version für die Befehlseingabe in den ManualAgent eingebaut (zusätzlich zur langen Variante).Vor allem aber habe ich diese strittige 3 durch ein monster ersetzt, sodaß das Monster jetzt nicht mehr "Monster in der Grube" spielen muß.
Der Link zum download ist der gleiche geblieben!
MfG Jester
-
Was ist eigentlich damit, dass das Feld (4,4) nie ein Loch oder Monster hat?
-
argh... ist der Code dafür auch falsch, ja.
Ich schau's mir mal schnell an.
Lösungsvorschläge?
-
okay, das wäre dann auch gefixed.
-
ich schlage als abgabeformat vor, daß jeder die folgenden vier funktionen anbietet:
Agent* createAgent(); void destroyAgent(Agent* agent); char const* getName(); char const* getMail();
dan muss jester nix inkludieren, sondern braucht nur die eingereichte *.cpp dazuzulinken und fertig.
-
Dann sollte aber bitte auch festgehlaten werden, ob für jede Runde createAgent aufgerufen wird.
Bye, TGGC (Wähle deine Helden)
-
Dann wäre mein Vorschlag: so wie in der aktuellen main.
Ich erstelle jede Runde einen jungfräulichen Bot, den ich nach der Runde zerstöre.
-
Jester schrieb:
Dann wäre mein Vorschlag: so wie in der aktuellen main.
Ich erstelle jede Runde einen jungfräulichen Bot, den ich nach der Runde zerstöre.das muss sogar so sein, damit der bot mitkriegt, wann eine neue runde beginnt. er tapt ja nicht absichtlich in die grube, aber wenn deshalb eine neue runde beginnt und er es nicht gemerkt hat, steht er ziemlich doof da.
-
Sollten die ganzen private-Sachen von Agent nicht protected sein?
-
Michael E. schrieb:
Sollten die ganzen private-Sachen von Agent nicht protected sein?
wäre zum teil praktisch. aber egal, ich hab die vom Agent einfach kopiert.
-
Die sollen wir ja nicht benutzen.
-
Also ich hätt gern zumindest lesenden Zugriff auf die Position.
-
Michael E. schrieb:
Also ich hätt gern zumindest lesenden Zugriff auf die Position.
naja, ich denke mal, das darf ich posten, weil es absolut nix mit dem verfahren zu tun hat, aber allen, die es kopieren, schreibarbeit spart.
ich hab mir nen proxy einfallen lassen, der die ergebnisse von der eigentlichen funktion holt und schnell die position aktualisiert, bevor sie dann der main weitergeleitet werden.Volkard::Action Volkard::decideNextAction(Sense sense){ Action action=think(sense); switch(action){ case TURN_LEFT: position.direction = Position::Direction((position.direction+3)%4); break; case TURN_RIGHT: position.direction = Position::Direction((position.direction+1)%4); break; case MOVE: switch(position.direction) { case Position::UP: ++position.y; break; case Position::DOWN: --position.y; break; case Position::LEFT: --position.x; break; case Position::RIGHT: ++position.x; break; } case GRAB: case SHOOT: case FINISH: break; } return action; }
-
volkard: Danke.
Jester: Schneller würds gehen, wenn du ne get-Funktion bereitstellen würdest.