array als rückgabewert
-
hallo ich versuche eine ganz einfache unktion zu schreiben
die ein int array als parameter erwartet und ein array zurückgibt, in dem die elemente der größe nach geordnet sindmein bisheriges ergebnis:
int* nsort(int* x,int size) { int i= 0; int j = 1; int copy[size]; for(int i=0; i< size ; i++) { copy[i] = x[i]; } int temp; for(i=0; i < (size-1); i++) { for(j= i+1; j < (size);j++) { // cout << "Vergleich:" << x[i] << " " << x[j] << endl; if( copy[i] > copy[j]) { // cout << copy[i] << " groesser als "<< copy[j] << endl; temp = copy[i]; copy[i] = copy[j]; copy[j] = temp; } else { // cout << x[i] << " kleiner als "<< x[j] << endl; } } } return copy; }was läuft da schief?
der mainmethodenaufrur:
[code]
int main()
{
int arr[11]={11,2,3,65,78,2,3,1,1,1,-4};int *x = nsort(arr, sizeof(arr)/sizeof(int));
for(int i =0;i<11;i++)
{
cout << arr[i]<< " ";
}
cout << endl;for(int i =0;i<11;i++)
{
cout << x[i]<< " ";
}
}
[code]ich habe die vermutung dass wegen der lokalen gültigkeit von copy einiges schief geht ...
wie macht man es richtig?
-
gib kein Array zurück sondern nimm die C++ STL Container. Soll heißen, nutze std::vector<T>. STL Vector
-
ich habe die vermutung dass wegen der lokalen gültigkeit von copy einiges schief geht
Exakt.copy ist nur lokal gültig. Und wird somit am Ende des Scopes (der Funktion) wieder zerstört. Du bist aber so mutig und gibst einen Zeiger darauf zurück, der nach der Funktion auf ungültigen Speicher zeigt. (Was undefiniertes Verhalten hervorruft, sprich alles mögliche passieren kann).
Du könntest jetzt aber auf die Idee kommen und dir den Speicher per new holen, was funktioniert und wenn der Benutzer der Funktion den Speicher auch wieder freigibt kein Problem ist. Diese Methode ist aber alles andere, als schön und sollte dringend vermieden werden. Somit bleibt dir nichts anderes übrigt, als das ganze in ein Objekt zu packen, dass Kopiersemantik anbietet. Da kannst du was eigenes schreiben (wenn du ein wenig mehr Erfahrung),oder wie schon gesagt std::vector benutzen.
-
jetz fühl ich mich richtig dumm:
also ich bräuchte folgendes:
eine funktion die mir zu einem array mitn n elementen ein anderes array zurückgibt dessen elemente der größe nach sortiert sind.
wenn ich jetz richtig verstanden hab soll ich statt
int arr[] einen
std::vector<int> vecverwenden, soweit erstmal richtig?
das problem ist... ich kenn mich nich so aus mit der stl aber wenn ich auf bestimmte elemente zugreifen will mit for(;;) zugreifen will
dass ich da einen iterator benötige oder?so was in der art
for(i=;i< size;i++) { vec.push_back(i); } for(i=0;i<size;i++) { cout << vec[i]; }sollte eig nicht funktionieren oder?
-
gasst schrieb:
das problem ist... ich kenn mich nich so aus mit der stl aber wenn ich auf bestimmte elemente zugreifen will mit for(;;) zugreifen will
dass ich da einen iterator benötige oder?Ja und Nein. Der Indexzugriff ist bei bestimmten Containern (wie dem std::vector) erlaubt [sofern genügend Elemente definiert sind], bei anderen (std::list) nicht. Und das Grundprinzip der Iteratoren ist an sich nicht unbedingt viel schwieriger, wenn man sich an die Syntax einmal gewöht hat.
Das folgende ist durchaus erlaubt:
std::vector<int> vec; for(int i=0; i<10; ++i) vec.push_back(i); for(int i=0, size=vec.size(); i<size; ++i) cout << vec[i];cu André