Fehler in Vorlage für HÜ 8?

andre_w
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 125
Registriert: 14. Okt 2007 14:59
Wohnort: Kriftel
Kontaktdaten:

Fehler in Vorlage für HÜ 8?

Beitrag von andre_w » 20. Dez 2007 17:42

Hallo allerseits,

hatte etwas Probleme mit dem Bug in KarelJ, dass er auch versucht, irgendetwas an den aktuellen Platz zu legen, wenn placeBeepers 0 als letzter Parameter übergeben wird.

Der betreffende Code aus der Vorlage:

Code: Alles auswählen

private static void PrepareField(RectangleDataAccess p)
	{
		World.setTrace(false);
		World.setSize(p.getHeight() + 1, p.getWidth() + 4);
		World.setDelay(50);
		for (int i=0; i<p.getHeight(); i++)
			for (int j=0; j<p.getWidth(); j++)
				World.placeBeepers((p.getHeight() - i), j+ 1, p.getValueAt(j, i));
	}
Sollte es nicht eher so heißen:

Code: Alles auswählen

private static void PrepareField(RectangleDataAccess p)
	{
		World.setTrace(false);
		World.setSize(p.getHeight() + 1, p.getWidth() + 4);
		World.setDelay(50);
		for (int i=0; i<p.getHeight(); i++)
			for (int j=0; j<p.getWidth(); j++)
				if(p.getValueAt(j, i)>0)
					World.placeBeepers((p.getHeight() - i), j+ 1, p.getValueAt(j, i));
	}
Mit zweiterem funktioniert hier alles, sonst kommt es zu seltsamen Swing-Exceptions, sobald pickBeeper() aufgerufen wird, obwohl kein Beeper vorhanden ist.
Was mich etwas verwundert sind diese seltsamen X-Grafiken, die auch im Screenshot in der Übung vorhanden sind. Sollen diese da sein? Sie erscheinen bei mir nur, wenn man versucht, an eine Stelle 0 Beeper zu legen.

2 ähnliche Threads:
http://www.fachschaft.informatik.tu-dar ... hp?p=49713
http://www.fachschaft.informatik.tu-dar ... 5c6d5571c1

VG Andre

Benutzeravatar
guido
Computerversteher
Computerversteher
Beiträge: 378
Registriert: 30. Nov 2003 21:24
Wohnort: Mühltal
Kontaktdaten:

Re: Fehler in Vorlage für HÜ 8?

Beitrag von guido » 21. Dez 2007 08:09

andre_w hat geschrieben:Hallo allerseits,

hatte etwas Probleme mit dem Bug in KarelJ, dass er auch versucht, irgendetwas an den aktuellen Platz zu legen, wenn placeBeepers 0 als letzter Parameter übergeben wird.

Der betreffende Code aus der Vorlage:

Code: Alles auswählen

private static void PrepareField(RectangleDataAccess p)
	{
		World.setTrace(false);
		World.setSize(p.getHeight() + 1, p.getWidth() + 4);
		World.setDelay(50);
		for (int i=0; i<p.getHeight(); i++)
			for (int j=0; j<p.getWidth(); j++)
				World.placeBeepers((p.getHeight() - i), j+ 1, p.getValueAt(j, i));
	}
Sollte es nicht eher so heißen:

Code: Alles auswählen

private static void PrepareField(RectangleDataAccess p)
	{
		World.setTrace(false);
		World.setSize(p.getHeight() + 1, p.getWidth() + 4);
		World.setDelay(50);
		for (int i=0; i<p.getHeight(); i++)
			for (int j=0; j<p.getWidth(); j++)
				if(p.getValueAt(j, i)>0)
					World.placeBeepers((p.getHeight() - i), j+ 1, p.getValueAt(j, i));
	}
Mit zweiterem funktioniert hier alles, sonst kommt es zu seltsamen Swing-Exceptions, sobald pickBeeper() aufgerufen wird, obwohl kein Beeper vorhanden ist.
Was mich etwas verwundert sind diese seltsamen X-Grafiken, die auch im Screenshot in der Übung vorhanden sind. Sollen diese da sein? Sie erscheinen bei mir nur, wenn man versucht, an eine Stelle 0 Beeper zu legen.
Zu den "X" kann ich auch nichts sagen, da ich bereits im Urlaub bin und nur sporadisch im Netz bin :). Wenn die oben angegebene Modifikation bei der Bearbeitung hilft, dann nehmt sie bitte vor!

Frohe Weihnachten und einen guten Rutsch,

Guido

Benutzeravatar
taufrisch
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 107
Registriert: 30. Sep 2007 02:42
Wohnort: 127.0.0.1

Re: Fehler in Vorlage für HÜ 8?

