barney_gumble1 Geschrieben 21. Juni 2006 Geschrieben 21. Juni 2006 Hallo, ich benötige eine Funktion, die eigentlich zwei Rückgabewerte hat. Natürlich ist das nicht möglich. Stattdessen habe ich mir überlegt Zeiger auf die beiden Rückagebwerte zu setzen und diese in ein Array zu packen und diesen Zeigern als Wert der Funktion zurückgeben. Sprich Zeiger auf Zeiger. Dazu gibt einiges im Netz, allerdings finde ich keine Lösung meines Problems. Irgendwelche Ideen? Danke
Klotzkopp Geschrieben 21. Juni 2006 Geschrieben 21. Juni 2006 Zeiger als Rückgabewert bedeutet immer, dass sich der Aufrufer um den Speicher kümmern muss. Oder Verlust von Threadsicherheit / Reentrance, wenn du Zeiger auf statischen Speicher zurückgibst. Warum packst du die Werte nicht in eine Struktur?
Guybrush Threepwood Geschrieben 21. Juni 2006 Geschrieben 21. Juni 2006 Oder übergibst die zu füllenden Variablen als Referenz?
barney_gumble1 Geschrieben 21. Juni 2006 Autor Geschrieben 21. Juni 2006 Oder übergibst die zu füllenden Variablen als Referenz? Meinst du als Parameter der Funktion? Dazu müsste ich sie global definieren und dass soll nicht sein. Diese sollen nur nach dem Funktionsaufruf entstehen. Aber das mit der Struktur hört sich interessant an. Probier ich mal.
Guybrush Threepwood Geschrieben 21. Juni 2006 Geschrieben 21. Juni 2006 Nein musst du nicht. BSP 1: #include <stdio.h> int test (int& a) { a = 6; return 0; } int main() { int i=2; test(i); printf ("%i\n",i); return 0; } [/PHP] BSP 2: [PHP] #include <stdio.h> int test (int* a) { *a = 6; return 0; } int main() { int i=2; test(&i); printf ("%i\n",i); return 0; } Wobei ich das 2te Beispiel besser finde da man im Ersten beim Aufrtuf der Funktion nicht sieht das der Wert verändert werden könnte.
russkij Geschrieben 21. Juni 2006 Geschrieben 21. Juni 2006 Meinst du als Parameter der Funktion? Dazu müsste ich sie global definieren und dass soll nicht sein. Diese sollen nur nach dem Funktionsaufruf entstehen. Aber das mit der Struktur hört sich interessant an. Probier ich mal. wieso global? hier beispiel: void test(int &var1, int &var2); int main() { int x; int y; test(x,y); //hier haben die variablen wert 1 und 2 return 0; } gruss void test(int &var1, int &var2) { var1 = 1; var2 = 2; } p.s o da war jemand schnella
barney_gumble1 Geschrieben 21. Juni 2006 Autor Geschrieben 21. Juni 2006 nein nein, ich glaube, dass ich falsch verstanden wurde. es geht mir nicht um zwei parameter, die per call-by-reference übergeben werden. das problem ist, dass ich eine funktion habe, in der zwei arrays erstellt werden. diese sollen dann return-wert der funktion sein.
Guybrush Threepwood Geschrieben 21. Juni 2006 Geschrieben 21. Juni 2006 und wo ist dabei das Problem? Du übergibst halt dann die zwei Zeiger und lässt sie in der Funktion dann auf den von dir reservierten Platz zeigen.
barney_gumble1 Geschrieben 21. Juni 2006 Autor Geschrieben 21. Juni 2006 eine funktion kann maximal einen return-wert haben!
Kitty82 Geschrieben 21. Juni 2006 Geschrieben 21. Juni 2006 ja, das hat auch die Lösung von Guybrush. Du gibst die Ergebnisse nicht über "return" zurück, sondern über die Parameter. Wo liegt hier dein Problem? :confused:
Guybrush Threepwood Geschrieben 21. Juni 2006 Geschrieben 21. Juni 2006 Um das mal etwas zu verdeutlichen hier ein Beispiel: #include <stdio.h> #include <malloc.h> #include <string.h> int MakeArray(char ***pZeiger); int main() { char **pTest=0; MakeArray(&pTest); strcpy(pTest[2],"Test!"); printf ("%s %s %s\n",pTest[0],pTest[1],pTest[2]); for (int i=0; i<3; i++) free(pTest[i]); free(pTest); return 0; } int MakeArray(char ***pZeiger) { (*pZeiger) = (char**) malloc(3*sizeof(char*)); for (int i=0; i<3; i++) { (*pZeiger)[i] = (char*) malloc (10*sizeof(char)); } strcpy((*pZeiger)[0],"Das hier"); strcpy((*pZeiger)[1],"ist ein"); return 0; } [/PHP]
Kratzy974 Geschrieben 22. Juni 2006 Geschrieben 22. Juni 2006 Bei genau zwei Rückgabewerten kann man auch mit der Klasse std :: pair arbeiten, um sich den Aufbau eine Struktur zu schenken. Beim Funktionsaufruf einer Funktion mir void func(int* any) kann auch NULL als parameter übergeben werden. Das muß in der Funktion mit überprüft werden. Aus dem Grunde bin ich eher für void func(int& any), da hier diese Abfrage in die Compilezeit gelegt wir (Compilefehler) anstatt wärend der Laufzeit passiert (if any == NULL -> return). Den Pointer würde ich bei optionalen Parametern verwenden. Dadurch ergibt sich auch eine andere Lesbarkeit (& - veränderbar, nötig, * - veränderbar optional ... )
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden