Kann man ein Array per return zurückgeben lassen ?



  • Kann man ein Array per return zurückgeben lassen ?

    Danke

    Gruß
    binary



  • Koennen schon, obs sinnvoll ist, ist eine andere Frage.

    Wenn du eine lokale Variable by reference zurueck gibst, erzeugst du undefiniertes Verhalten.



  • Prinzipiell schon, da ein Array nur ein Pointer auf viel Speicher ist.

    int* gibmireinarray()
    {
        return arrayhalt;
    }
    

    gibmireinarray()[10];

    Dann hast du allerdings keine Pufferüberwachung, und desweiteren ist die Speicherbeschaffung problematisch, da lokale Objekte zerstört werden und HEAP-Speicher explizit freigegeben werden muss, weshalb ich eher zu einem std::vector in einem smart-pointer oder by reference raten würde...



  • ich bin grad dran mir ein paar funktionen für mein datenmodul zu schreiben.

    funktionen wie:

    datenbank connecten
    select_sql
    insert_sql
    update_sql
    delete_sql
    datenbank disconnecten

    bei der select funktion möchte ich es am liebsten so machen das ich in die funktion nur nen ansistring reinwerfe mit dem sql und er soll mir alle werte in ein schönes array verpackt zurückwerfen ...

    meinst das geht ihrgendwie ?
    würde mich auch mal interessieren wie andere ihre datenbankklassen machen!

    danke



  • Erstmal sind statische Arrays (von denen zumindest Shade gesprochen hat, und an die ich bei "Array" auch zuerst denke) nicht einfach nur Zeiger, immerhin kann man sie auch in structs verpacken und dann kopieren bzw. zurückgeben, nur unverpackt geht es leider nicht. Die Lösung hier wäre einen handlichen Array-Verpacker (z.B. boost::array, www.boost.org) zu nehmen.

    Statische Arrays bringen dich hier jedoch nicht viel weiter, weil du die Anzahl der Ergebnisse nicht vorhersehen kannst. Wenn du mit Array die komischen Mutanten meinst, die man über new[]/delete[] erstellt: Den Zeiger auf sie kann man problemlos zurückgeben, aber der Aufrufer kann damit nicht viel anfangen, weil er die Größe nicht herausfinden kann. Außerdem ist es dann schwer, das Speichermanagement korrekt zu regeln (auch wenn der Aufrufer an das delete[] denkt).

    Wenn die Ergebnisse nicht wirklich *sehr* umfangreich sind, verwende einfach vector<AnsiString> als Rückgabewert. Wie ein vector funktioniert, steht in jedem gutem Buch und notfalls sollte dir die Suchfunktion dazu genug ausspucken 🙂

    (Wenn das zu langsam ist (wie üblich: vorher messen! 😉 ), weil dabei alle Strings einmal kopiert werden müssen, ist ein auto_ptr<vector<AnsiString> > das Eleganteste, was man aus der Standardbibliothek herausholen kann, aber ich glaube nicht, dass du so tief in die Trickkiste greifen musst.)



  • warum denn plötzlich AnsiString?



  • Wenn du mich meinst, dann weil der OP ihn im Posting darüber erwähnt hat. So oder so wäre std::string wohl besser 🙂


Log in to reply