praktikum 5 remove

lisa
Erstie
Erstie
Beiträge: 19
Registriert: 25. Nov 2008 19:46

praktikum 5 remove

Beitrag von lisa »

hallo,
ich habe eine frage zu der remove funktion für die queue.
eigentlich dachte ich, dass in einer fifo-queue immer einfach das erste element gelöscht wird.
also sowas wie if !empty { queue[first]=null(oder was auch immer man als leeres element hat) ; size--;
first = first-1 % queuesize; }

auf dem aufgabenblatt steht aber folgendes: void removeElement ( int * x , int * y ) ;

hier meine frage;
warum braucht die funktion parameter und warum sind die parameter pointer?

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

Re: praktikum 5 remove

Beitrag von Krümelmonster »

removeElement() soll das Element, das gelöscht wird, zurückgeben.

Ein Element in der Queue besteht aus x- und y-Koordinate.
Diese kannst du durch die beiden Pointer zurückgeben.

Z.B.
*x = 5;
*y = 3;
Stell deinen Fuß auf einen hohen Sockel
Mach dir ein Haar aus tausend Locken
Du bleibst doch immer, was du bist!

#14
Mausschubser
Mausschubser
Beiträge: 80
Registriert: 7. Dez 2007 13:54
Wohnort: Darmstadt

Re: praktikum 5 remove

Beitrag von #14 »

obwohl die pointer parameter sind und die funktion void?

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

Re: praktikum 5 remove

Beitrag von Krümelmonster »

Ja, die Parameter sind ja gerade deshalb Pointer, damit man etwas zurückgeben kann.

Wird ja bei read() Funktionen oft so gemacht, dass man einen Buffer als Pointer übergeben muss,
der dann die gelesenen Daten enthält, und die Funktion an sich gibt int zurück, was die Anzahl der gelesenen
Bytes sind.

Die Funktion removeElement() hat deshalb void als Rückgabetyp, weil sie einfach immer funktionieren soll ;)
Die Fehlerabfrage wird ja durch das assert() gemacht.
Stell deinen Fuß auf einen hohen Sockel
Mach dir ein Haar aus tausend Locken
Du bleibst doch immer, was du bist!

thomas_kalbe
Nerd
Nerd
Beiträge: 570
Registriert: 10. Jun 2006 14:58

Re: praktikum 5 remove

Beitrag von thomas_kalbe »

noch ein Aspekt: ein Queue-Element besteht aus 2 Variablen: x und y.
Hätte es nur 1 Element, könnten wir einfach "remove" ein int zurückgeben lassen.
Wir könnten auch irgendwie z.B. einen Zeiger auf ein Queue-Element zurückgeben lassen,
das finde ich aber noch umständlicher.
Stattdessen schreiben wir

int x,y;
...
removeElement(&x, &y);

und haben dann die entsprechenden Werte in x und y stehen.

-t

lisa
Erstie
Erstie
Beiträge: 19
Registriert: 25. Nov 2008 19:46

Re: praktikum 5 remove

Beitrag von lisa »

könnte ich nicht die position im board-array zurückgeben?
also y*WIDTH + x . das wäre eindeutig. dann müsste man allerdings nach dem funktionsaufruf wieder zurückrechnen um x und y zu bekommen(wenn man nicht die queue umbauen möchte).
oder ist das nicht im sinne der aufgabe?

thomas_kalbe
Nerd
Nerd
Beiträge: 570
Registriert: 10. Jun 2006 14:58

Re: praktikum 5 remove

Beitrag von thomas_kalbe »

das ginge auch so, fände ich aber ebenfalls umständlicher (aber ich bekomme es ja nicht mit, wenn es jemand so macht :-) )

-t

Benutzeravatar
limbo-messiah
Neuling
Neuling
Beiträge: 2
Registriert: 21. Jan 2009 15:28
Wohnort: Darmstadt

Re: praktikum 5 remove

Beitrag von limbo-messiah »

Hi,
ummm... ich verstehe noch nicht ganz, was uns die Pointer bringen sollen (als "Rückgabewert")?!
Werden die später zum Backtracking benutzt oder hat das damit nichts zutun?!
Wir fragen uns nämlich gerade, wie wir den Weg zur letzten Abzweigung zurücklaufen/speichern können, wenn er in eine Sackgasse gelaufen ist...

Gruß.
l-m

Benutzeravatar
Maeher
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 282
Registriert: 14. Okt 2007 23:02
Kontaktdaten:

Re: praktikum 5 remove

Beitrag von Maeher »

Wenn du in eine Sackgasse laufen kannst beim suchen, dann hast du keine Breitensuche Implementiert würde ich mal behaupten.

hrother
Neuling
Neuling
Beiträge: 6
Registriert: 12. Dez 2007 15:30
Wohnort: Frankfurt

