C++ Funktionsaufruf mit arrayuebergabe und call by reference



  • Zeas Leitln,

    Sitze gerade in unserer tollen schule und solle eine c++ funktion erstellen, welches ein (in JAVA™ gesprochen) String[] zurueckgibt.
    Da es ja in C++ keine wirklichliches String[] gibt sollen wir es mit einem Pointer auf char[] loesen. Wenn ich nun dieses char[] array gebenwill habe ich das problem, dass der Pointer auf null zeigt, weil das array am ende der funktion ja geloescht wird. Nun dachte ich an eine CallByReference, doch da gibt es immer noch einen fehler.
    Code:
    --------------------------------

    void Eingabe(*char[] &par_alle){
    

    -------------------------------

    Schianen tach no,
    MfU
    mia



  • In c++ nennt sich das std::string.

    Mit char könnte es so aussehen:

    void foo(char * ziel,size_t maxZeichenInZiel)
    {
       ....
    }
    
    Alternativ:
    
    void foo(char * ziel,size_t maxZeichenInZiel)
    {
       return ziel;
    }
    


  • Ich dachte immer void Foo() gibt keinen Wert zurueck... 😮



  • Und wozu die Länge übergeben? Zeichenketten werden doch nicht ohne Grund mit einer
    '\0' abgeschlossen.



  • Weil es so gedacht ist, dass man den Speicher selbst zur Verfügung stellt und die Funktion reinschreiben lässt. Sonst würde man den Zeiger per Referenz übergeben, oder so. Da mehrere Strings übergeben werden sollen, müsste sich der Benutzer sich die dann wohl per Nullterminierung aus dem Speicherblock fischen. Sehr komfortabel. Solange der Benutzer der Funktion fleißig genug ist, das Ergebnis selbst freizugeben, wäre eine Lösung:

    char** funktion()
    {
        char** result = new char*[1337];
        result[0] = new char[4];
        result[1] = new char[7];
        result[1336] = 0; // Nullterminierung
        ...Array weiter füllen...
        return result;
    }
    
    void benutzer()
    {
        char** meineStrings = funktion();
        ...benutzen...
        char** meinStringIter = meineStrings;
        while (*meinStringIter != 0)
            delete[] *meinStringIter;
        delete meineStrings;
    }
    

    Das war jetzt wohl der Zeiger-verseuchteste Code, den ich je in C++ schreiben musste, also würde ich ihn nicht ungetestet hinnehmen. Und der Lehrer mag std::string und std::vector wirklich nicht?



  • D1BAKEL schrieb:

    Ich dachte immer void Foo() gibt keinen Wert zurueck... 😮

    Aaaahhh!
    Ja war natärlich char * foo() gemeint O🤡



  • Ich weiß... 😉


Anmelden zum Antworten