Antwort von
nach 8 Stunden
hilfreich
Re^2: Felder und Funktionen
[...]
2. Wie deklariere ich Funktionen, die Felder zurueckgeben
sollen?
3. Welchen Befehl musz ich verwenden, um eine Funktion dazu zu
bewegen, ein Feld zurueckzugeben?
return(x); // x ist ein float-Feld
funktioniert nicht so richtig...
[...]
Sollen es aber 'echte' Arrays sein, kommt man AFAIK nicht
darum herum, ein Array als (konstanten) Zeiger auf das erste
Element zu betrachen, und diesen dann auch in der Funktion
zurückzugeben ...
int *h()
{
static int i[5] = { 1, 2, 3, 4, 5 };
return &i[0]; // <- mein VC++ ist hier ziemlich pingelig
;-)
}
main ()
{
int *a;
a = h();
// Zugriff dann über a[0], a[1] etc ...
}
Zugegeben, die Sache ist zeimlich haarig, und bestimmt fangen
auch verschiedene Compiler an verschiedenen Stellen zu meckern
an (z.B. hat sich mein VC++ bei der Verwendung 'int a[5];'an
der Stelle 'a = h();' die Arbeit eingestellt, was doch
eigentlich des guten zu viel ist? Was sagen die Experten?).
Außerdem muß der zurückgegebene Zeiger statisch sein, da es
bei dem zurückgegebenen Array um ein temporäres Objekt
handelt, welches zum Zeitpunkt der Zuweisung noch korrekt im
Speicher verhanden sein sollte.
Falls es aber in der Funktion einfach darum geht, irgendwie
das Array zu 'vertüdeln', finde ich es übrigens geschickter
einfach die Adresse(Referenz) des Arrays in die Funktion zu
übergeben, um das Array dort direkt zu ändern und um sich
diesen 'static-Quatsch' zu sparen ;-)
z.B.
void i(int *a)
{
a[2]=99;
}
main()
{
a[5]= { 1, 2, 3, 4, 5 };
i(&a[0]);
}
HTH,
Jo
Hi,
sollte auf Verwendung der STL verzichtet werden, sollten
die Arrays dynamisch in der Funktion allociert und nach
der erfolgten Verabeitung in der aufrufenden Funktion
frei gegeben werden.
Von der Verwendung der statischen Variablen rate ich
dringend ab. Damit erreicht man nämlich, daß die betreffende
Funktion nicht mehr reentrant wird. D.h., wird die
Funktion erneut aufgerufen, verändert sich der Wert der
statischen Variablen mit an die Sicherheit grenzenden
Wahrscheinlichkeit. Die vorher zurückgegebene Referenz
behält aber scheinbar ihre Gültigkeit bei.
Auch wenn man die Rückgabewerte stets nach dem Aufruf
der Funktion in eine andere Variable kopiert, handelt man
sich an der gleichen Stelle Probleme ein, spätestens wenn
die Funktion in einer multithreaded Umgebung eingesetzt
wird.
Also, folgender Vorschlag:
// C++
int main(int argc, char** argv)
{
float* f = g();
do_something_with_f(f);
if (f)
delete [] f;
return 0;
}
float* g()
{
float* array = new float[10];
do_work(array);
return array;
}
// C
int main(int argc, char** argv)
{
float* f = g();
do_something_with_f(f);
if (f)
free(f);
return 0;
}
float* g()
{
float* array = (float*) malloc(10);
do_work(array);
return array;
}
Grüße,
Lydia