Re: praktikum 5 remove

Beitrag von hrother »

Hi,
Maeher hat geschrieben:Wenn du in eine Sackgasse laufen kannst beim suchen, dann hast du keine Breitensuche Implementiert würde ich mal behaupten.
das ist so nicht korrekt. Siehe GdI II Kapitel 8, Seite 2: https://www.cdc.informatik.tu-darmstadt ... %20BFS.pdf.
In diesem Beispiel ist der Knoten v eine Sackgasse.
limbo-messiah hat geschrieben:Wir fragen uns nämlich gerade, wie wir den Weg zur letzten Abzweigung zurücklaufen/speichern können, wenn er in eine Sackgasse gelaufen ist...
BFS springt automatisch zur letzten Abzweigung zurück, da für einen Knoten immer alle adjacenten (in einem Schritt erreichbaren) Knoten in die FIFO-Queue eingefügt werden. Im Beispiel aus den GdI II Folien von oben wird bsw. zwischen (d) und (e) von r zu t gesprungen.

Dies führt jedoch dazu das c-man in der Animation, bei einem Labyrinth mit Sackgassen, wild durch die Gegend springt und den Weg nicht zurück läuft. Ob dies das gewünschte Verhalten ist weiß ich jedoch nicht.

Gruß

hrother

Benutzeravatar
Maeher
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 282
Registriert: 14. Okt 2007 23:02
Kontaktdaten:

Re: praktikum 5 remove

Beitrag von Maeher »

Eine Sackgasse wäre, wenn die Suche nicht weiter fortgeführt werden kann und das ist offensichtlich nicht der Fall.

thomas_kalbe
Nerd
Nerd
Beiträge: 570
Registriert: 10. Jun 2006 14:58

Re: praktikum 5 remove

Beitrag von thomas_kalbe »

Richtig. Meine Cman-Implementierung kommt auch mit Sackgassen prima klar, z.B.

Code: Alles auswählen

 "#################"\
 "#$.............$#"\
 "#.###.#####.###.#"\
 "#.# #...#...# #.#"\
 "#.###.#.#.#.###.#"\
 "#...............#"\
"#.###.##@##.###.#"\
 "#...........#...#"\      <<-- Sackgasse hier
 "#.###.#.#.#.###.#"\
 "#.# #...#...# #.#"\
 "#.###.#####.###.#"\
 "#$.............$#"\
 "#################"};
Wenn er in einer Sackgasse hängen bleibt, stimmt irgendwas nicht...

- t

benrub
Mausschubser
Mausschubser
Beiträge: 48
Registriert: 3. Dez 2006 01:26

Re: praktikum 5 remove

Beitrag von benrub »

Wie kann es denn sein, daß bei mir:

int* a;
int b = 5;
a = &b;
printf("%d", *a);

genau wie gewünscht "5" ausgibt,

der codeschnipsel

insertElement(4, 3);
int* x, y;
remov(x, y);
int a = (*x);
int b = (*y);
printf("%d %d", a, b);

aber schon bei der zeile int b = *y sich beschwert: "invalid type argument od 'unary *'?

(ja, ich bekomme schon vorher die warhnung: passing argument 2 of 'remov' makes pointer from integer without a cast, habe aber wirklich keine ahnung was das heißen soll oder wozu das dient.).


eigentlich mache ich ja nichts anderes als im ersten beispiel. ich habe auch schon probiert, printf("%d %d", *x, *y); zu schreiben, dabei bekomme ich genau denselben doofen fehler

Benutzeravatar
Maeher
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 282
Registriert: 14. Okt 2007 23:02
Kontaktdaten:

Re: praktikum 5 remove

Beitrag von Maeher »

sollte es nicht heißen

int * x, * y;

??

Christoph-D
Computerversteher
Computerversteher
Beiträge: 325
Registriert: 11. Dez 2005 13:14
Wohnort: Darmstadt

Re: praktikum 5 remove

Beitrag von Christoph-D »

benrub hat geschrieben:ja, ich bekomme schon vorher die warhnung: passing argument 2 of 'remov' makes pointer from integer without a cast, habe aber wirklich keine ahnung was das heißen soll oder wozu das dient.
"Die Übergabe von Argument 2 an 'remov' macht aus einem integer einen Zeiger".
So schwer zu verstehen ist diese Warnung IMHO nicht: du benutzt einen integer, wo der Compiler einen Zeiger erwartet. Deswegen macht der Compiler aus dem integer einen Zeiger, und weil das wahrscheinlich nicht das beabsichtigte ist, gibt er die Warnung aus.
"I believe in the fundamental interconnectedness of all things." (Dirk Gently)

Antworten

Zurück zu „Archiv“