Probleme bei übergabe von Werten mittels Pointern



  • Also im Prinzip soll das Programm folgendes machen:

    edit: ich kriegs leider nicht hin, das hier so zu schreiben, dass erkennbar ist, wie die Felder durchlaufen werden ...
    edit2: T = Tree, *=brennender baum,!=rauchender baum,.=ausgebrannter baum
    Wald bepflanzen
    TTT__T
    __T__T
    TTT_TT

    Wald anzünden

    **\__\
    __T__T
    TTT_TT

    Zeitschritt gehen (hier pflanzt sich der Brand fort):

    1. Schritt:
    !!!__!
    \*\*
    TTT_TT

    2. Schritt:
    ...__.
    !!
    TT*_T*

    3. Schritt:
    ...__.
    ..
    T*!_*!

    Undso weiter soll sich der Brand dann forpflanzen. Wenn weder in horizontaler, noch in vertikaler Richtung ein Baum anbrennt, dann erstickt der Brand - die Funktion endet. Sinn der Funktion Statistik ist es nun, diesen Vorgang 30x durchzuführen und nach jedem Durchgang die Anzahl der durchlaufenen Schritte zählt und in ein File ausgibt.
    Nur das momentan eben bei allen 30 Durchgängen das Gleiche Feld konstruiert wird.



  • Hast du deine Theorie, dass das immer der gleiche Startwert ist, auch mal anders überprüft als nur durch Ausgabe der Zahl der Schleifendurchläufe in eine Datei? Vielleicht ist der Fehler auch woanders. Beispielsweise würde ich naiverweise erwarten, dass die Variable rueckgabe jeweils vor der while-Schleife wieder zu 1 initialisiert wird.



  • Bashar schrieb:

    Hast du deine Theorie, dass das immer der gleiche Startwert ist, auch mal anders überprüft als nur durch Ausgabe der Zahl der Schleifendurchläufe in eine Datei? Vielleicht ist der Fehler auch woanders. Beispielsweise würde ich naiverweise erwarten, dass die Variable rueckgabe jeweils vor der while-Schleife wieder zu 1 initialisiert wird.

    Ich hatte versucht, mir die Adressen der einzelnen Pointer anzuzeigen, denn die müssten ja theoretisch alle auf die gleiche Adresse zeigen. Leider funktioniert das Adresse ausgeben auf meinem HeimPC (Windows) nicht so gut, wie in der uni (da haben wir linux)... irgendwie hab ich da keine Adressen bekommen sondern nur Nullen oder kryptische Zeichen - je nachdem, welchen Platzhalter ich benutzt habe.

    Die Variable Rückgabe dient eigentlich nur zur Bestimmung, wann die Schleife beendet werden soll, nämlich dann, wenn nix mehr brennt oder raucht. Daher sollen die ja gerade immer auf den gleichen Wert gebracht werden, damit die Whileschleife läuft.

    Aber ich probier mal mir die Startwerte an unterschiedlichen Stellen ausgeben zu lassen - mal sehen ob sich da was ergibt.

    edit: also: wenn ich in die schleife geh und dort 30x den Startwert printen lass, dann gibt er tatsächlich 30 unterschiedliche Startwerte aus... innerhalb der Whileschleife aber ist der Startwert immer gleich. Das soll ja auch so sein, denn für einen Durchlauf der for-Schleife soll i-mal die while Schleife durchlaufen werden, wobei i die anzahl der Zeitschritte darstellt. Diese Zeitschritte vollziehen sich ja alle am selben Wald.

    for (j=0;j<=30;j++)
    	{
    
    	belegung(p,wald,startwert);
    	randanzuenden(wald);
    
    	while (rueckgabe==1)
    		{
    
    		rueckgabe=zeitschritt(wald);
    		i++;
    		}
    	fprintf (ergebnisfile, "%i ", i);
    
    	}
    fclose(ergebnisfile);
    return 1;
    

  • Mod

    setjd schrieb:

    Spielt es denn eine Rolle, in welcher Reihenfolge die Funktionen im Quelltext stehen?

    Ja.

    Wenn während des Hauptprogramms eine Funktion aufgerufen wird springt der Compiler doch einfach zu der Funktion oder?

    Der Compiler springt gar nicht (jedenfalls nicht in deinem Quelltext), der Compiler liest den Quelltext und übersetzt ihn in Maschinensprache. Dieser enthält dann vielleicht Sprungbefehle.

    Was hier passiert ist implizite Funktionsdeklaration, eine Sonderheit der Sprache C. Wenn eine Funktion aufgerufen wird, ohne vorher deklariert worden zu sein (das Konzept von Deklaration und Definition und wozu das gut ist, sind dir bekannt?), dann wird automatisch ein Funktionsprototyp angenommen, der int zurück gibt und genau die Argumente nimmt, die der Funktion übergeben wurden. Dies kann leicht Probleme verursachen, wenn die so deklarierte Funktion und die eigentliche Funktion nicht zusammen passen.


  • Mod

    setjd schrieb:

    Bashar schrieb:

    Hast du deine Theorie, dass das immer der gleiche Startwert ist, auch mal anders überprüft als nur durch Ausgabe der Zahl der Schleifendurchläufe in eine Datei? Vielleicht ist der Fehler auch woanders. Beispielsweise würde ich naiverweise erwarten, dass die Variable rueckgabe jeweils vor der while-Schleife wieder zu 1 initialisiert wird.

    Ich hatte versucht, mir die Adressen der einzelnen Pointer anzuzeigen, denn die müssten ja theoretisch alle auf die gleiche Adresse zeigen. Leider funktioniert das Adresse ausgeben auf meinem HeimPC (Windows) nicht so gut, wie in der uni (da haben wir linux)... irgendwie hab ich da keine Adressen bekommen sondern nur Nullen oder kryptische Zeichen - je nachdem, welchen Platzhalter ich benutzt habe.

    Die Variable Rückgabe dient eigentlich nur zur Bestimmung, wann die Schleife beendet werden soll, nämlich dann, wenn nix mehr brennt oder raucht. Daher sollen die ja gerade immer auf den gleichen Wert gebracht werden, damit die Whileschleife läuft.

    Aber ich probier mal mir die Startwerte an unterschiedlichen Stellen ausgeben zu lassen - mal sehen ob sich da was ergibt.

    Zeig mal konkret, wie du die Ausgaben machst und was du erwartest. Gerade bei der Ausgabe von Pointern machen Anfänger gerne viel falsch.



  • setjd schrieb:

    Die Variable Rückgabe dient eigentlich nur zur Bestimmung, wann die Schleife beendet werden soll, nämlich dann, wenn nix mehr brennt oder raucht. Daher sollen die ja gerade immer auf den gleichen Wert gebracht werden, damit die Whileschleife läuft.

    Ja, aber wenn rueckgabe einmal ungleich 1 geworden ist und somit die Schleife abgebrochen wird, gibt es nichts mehr, wodurch rueckgabe jemals wieder auf 1 gesetzt werden kann; somit wird die Schleife nie wieder betreten, und i wird sich auch nie wieder ändern. Das könnte deine Ausgabe erklären.

    Wozu du jetzt Zeiger ausgeben willst ist mir schleierhaft. Du hattest gesagt, der Startwert ist immer der gleiche -- dann gib doch den Startwert aus. Falls deine Theorie ist, dass das Feld immer das gleiche ist, dann gib das Feld aus.



  • SeppJ schrieb:

    ]Zeig mal konkret, wie du die Ausgaben machst und was du erwartest. Gerade bei der Ausgabe von Pointern machen Anfänger gerne viel falsch.

    Um mir die Adresse auszugeben, auf die der Pointer "startwert" zeigt tipp ich einfach

    printf("%p",&startwert);
    

    in meinen quellcode



  • Bashar schrieb:

    setjd schrieb:

    Die Variable Rückgabe dient eigentlich nur zur Bestimmung, wann die Schleife beendet werden soll, nämlich dann, wenn nix mehr brennt oder raucht. Daher sollen die ja gerade immer auf den gleichen Wert gebracht werden, damit die Whileschleife läuft.

    Ja, aber wenn rueckgabe einmal ungleich 1 geworden ist und somit die Schleife abgebrochen wird, gibt es nichts mehr, wodurch rueckgabe jemals wieder auf 1 gesetzt werden kann; somit wird die Schleife nie wieder betreten, und i wird sich auch nie wieder ändern. Das könnte deine Ausgabe erklären.

    Wozu du jetzt Zeiger ausgeben willst ist mir schleierhaft. Du hattest gesagt, der Startwert ist immer der gleiche -- dann gib doch den Startwert aus. Falls deine Theorie ist, dass das Feld immer das gleiche ist, dann gib das Feld aus.

    Du hast recht... FETTES DANKE! Ich hatte die Variablen Rückgabe und i im Deklarationsteil der Funktion mit 1 und 0 initialisiert, hätte das aber innerhalb der for-Schleife machen müssen. Danke wie gesagt - jetzt funktionierts.

    Ich wollte die Zeigeradressen ausgeben um zu erfahren, ob die Zeiger alle auf die gleiche Adresse zeigen, denn ich hab ja die ganze Zeit vermutet, dass da irgendwo der Wert nicht übergeben wird. Wenn ich quasi in jeder Funktion die Zeiger, die ich dort definiert habe einmal ausgeben lasse und die alle gleich sind, kann ich davon ausgehen, dass jede Funktion mit dem selben Speicherplatz arbeitet. Das scheint ja jetzt auch der Fall zu sein!


  • Mod

    setjd schrieb:

    SeppJ schrieb:

    ]Zeig mal konkret, wie du die Ausgaben machst und was du erwartest. Gerade bei der Ausgabe von Pointern machen Anfänger gerne viel falsch.

    Um mir die Adresse auszugeben, auf die der Pointer "startwert" zeigt tipp ich einfach

    printf("%p",&startwert);
    

    in meinen quellcode

    Bingo. Das ist die Adresse von Startwert selbst, nicht, worauf gezeigt wird.



  • SeppJ schrieb:

    Das ist die Adresse von Startwert.

    Ja schon, vielleicht ist das ein wenig missverständlich, dass meine ursprüngliche Variable in main() "startwert" heißt und meine Pointer in den Funktionen eben auch "*startwert*" mit dem Operator & greife ich doch immer auf eine Adresse zu und im Prinzip spielt es von der Syntax her doch keine Rolle ob ich mir mit dem & die Adresse eines Pointers oder einer Normalen Variablen ausgeben will oder?

    Ich weiß allerdings jetzt nicht, ob der Pointer selbst auch nochmal einen Speicherplatz hat oder ob das der gleiche Platz ist, auf den er zeigt?! Darauf willst du vermutlich hinaus nehm ich an...
    Von der Logik her würd ich jetzt sagen der Pointer müsste ne eigene Adresse haben.

    edit: ok, nachdem du deine Antwort editiert hast ists klarer 😉
    edit2: aber aus interesse: wie würd ich jetzt die adresse des pointers selbst ausgeben? geht das überhaupt?


  • Mod

    setjd schrieb:

    edit2: aber aus interesse: wie würd ich jetzt die adresse des pointers selbst ausgeben? geht das überhaupt?

    Die Adresse des Pointers selbst hast du doch ausgegeben.

    int foo;
    int *bar = &foo;
    
    printf("Adresse von foo: %p\n", &foo);
    printf("Adresse von bar: %p\n", &bar);
    printf("Wert von bar (also Adresse von foo): %p\n", bar);
    

    http://ideone.com/1PSQGA


Anmelden zum Antworten