Frage zu Parameterübergabe per Referenz



  • Hallo zusammen,

    ich habe folgendes gecodet und es hat nicht funktioniert (test soll DIREKT die Werte im Array ändern):

    void test(int& x){...}
    
    //main:
    int array[10];
    for(...)
    	test(array[i]);
    

    Funktioniert nicht!!! Im array stehen danach nur die alten Werte!

    void test(int* x){...}
    
    //main:
    for(...)
    	test(&array[i]);
    

    Funktioniert, allerdings muss ich jedes mal, bevor ich etwas mit x mache, dereferenzieren 😕

    Meine Frage ist nun, warum geht das nicht? Müsste doch äquivalent sein? 😕



  • Hmm, ich kann hier keinen Fehler erkennen. Zeig doch mal den ganzen Code, der nicht funktioniert. Ich habe kurz etwas vergleichbares programmiert und das funktioniert einwandfrei.



  • das muss gehen - da lag dein fehler wo anders...

    btw:
    &array[x] == array+x

    bb



  • Danke für die schnellen Antworten!! 😉

    #include <boost/bind.hpp>
    #include <boost/thread.hpp>
    //bla bla
    
    void rle(..., pair<int, char>*& ret, unsigned int& size){...}
    
    //main:
    //...
    
    pair<int, char>* ret[nr_threads];
    unsigned int size[nr_threads];
    
    //start threads
    for(unsigned int i = 0; i < nr_threads; ++i){
    	//create thread with own memory!
    	ret[i] = NULL;
    	size[i] = 0;
    	thread* t = new thread(bind(rle, ... , ret[i], size[i]));
    }
    

    Ich hoffe mal da sind nicht noch andere Fehler drin, ich hab schon ein bisschen dran rumgebastelt 😃



  • lern mal richtig die grundlagen vor du mit threads und boost bind rumwirfst



  • mal ehrlich schrieb:

    lern mal richtig die grundlagen vor du mit threads und boost bind rumwirfst

    Da bin ich ja gerade dabei... 😉
    Nur habe ich leider weder ein gutes Buch noch ein gutes Online-Nachschlagwerk gefunden. Die einzige Quelle die google da ständig auswirft, ist boost.org - welche ich eher verwirrender als hilfreich finde.

    Ich hab auch zuerst versucht ohne bind auszukommen, aber Funktionspointer lassen sich allem Anschein nach nicht in allen Versionen von boost an thread-construktoren übergeben. (und structs mit überladenem ()-operator sind ja wohl nicht gerade einfacher :D)

    Ich hätte nur gerne gewusst, wieso Pointer funktionieren und Referenzen nicht.



  • </Exit> schrieb:

    Ich hätte nur gerne gewusst, wieso Pointer funktionieren und Referenzen nicht.

    Das liegt an boost::bind . Dessen Parameter werden per Value übergeben und ret[i] hat den Typ pair<int, char> und nicht etwa pair<int, char>& . An die Funktion wird also eine Referenz auf die bind -interne Kopie von ref[i] übergeben. Bei Zeigern kein Problem, bei Referenzen schon. Die Lösung könnte boost::ref sein.



  • Ahh, vielen Dank für die hilfreiche Antwort... sogar schon mit Lösung - super 😉


Log in to reply