Beitrag von taufrisch » 21. Dez 2007 15:24

Danke, ich war auch schon dabei robots.jar zu debuggen :evil:
Premature optimization is the root of all evil.

Don't anthropomorphize computers: They hate that.

Benutzeravatar
MelonTropic
Windoof-User
Windoof-User
Beiträge: 26
Registriert: 6. Dez 2007 12:55

Beitrag von MelonTropic » 21. Dez 2007 15:31

Wenn die Welt eingelesen wird, erzeugt er an jeder Stelle wo keine Beeper liegen ein "X". Ohne diese "X" bleibt am Ende kein Muster über.

Anstatt mit der Funktion nextToABeeper zu arbeiten, kann man auch prüfen ob an dieser Stelle die Anzahl der Beeper über 0 ist. (Falls man die Werte vorher in einem Array gespeichert hat).

Benutzeravatar
guido
Computerversteher
Computerversteher
Beiträge: 378
Registriert: 30. Nov 2003 21:24
Wohnort: Mühltal
Kontaktdaten:

Beitrag von guido » 21. Dez 2007 17:43

MelonTropic hat geschrieben:Wenn die Welt eingelesen wird, erzeugt er an jeder Stelle wo keine Beeper liegen ein "X". Ohne diese "X" bleibt am Ende kein Muster über.

Anstatt mit der Funktion nextToABeeper zu arbeiten, kann man auch prüfen ob an dieser Stelle die Anzahl der Beeper über 0 ist. (Falls man die Werte vorher in einem Array gespeichert hat).
Danke für die Hinweise - noch dazu, bevor ich selbst Zeit hatte, es mir anzusehen :)

Frohe Weihnachten und einen guten Rutsch allen Hörern der Veranstaltung und allen anderen "Mitlesern"! :)

Guido

Benutzeravatar
taufrisch
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 107
Registriert: 30. Sep 2007 02:42
Wohnort: 127.0.0.1

Beitrag von taufrisch » 21. Dez 2007 22:55

MelonTropic hat geschrieben:Anstatt mit der Funktion nextToABeeper zu arbeiten, kann man auch prüfen ob an dieser Stelle die Anzahl der Beeper über 0 ist. (Falls man die Werte vorher in einem Array gespeichert hat).
Das funktioniert leider deswegen nicht, weil du dann nur die Ausgangsbelegung mit dir rumschleppst. Mit den Ameisen aus der Aufgabe fällt dir das nicht weiter auf, aber es ist leicht ein Feld von Ameisen deren Wege sich kreuzen ernten zu lassen, und dann versuchst du Pieper aufzunehmen die gar nicht (mehr) da sind.

Ich lasse am Ende der Funktion nochmal

Code: Alles auswählen

    private static void LeftOvers(RectangleDataAccess p)
    {
        for (int i = 0; i < p.getHeight(); i++)
            for (int j = 0; j < p.getWidth(); j++)
                if (p.getValueAt(j, i) == 0)
                    World.placeBeepers((p.getHeight() - i), j + 1, p.getValueAt(j, i));
    }
laufen, das malt die Kreuze hin wenn man sie unbedingt haben muß.
Premature optimization is the root of all evil.

Don't anthropomorphize computers: They hate that.

FeG
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 182
Registriert: 6. Dez 2007 07:01

Beitrag von FeG » 22. Dez 2007 10:13

Hi,

also ich kann dazu nur sagen, dass die PrepareField()-Funktion bei mir so in Ordnung ist.
Es ist glaub ich durchaus beabsichtigt, dass die X'e eingetragen werden wenn das Array-Feld 0 ist, es ist auch richtig, dass nextToABeeper da true zurückgibt und es dann eine Exception gibt.

Das liegt IMHO daran, dass es zwar ein Beeper ist, man ihn aber nicht aufsammeln kann.
Ich habe das daher so gelöst, dass ich nicht mit nextToABeeper() prüfe sondern anhand der eingelesen Datenfelds, das klappt auch ganz gut so..

Nur so zur Information...
Gruß
FeG

Wulf
Neuling
Neuling
Beiträge: 1
Registriert: 26. Dez 2007 20:39

Beitrag von Wulf » 26. Dez 2007 20:43

Seh ich es also richtig, dass die X-Beeper nach dem Ernten immernoch auf dem Feld liegen?

Stumpf.Alex
Nerd
Nerd
Beiträge: 643
Registriert: 1. Okt 2007 12:40
Wohnort: Darmstadt
Kontaktdaten:

Beitrag von Stumpf.Alex » 26. Dez 2007 21:34

Ja. Weil X-Beepers lassen sich nicht sammlen, da ja eigentlich keine an dieser Stelle sind. X steht also für 0 Beepers.

