Lokale Variable als Rückgabewert. Wie?



  • Ich hab eine Funktion geschrieben, die einen char* zurückgibt. Das Problem ist nun, dass ich im Nachhinein gemerkt habe, dass ich eine lokale Variable zurück gegeben habe.
    Wie kann ich jetzt alles ohne Große Änderung verändern? Das muss doch irgendwie mit Referenzen, Zeiger oder Heap oder so gehen.
    Danke im vorraus!

    PS: Ich habe wenig Erfahrung, also wäre es Code mitzuposten.



  • Er zeug den char * per new, dann gibts keine probleme.
    Oder übergib der Funktion eine Referenz auf char *



  • Schreib doch 'static ' (ohne Anführungzeichen!) vor die Definition der zurückzugebenden Variable. Beim nächsten Aufruf der Funktion hat diese Variable dann aber immer noch den gleichen Inhalt (es sei denn, der wurde inzwischen über den/einen Zeiger darauf verändert).

    Also wird z.B. aus:

    long int langeVar;
    

    folgendes:

    static long int langeVar;
    

    Hoffentlich hilft dir dieses.

    Freunliche Grüße



  • Hast aber das Problem, daß es vielleicht Speicherlöcher gibt, wenn die Funktion ihren Speicher selbst anlegt. Kannst Du die Rückgabe nicht einfach in nen std::string packen? Dann biste das Problem los.



  • Wie schon gesagt habe ich nicht all zu viel Erfahrung, jedoch habe ich es mit dem Heap gelöst. Meine Fragen nun:

    1. ist folgender Code korrekt?:

    char* str=new char[index];
    

    2. Muss ich da nciht nochmal irgendetwas delten?
    3. Hat diese Methode irrgendwelche Nachteile?



  • 1.) Ja, der Code ist korrekt. Ich hoffe aber du hast nicht vergessen ein Byte zusätzlich für das abschliessende Nullbyte mitzuzählen. 🙂

    2.) Ja, "irgendjemand" muss diesen allokierten String nach Gebrauch (?!?) wieder löschen. :p

    3.) Ja, siehe 2.) 😞

    Wegen 3.) empfehle ich, wie schon Jester, die Verwendung von std::string. Das sollte für C++-Programmierer selbstverständlich sein. 😉

    mfg JJ



  • Je nachdem was du machst, kannst du auch einfach nen static puffer (wie bereits erwähnt) verwenden,
    allerdings sind die Daten darin nur bis zum nächsten Funktionsaufruf gültig.

    Aber wenn das reicht ist es ne saubere Lösung 🙂



  • Ich weiß nicht... so sauber finde ich das nicht. Man kann die Funktion dann nichtmehr zweimal in einem Ausdruck verwenden:

    erg = irgendeineFunktion(dieFunktion(param1), dieFunktion(param2));

    wird damit nicht funktionieren. Das ist schon etwas merkwürdig und widerspricht allem was man so üblicherweise von Funktionen erwarten würde.



  • Vielen Dank soweit hat sich dann alles erledigt.
    Falls es jemanden interessiern sollte, bleibe ich bei der Heap Lösung. Das deleten ist ein verkraftbarer Nachteil 😉
    Also nochmal Vielen Dank.



  • Der moderne Mann(/Frau) nimmt Smart-Pointer für solche Fälle. 😃 😉 😃

    mfg JJ



  • Mal eine Anmerkung:

    Wenn ihr das mit dem "new" so meint:

    char *Func(void)
    {
    
     char *A = new char[88];
    
     return A;
    }
    

    Geht das doch eigentlich nicht wirklich gut, d.h. der Speicher ist danach nicht mehr "accesible", oder etwa nicht?



  • wieso sollte er nicht mehr accesible sein? Selbst angelegter Speicher auf dem Heap ist meines Wissens nach immer ansprechbar...

    Mfg, smasher1985



  • Ich hab da was verwechselt, sorry. Der Speicher ist natürlich noch ansprechbar.

    Grüße
    Jens



  • Hi evrybody
    Did somebody used the files nrtypes_nr.h nrtypes.h in which if defind the class Vec_DP.
    I am writing a program in which I am using a variables and a functions of type Vec_DP.
    During the execution at some step the program stop because of error into the DBGHEAP.C file and exactly into the function _nh_malloc_dbg did somebody had the same problem.
    It is interesting to try the

    #include "nrtypes_nr.h"
    main(){
    for(;;){
    Vec_DP var(3);
    }
    }
    

    after a some number of iteration the program shold exit with an error into _nh_malloc_dbg ()
    I have any idea how to solve this problem 😞 can somebody help me

    Thanks.


Anmelden zum Antworten