Int[] zurück liefern lassen von Methode-Syntax?

Hi,

wie schaffe ich es, dass eine Methode ein int[] zurück liefert. Habe folgenden Code ausprobiert und der Compiler sagt, dass die Methode nicht zur Klasse gehört. nehme ich die [] weg und liefere einen ganz normalen int zurück funzt es. Ich muss aber eben zwei Werte an die aufrufende Stelle zurückgeben. Wie kann ich dies also realisieren?
Oder bin ich mit meiner Methode total falsch und ich muss vielleicht über Referenzen mit & arbeiten? Wenn ja wie genau?
Danke für eure Hilfe.

in der Header Datei:

int[] insert(string bitCode);

in der cpp Datei:

int[] Tree::insert(string bitCode)
{
int adresses[2];
adresses[0] = -1;
adresses[1] = -1;

return adresses;
}

Danke.

Gruß
Pfanni

Hallo Thomas!

int[] insert(string bitCode);

Das kann man machen.

in der cpp Datei:

int[] Tree::insert(string bitCode)
{
int adresses[2];
adresses[0] = -1;
adresses[1] = -1;

return adresses;
}

Und hier sage ich: Ouch! Inn[] ist dasselbe wie int*, ein Pointer auf
das nullte Element des Arrays. Und hier bekommst du das Problem, daß
du im Scope von Tree::insert() eine lokale Variable deklarierst
(addreses), einen Pointer auf sie zurückgibst und die Variable dann
out of scope gehen läßt (Speicher weg). Damit hast du einen Pointer
ins Nirvana, der etwas später sicherlich das ganze Programm auf die
Reise dorthin schicken wird (i.e. Absturz).

Zwei Möglichkeiten: Wenn es nicht gerade zeitkritisch ist, nimm std::
vector, das Vektor-Template aus der Standard Template Library.
Ist zwar langsam (vor allem die Implemenatation von Microsoft), aber
tut meistens. Wenn du aber Arrays benutzen willst, mach’s
folgendermaßen:

int * Tree::insert()
{
int * addresses = new int[2];
int[0] = int[1] = -1;
return addresses;
}

Du mußt dann nur daran denken, daß der Speicher irgendwo wieder
freigegeben werden muß.

Was ich daran allerdings unschön finde, ist das Design: Hier geht das
Ownership des Speichers von der Klasse Tree (die Methode insert hat
den Speicher besorgt) auf die aufrufende Methode über. Wenn die auch
in Tree liegt (bzw. insert private oder protected ist), ist das
vermutlich in Ordnung. Wenn ein Benutzer allerdings diese Methode
aufrufen kann, mußt du irgendwie sicherstellen, daß er den Speicher
wieder freigibt, und das ist gar nicht so einfach. Solltest du dann
ggf. anders kapseln, aber das wäre ein eigener Thread und hängt stark
von deinem restlichen Programm ab!

Viel Spaß noch mit Bäumen,

Chris

hi Pfanni,
wenn deine funktion unbedingt zwei int-werte zrückgeben muss, eine andere lösung wäre eine struktur zu benutzen, die deine werte enthält.
die funktion kann dann eine kopie der strukture zurückgeben

youssef

danke für deine Tipps. Ich hab jetzt nochmal etwas rumgespielt und folgende Lösung benutzt. Das mit new auf dem Heap lasse ich lieber, da dies hier ein Uni-Praktikum ist und wir den Heap mit new nur benutzen dürfen wenn unbedingt notwendig. Ich benutze auch kein Array mehr sondern zwei Einzel-int-Werte. Die reichen ja auch.

Header vom Tree:

int insert(string bitCode, int* offset, int* flag_split);

Aufruf:

int test = tree.insert(newArtikel.GetBitcode(hashKey), &offset, &flag_split);

im Tree:

int Tree::insert(string bitCode, int* offset, int* flag_split)
{
*flag_first = 11111;

return 0;
}

Dein mir Spaß beim Baum zu wünschen ist echt nett *gg* Momenatn wühle ich mich per Rekursion durch. Das ganze hier soll dynamisches Hashing werden.

Gruß
Pfanni