Funktion soll Array zurückgeben

Hi,

ich bin Java gewohnt. Deswegen kommt mir das gerade wohl etwas Spanisch vor :wink:
Ich möchte, daß eine Funktion einen Array zurückgibt, aber ich bekomme immer Fehlermeldungen. Selbst bei dieser, zum testen aufs geringste reduzierten Funktion:

int[] test(){
int t[2]={1,2};
return t;
}

Ich bekomme von Visual Studio 6.0 folgendes als Fehlermeldung:

  1. warning C4091: ‚‘ : Ignoriert auf der linken Seite von ‚int‘, wenn keine Variable deklariert wurde
  2. error C2143: Syntaxfehler : Fehlendes ‚;‘ vor ‚[‘
  3. error C2143: Syntaxfehler : Fehlendes ‚;‘ vor ‚[‘
  4. error C2143: Syntaxfehler : Fehlendes ‚;‘ vor ‚{‘

Im Netz habe ich Beispiele gesehen, die genauso aufgebaut sind wie meine test() Funktion, aber die kann ich auch nicht kompilieren.
Hat jemand ne Ahnung, woran das liegen könnte?

Besten Dank,
RBr2000

ich bin Java gewohnt. Deswegen kommt mir das gerade wohl etwas
Spanisch vor :wink:

Hmmm. C. Arrays. Spaß :smile:

Ich möchte, daß eine Funktion einen Array zurückgibt, aber ich
bekomme immer Fehlermeldungen. Selbst bei dieser, zum testen
aufs geringste reduzierten Funktion:

int[] test(){
int t[2]={1,2};
return t;
}

Die erste Zeile ist schonmal nicht wirklich gültig. Prinzipiell sind Arrays durch Pointer dargestellt, d.h. man gibt einen Pointer zurück, wenn man mit Arrays spielt:

int\* test( void ) {
 int t[2] = {1,2};
 return t;
}

Jetzt kommt das nächste Problem: Das Array t liegt auf dem Laufzeitstack der Funktion test(), der nach der Rückkehr nicht mehr unbedingt gültig ist (wird spätestens beim nächsten Funktionsaufruf überschrieben). Mit „return t“ gibst du also einen Zeiger auf den Stack der Funktion zurück, was gelinde gesagt gefährlich ist. Normalerweise behandelt man das in C so, dass man das Array, auf dem die Funktion arbeiten soll in der aufrufenden Funktion erzeugt und dann übergibt:

void test( int\* t ) {
 t[0] = 1;
 t[1] = 2;
}

void caller( void ) {
 int t[2];
 test( t );
}

Hi,

ums richtig sauber zu machen sollte man aber noch die Anzahl übergeben, dass man nicht ausserhalb des gültigen Bereichts springen kann :smile:

void test( int* t, int count ) {
for(int i=0; i

Hallo,

ich bin Java gewohnt.

Das bedeutet, Du musst nicht explizt angeforderten
Speicher aufräumen (Deallokieren), wenn Du ihn
nicht mehr brauchst. Bei Java macht das ja
der „garbage collector“.

In C/C++ gibt es so ein Konzept erstmal nicht,
daher entfernst Du den Speicher, den Du
explizit anforderst. In C++ kann man
diesen Mechanismus in einer „Klasse“
verstecken, die sich dann darum kümmert.

Deswegen kommt mir das gerade wohl etwas
Spanisch vor :wink:
Ich möchte, daß eine Funktion einen Array zurückgibt, aber ich
bekomme immer Fehlermeldungen.

Das simpelste Konstrukt wäre in C folgendes:
(Achtung, C/C++ kümmern sich nicht darum,
ob Du über das Ende des Feldes hinausschreibst,
das ist die Sache des Programmierers! Die
„+ 1“ nehme ich mal zur Sicherheit mit rein
für Leute, die vorher mit 1-bündigen Feldern
gearbeitet haben (DIM Array [1…1000])

 int\* testarray(int wiegross)
{
 int \*t = (int\*) malloc( (wiegross + 1) \* sizeof(int) );
 return t;
}

 void deletearray(int \*array)
{
 free(array);
}

Da die Speicheradresse, die erzeugt wird, immer
anders sein wird, kann man auch nicht ein array[]
zurückgeben (konstante Adresse), sondern einen
*Zeiger.

in C++ liest sich das so

 int\* testarray(int wiegross)
{
 int \*t = new int [wiegross + 1];
 return t;
}

 void deletearray(int \*array)
{
 delete [] array;
}

Im Netz habe ich Beispiele gesehen, die genauso aufgebaut sind
wie meine test() Funktion, aber die kann ich auch nicht
kompilieren.
Hat jemand ne Ahnung, woran das liegen könnte?

Ja, das liegt amUnterschied der C/C+±Syntax zu Java :wink:

Grüße

CMБ