Array sauber zurück geben?
-
Hallo, wie gebe ich sauber ein Array zurück bei folgendem Code ist nur der erste Wert korrekt. Ich bekomme auch immer folgende warnmeldung.
warning C4172: returning address of local variable or temporary
Das ganze soll ja schon elegant Programmiert werden, deshalb möchte ich hier keine globale Variable Verwenden ist ja unschön

long* gibwaszurueck() { long rueckgabe[3]; ... Mache was rueckgabe[0] = x rueckgabe[1] = y; rueckgabe[2] = z; //xyz beliebige werte im longbereich //Testhalber hier nochmal ausgegeben alles richtig } void main() { long* l= gibwaszurueck(); printf("TEST1 %i", l[0]); //--> Wird richtig angezeigt printf("\nTEST2 %i",l[1]); printf("\nTEST2 %i",l[2]); }
-
Das Array wird am Ende der Funktion wieder zerstört und damit zeigt der zurückgegebene Zeiger auf "Müll". Lösungen gibt es mehrere:
- statisches Array (wird jedoch beim nächsten Aufruf dieser Funktion überschrieben)
- Speicher per new[] anfordern (muß vom Aufrufer freigegeben werden)
- verwende einen vector<>
-
Hallo
Du darfst generell keine Pointer/Referenzen auf lokale Instanzen zurückreben. Das heißt du must in de Funktion generell dynamisch ein Heap-Array ertsellen
long* gibwaszurueck() { long* rueckgabe = new long[3]; // ... rueckgabe[0] = x rueckgabe[1] = y; rueckgabe[2] = z; return rueckgabe; } int main() // kein void! { long* l= gibwaszurueck(); printf("TEST1 %i", l[0]); printf("\nTEST2 %i",l[1]); printf("\nTEST2 %i",l[2]); delete[] l; // Hier wieder löschen! }Das ist natürlich nicht elegant und sicher, deshalb sollte man lieber die richtigen C++Möglichkeiten ausnutzen und STL-Container benutzen
#include <vector> std::vector<long> gibwaszurueck() { std::vector<long> rueckgabe; rueckgabe.push_back(x); rueckgabe.push_back(y); rueckgabe.push_back(z); return rueckgabe; } int main() { std::vector<long> l= gibwaszurueck(); for (std::size_t lv = 0; lv < l.size(); ++lv) std::cout << l[lv] << std::endl; }/Edit : zu langsam... aber ausführlicher

bis bald
akari
-
Schick
habs auch gleich so übernommen
Aber wie würde es mit nem Statischen Array aussehen?eine anmerkung size_t ist kein Member of std sagt mir der Compiler, habs dann einfach mal entfernt das std. Achso generell ist es denn wichtig bei sowas wie dem Datentyp Vektor std davor zuschreiben?
Danke allen die mir geholfen haben

-
Tobias1984 schrieb:
Schick
habs auch gleich so übernommen
Aber wie würde es mit nem Statischen Array aussehen?So wie bei deinem obigen Ansatz, nur mit
static long rueckgabe[3];am Anfang.
(das Hauptproblem bei dem Ansatz ist, daß du das Array nur einmal hast und bei jedem Aufruf neu füllst:long* l1=gibwaszurueck(); cout<<l1[0]<<endl; long* l2=gibwaszurueck(); cout<<l1[0]<<' '<<l2[0]<<endl;eine anmerkung size_t ist kein Member of std sagt mir der Compiler, habs dann einfach mal entfernt das std. Achso generell ist es denn wichtig bei sowas wie dem Datentyp Vektor std davor zuschreiben?
Ja, alle Bestandteile der Standardbibliothek sind im Namensraum "std" untergebracht. Wenn du sie nicht per 'using' in den globalen Namensraum importierst, ist das std:: also Pflicht.
-
Achso, gut mach ich eigentlich immer. Mit dem
using namespace std;Das mit dem Vektor ist natürlich die schönste Variante, naja ist schon eine Weile her mit c++ in letzter Zeit hab ich immer in java Programmiert da denkt man halt nicht an solche Konstrukte
in C++