Struktur+Array
-
Hallo,
ich habe folgende Frage:
wie muss ich folgende Funktion definieren, damit ich als Rückgabewert statt eine Struktur eine Strukturarray (oder ArrayStruktur?) habe und wie muss dann diese aufgerufen werden?My_Struct testfunc(void *buff)
{
My_Struct myStruct;
....
return myStruct;
}void test()
{
My_Struct testStruct;
void *buffer;
buffer = malloc(sizeof(My_Struct));
testStruct = testfunc(buffer);
free(buffer);
}soetwas ist ja falsch:
My_Struct[] testfunc(void *buff)
{
....
}Danke für die Hilfe
Bahanfar
-
Du kannst keine Arrays als Rückgabewert zurückliefern, nur Zeiger (auf Arrays) - aber dann mußt du selber dafür sorgen, daß das Array das Ende der Funktion überlebt (dafür gibt es im Wesentlichen drei Wege - Heap, statische Variablen oder Übergabe als Parameter).
-
CStoll schrieb:
Du kannst keine Arrays als Rückgabewert zurückliefern, nur Zeiger (auf Arrays) - aber dann mußt du selber dafür sorgen, daß das Array das Ende der Funktion überlebt (dafür gibt es im Wesentlichen drei Wege - Heap, statische Variablen oder Übergabe als Parameter).
Danke für die Antwort. Was ich als C-Anfäger kann,ist: Übergabe als Parameter. Ich muss aber diese als heap bzw. statische Variable programmieren. Habe leider noch kein Tutorial gefunden, das diese für mich verständlich beschreibt.
-
Heap:
My_Struct* function(void* buf) { My_Struct* data = malloc(...); ... return data; } //Achtung: Der Aufrufer muß den Speicher später mit free() zurückgeben
Statische Variable:
My_Struct* function(void* buf) { static My_Struct data[MAX_LEN]; ... return data; } //Achtung: Der Array-Inhalt wird bei jedem Aufruf der Funktion neu überschrieben
Und der Vollständigkeit halber - Parameter:
My_Struct* function(My_Struct* data,void* buf) { ... return data; } //Achtung: Der Aufrufer muß genug Platz für das Array bereitstellen, bevor er die Funktion aufruft
(die Möglichkeiten von C++ spare ich hier mal aus, das würde zu weit führen)
-
Kann man nicht einfach das Array in einem struct kapseln? Dann wird doch auch das Array kopiert, oder?
Also hier mal als Beispiel:struct MyStruct { int data; }; typedef struct MyStruct MyStruct_t; struct MyStructArray10 { MyStruct_t structs[10]; }; typedef struct MyStructArray10 MyStructArray10_t; MyStructArray10_t get_10_MyStructs(int data) { MyStructArray10_t myStructs; int i; for (i = 0; i < 10; ++i) myStructs.structs[i].data = data; return myStructs; }
Oder geht das nur in C++?
Gruß
Don06
-
Das geht auch in C. Es ist aber bei größeren Arrays nicht sehr ökonomisch immer rumzukopieren. Einen Zeiger übergeben, bzw. in der Funktion selbst Speicher zu reservieren ist da geschickter. Wobei ich bis auf Ausnahmen (z.B. "Konstruktoren") auch die Variante "Zeiger übergeben" nehmen würde.
-
Tim schrieb:
Das geht auch in C. Es ist aber bei größeren Arrays nicht sehr ökonomisch immer rumzukopieren. Einen Zeiger übergeben, bzw. in der Funktion selbst Speicher zu reservieren ist da geschickter. Wobei ich bis auf Ausnahmen (z.B. "Konstruktoren") auch die Variante "Zeiger übergeben" nehmen würde.
danke euch allen