Problem bei der Übergabe eines Pointers



  • Hallo ich bin eher noch Anfänger was C++ angeht und stehe mitlerweile schon vor meinem ersten Problem, ich habe eine funktion in welcher ich einen pointer deklariere, diesen Pointer übergebe ich an eine andere Funktion, die den Pointer dann verändert. Wenn ich den Pointer nun jedoch in der ausgangsfunktion betrachte hat sich nichts geändert.

    Bsp:

    void main()
    {
        long *var;
        tuetwas(var);
    }
    
    void tuetwas(long *var)
    {
       long *var2=2;
       var = var2;
    }
    

    Nachdem tuetwas fertig ist sollte var doch in der main methode ebenfalls den Wert 2 haben oder habe ich da etwas falsch verstanden?
    Bei mir zeigt var nämlich in der main methode trotzdem noch ins leere.



  • 1. Welcher Compiler übersetzt sowas?? Kriegst du keine Fehlermeldung?

    1. void main() ist falsch, der Rückgabetyp von main muss int sein.

    3. So wird das nix. Wenn du ernsthaft programmieren lernen willst, dann kauf dir bitte ein Buch oder suche dir wenigstens ein gutes Tutorial aus. Egal was davon, arbeite es von vorne bis hinten durch. Du scheinst mal was von Pointern gehört zu haben und probierst jetzt wild rum. Wie du siehst, funktioniert das nicht. Wenn du wüsstest, wie absurd das ist, was du da probierst... 😉

    EDIT:
    Ich gebe dir trotzdem mal ein kleines Beispiel, dass dem nahe kommen dürfte, was du vorhattest:

    void tuetwas(int *p) 
    { 
    	*p=3;  //schreibe eine 3 an die Stelle, auf die p zeigt
    }
    
    int main() 
    { 
    	int val=2;
    	int *pVal=&val; //pVal wird die Adresse von val zugewiesen
    	tuetwas(pVal);  //das, worauf pVal zeigt (also val), hat nach dem Aufruf der Funktion den Wert 3
    }
    


  • C++ Compiler vom Studio2008

    Mir is schon klar dass ich den var2 erst noch mit new anlegen muss um einen Wert zuzuweisen und alles. Das sollte nur ein ganz schnelles Beispiel sein um das genaue Problem zu zeigen, da der Code aus dem Programm welches ich hier vorliegen habe sehr komplex ist.
    Normal programmiere ich in VB aber hald jetzt seit 2, 3 Monaten in C++

    Und ich habe hier schon eine fertige Klasse und alles die ich gerade überprüfe und in dieser Klasse wird nunmal ein Pointer an eine Funktion übergeben die einen Pointer erwartet und diesem Pointer dann einen anderen zuweist.
    Und rein von meinem logischen Denken her bin ich nun davon ausgegangen, dass wenn ich einen Pointer habe der ins nichts zeigt, diesen an eine Funktion übergebe und in dieser Funktion dann einen anderen Pointer zuweise, welcher auf einen Speicherbereich zeigt, sollte der Andere Pointer doch nun auch dahin zeigen?!

    Edit:
    Genau so ähnlich wie du es gemacht hast nur dass der Pointer, welcher übergeben wird vor dem Aufruf ins Nichts zeigt.
    Und während dem Aufruf wird dann kein Wert zugewiesen sondern ein Pointer!



  • Der VC++2008 wird das hier gepostete nicht kompilieren.

    KillaChris schrieb:

    Mir is schon klar dass ich den var2 erst noch mit new anlegen muss um einen Wert zuzuweisen und alles. Das sollte nur ein ganz schnelles Beispiel sein um das genaue Problem zu zeigen, da der Code aus dem Programm welches ich hier vorliegen habe sehr komplex ist.

    Tja, und damit sorgst du leider dafür, dass wir uns hier mit Fehlern beschäftigen, die vielleicht gar keine sind. Das ist ärgerlich für beide Seiten, besonders aber für mich. Merke dir bitte für die Zukunft: wenn dein Programm zu komplex ist, um es komplett zu posten, dann investiere ein paar Minuten und bastele ein Minimalbeispiel zusammen, dass den Fehler aufweist und auch kompilierbar ist. Damit ersparst du uns beiden Zeit und bekommst schneller die Hilfe, die du brauchst.

    KillaChris schrieb:

    Und rein von meinem logischen Denken her bin ich nun davon ausgegangen, dass wenn ich einen Pointer habe der ins nichts zeigt, diesen an eine Funktion übergebe und in dieser Funktion dann einen anderen Pointer zuweise, welcher auf einen Speicherbereich zeigt, sollte der Andere Pointer doch nun auch dahin zeigen?!

    Ja, ist soweit richtig, wenn du damit meinst, dass du dem Pointer die Adresse - also den Wert - eines anderen Pointers zuweist (nicht das, worauf er zeigt).

    KillaChris schrieb:

    Genau so ähnlich wie du es gemacht hast nur dass der Pointer, welcher übergeben wird vor dem Aufruf ins Nichts zeigt.
    Und während dem Aufruf wird dann kein Wert zugewiesen sondern ein Pointer!

    Ja und worauf zeigt der Pointer in der Funktion, dessen Wert du dann zuweist? Hoffentlich nicht auf lokalen Speicher.

    Bitte bastele doch, wie gesagt, mal ein Minimalbeispiel zusammen, mit dem wir was anfangen können und das genau deinem Problem entpricht. Sonst reden wir am Ende nur um den heißen Brei herum und verlieren uns in begrifflichen Unklarheiten. 🙂

    EDIT: Und erkläre auch mal, welchen Hintergrund das Ganze hat. In einer Funktion dynamischen Speicher anfordern und einen Zeiger darauf zurückgeben, ist oft unschön. Denk mal darüber nach: wer gibt ihn dann frei? Die Funktion selbst sicher nicht. Weiß die aufrufende Stelle, dass sie ihn freigeben muss? Uswusf. Wenn du erklärst, was du machen willst, findet sich vielleicht eine vernünftige Lösung.



  • KillaChris schrieb:

    Das sollte nur ein ganz schnelles Beispiel sein um das genaue Problem zu zeigen, da der Code aus dem Programm welches ich hier vorliegen habe sehr komplex ist.

    Gute Beispiele ergeben gute Antworten...

    KillaChris schrieb:

    Und während dem Aufruf wird dann kein Wert zugewiesen sondern ein Pointer!

    Ich übernehme mal das Beispiel von oben:

    #include <stdio.h>
    
    void tuetwas(int **p)
    {
        *p = new int;
        **p = 3;  //schreibe eine 3 an die Stelle, auf die p zeigt
    }
    
    int main()
    {
        int *pVal = NULL;
        tuetwas( &pVal );
        printf( "Wert = %d\n", *pVal );
    }
    

    NUn musst Du nur noch mit dem Memory Leak dealen 🙂



  • Nicht, was er will, wenn ich ihn richtig verstehe. Aber das richtig Verstehen ist ja hier das große Problem. 😉

    EDIT: Und das delete hättest du ruhig noch dahinklatschen können. 😉



  • Okay vielen Dank erstmal für die Hilfe.

    Also der Hintergrund ist folgender beim starten des Programms wird ziemlich viel in den Arbeitsspeicher geladen, um später darauf zuzugreifen, da das ganze eine Serveranwendung ist.
    Dies geschieht alles in einer Klasse.
    Nun gibt es weitere Klassen, die dann wieder auf diese Werte zugreifen, um diese zu verwenden, daher auch der Pointer, damit nicht unnötig Hauptspeicher verschwendet wird.
    Die Klasse welche mir nun gegeben wurde und welche ich gerade überprüfe macht im Grunde genau das hier:

    int main()
    {
    	long *var;
    	tuetwas(var);
    
    }
    
    void tuetwas(long *var)
    {
    	long *var2;
    	var2 = new long(3);
    	var = var2;
    }
    

    Pointer ohne Wert wird übergeben.
    Diesem Pointer wird ein bereits vorhandener Pointer, welcher schon viiiiiiel früher mit New angelegt wurde übergeben(Das New hier ist praktisch nur fürs Beispiel da).
    Betrachtet man nun wenn tuetwas fertig ist var in der Main Methode, dann zeigt var immernoch ins Nichts!



  • Dein Problem ist, dass der Pointer selbst als Wert übergeben wird. Du kannst so zwar ändern, worauf er zeigt, aber nicht den Pointer selbst. Du musst hier mit einem Zeiger auf einen Zeiger arbeiten, ähnlich wie von Martiniclan gezeigt.

    Dein Beispiel abgeändert:

    void tuetwas(long **var) 
    { 
    	long *var2; 
    	var2 = new long(3); 
    	*var=var2;
    }
    
    int main() 
    { 
    	long *var; 
    	tuetwas(&var);
    	delete var;
    }
    

    Btw, du hast immer noch kein kompilierbares Beispiel geliefert. Die Reihenfolge der Funktionen ist falsch, oder es fehlt der Prototyp. Bitte in Zukunft wenigstens einmal selbst testen.

    EDIT: Und noch mal kurz die Anmerkung, auch wenn du es vielleicht nicht hören willst: dir fehlt Basiswissen! Ganz gravierend sogar! Wenn das mit dem Programmieren was werden soll, musst du lernen, mit geeigneten Lernmitteln. Ausprobieren, bis es klappt, klappt eben meist nicht. Da hilft nix. 🙂



  • Vielen vielen Dank ersteinmal.
    Die Sache mit diesen zwei Pointern war mir bis dato noch gar nicht bekannt.
    Ich muss das ganze jetzt nur noch abändern weil es durch 3 Methoden hindurch zugewiesen wird, aber das ist jetz zum Glück kein Problem mehr.
    Dankeschön 🙂

    Der Prototyp war bei mir natürlich vorhanden, hatte diesen nur ausversehen nicht mitkopiert.


Log in to reply