Benutzeravatar
Langbaeh
Mausschubser
Mausschubser
Beiträge: 56
Registriert: 16. Okt 2007 10:16
Wohnort: DA

Beitrag von Langbaeh » 30. Dez 2007 12:52

Ich habe mich nun auch mal aus eher unersichtlichen Gründen um diese Zeit an die Aufgabe gesetzt.

Also die Fehlermeldung kommt definitiv, wenn man die Beepers mit nextToABeeper prüft und dann versucht aufzuheben. Die komischen X-Beeper mag er da irgendwie nicht.

Ich würde es allerdings auch über das eingelesene Array lösen, weil das X-Muster dass dann am Ende übrigbleibt sicher so gewollt ist... sonst hätte man sich nicht die Mühe gemacht und es so gebastelt, dass dann GDI1 dortsteht ;)

Stumpf.Alex
Nerd
Nerd
Beiträge: 643
Registriert: 1. Okt 2007 12:40
Wohnort: Darmstadt
Kontaktdaten:

Beitrag von Stumpf.Alex » 30. Dez 2007 14:53

Ja das ist definitv so. X-Beepers sollen liegen bleiben. Und meiner Meinung nach ist da ein bisschen Gehirnschmalz gefragt, aber es gibt da tatsächlich eine elegante Lösung für.

Denkt daran, die Parameter für die Ants sind frei wählbar (siehe auskommentierter Text in der Applikation), also wieso dann kein Feld als Parameter übergeben? Und damit alle Ameisen immer das gleiche und aktualisierte Feld haben, kann man das ja statisch in der Ants-Klasse abspeichern. Der Rest ergibt sich ja dann von alleine...

Benutzeravatar
Demmi
Kernelcompilierer
Kernelcompilierer
Beiträge: 423
Registriert: 1. Okt 2007 12:56
Wohnort: Darmstadt

Beitrag von Demmi » 30. Dez 2007 22:10

Nur muss man das Feld nicht wegen dem "Information Hiding" private machen? Das würde ja dann auch dazu führen, dass ich nicht mehr direkt drauf zugreifen kann.
Oder soll ich mir da eine getField(); basteln, die mir das Feld zurückgibt?

Fragen, die ich gerne beantwortet hätte, weil ich nicht schon wieder Lust auf Punktabzug wegen public/private hab -.-

Edit: getField(); kann ich auch vergessen, weil ich dann erst das Interface (RectangleDataAccess) anpassen müsste...
Saying that Java is nice because it works on all Plattforms is like saying that anal sex is nice because it works on all genders.

Stumpf.Alex
Nerd
Nerd
Beiträge: 643
Registriert: 1. Okt 2007 12:40
Wohnort: Darmstadt
Kontaktdaten:

Beitrag von Stumpf.Alex » 30. Dez 2007 22:24

Ja, das Feld muss man auch private machen.

Aber das ist doch kein Problem. Dann schreibt man halt entsprechende Selektoren in der Ants-Klasse und nicht im Interface. Außerdem kann man so schön die nextToABeeper() überschreiben und so den Fehler beheben.

Benutzeravatar
Demmi
Kernelcompilierer
Kernelcompilierer
Beiträge: 423
Registriert: 1. Okt 2007 12:56
Wohnort: Darmstadt

Beitrag von Demmi » 30. Dez 2007 23:58

Das ist mir soweit schon klar, nur wie soll ich denn in der Ants-Klasse nen Selektor schreiben, wenn ich gar keinen Zugriff aufs Feld habe. Selbst an den Ants-Konstruktor übergeben dürfte schwierig werden, weil ich ja auch in der Main nicht mehr an das Feld an sich rankomme.

Und mittels getWidth, getHeight und getValueAt das Ding nochmal zu rekonstruieren erscheint mir irgendwie übertrieben...
Saying that Java is nice because it works on all Plattforms is like saying that anal sex is nice because it works on all genders.

Benutzeravatar
Krümelmonster
Geek
Geek
Beiträge: 767
Registriert: 17. Okt 2007 13:58
Wohnort: Jossgrund

Beitrag von Krümelmonster » 31. Dez 2007 02:33

Um das Feld zu "rekonstruieren" genügt ein einfaches "=". ;-)

Verstehe eure Probleme nicht.

Wenn ihr unbedingt das Feld in einer Ants-Klasse benötigt,
dann übergebt es doch dem Konstruktor und legt in der Klasse
eine Kopie an. Über getValueAt() habt ihr dann Zugriff auf alles
was das Herz begehrt. ;-)
Stell deinen Fuß auf einen hohen Sockel
Mach dir ein Haar aus tausend Locken
Du bleibst doch immer, was du bist!

Antworten

Zurück zu „Archiv“