Strukturiertes Array übergeben
-
Hallo zusammen,
ich knobel die letzten Tage an einer Sache und hoffe Ihr könnt mir helfen. Ich möchte gerne eine Strukturiertes Array aus einer Funktion zurück an Main übergeben.
Der genaue Hintergrund, ich lese in einer "init" Funktion aus einer Datenbank Sätze in eine Struktur. Die Struktur initialisiere ich innerhalb der Funktion wobei die Anzahl der Arrayelemente der Anzahl der Sätze aus der Datenbank entspricht.
struct Struktur Array[numRows];
dann fülle ich innerhalb der Funktion die "neuen Strukturen" mit Daten aus der Datenbank und dann, ja dann weiss ich nicht mehr wie ich dieses Array zurück an mein Main übergeben bekomme.
Ich habe schon im Netz und in meiner Literatur gesucht und jede Menge über Arrays und Strukturen gefunden, ich weiss wie ich eine Struktur übergeben kann aber ein Array aus Strukturen bekomme ich nicht hin
Über Hilfe und Anregungen würd ich mich echt freuen.
-
Hi Toni,
vielleicht hilft das hier:
#include <stdio.h> struct bar { int val; }bar; struct bar* foo(struct bar *p) { int i = 0; for ( ; i < 10; i++) p[i].val = i; return p; } int main(int argc, char *argv[]) { struct bar array[10]; struct bar *pointer=array; int i = 0; foo(pointer); for ( ; i < 10; i++) printf("%d ", pointer[i].val); return 0; }
Du übergibst im Hauptprogramm eine Adresse auf dein Array.
Im Unterprogramm wird an diese Adresse geschrieben. Nach
dem Verlassen des UP stehen die Daten an der Adresse im
HP zur Verfügung.EDIT: Du kannst auch nur einen Pointer aus dem HP übergeben
und dann in deiner Init-Funktion Speicherreserviern, initialisieren
und den Pointer wieder zurückgeben.
-
Wie wärs mit ner funktion die numrows holt dann kannst du dein array definieren und an deine fuktion übergeben die es dir füllt
(nur so ne idee...)
-
Danke euch für die schnelle Antwort.
Ich muss zugeben das ich beide Ansätze selber schon probiert haben und diese funktionierten auch, aber ich dachte es wäre sauberer alles in einer Funktion zu machen und das Array sozusagen Dynamisch aufzubauen.
-
Du kannst das Array auch in der Funktion mit malloc() anlegen und dann nach außen übergeben - aber dann darfst du nicht vergessen, es am Programmende per free() wieder aufzuräumen.
-
So ich habs nun mal mit malloc bzw. calloc versucht. Aber nun bin ich mir sehr unsicher ob das eine saubere Art ist das ganze zu realisieren.
#include <stdio.h> #include <stdlib.h> #include <string.h> struct test { int val; } *atest; void init() { atest = calloc(7,sizeof(atest)); atest[0].val=0; atest[1].val=1; atest[2].val=2; atest[3].val=3; atest[4].val=4; atest[5].val=5; atest[6].val=6; } int main () { init(); printf("Value1=%i\n",atest[1].val); printf("Value5=%i\n",atest[5].val); free(atest); return 0; }
Das ganze compiliert ohne Probleme und Tools wie z.B. valgrind finden keine Fehler über Meinungen würd ich mich freuen.
Gruß und Dank
-
ToniT schrieb:
Das ganze compiliert ohne Probleme und Tools wie z.B. valgrind finden keine Fehler über Meinungen würd ich mich freuen.
Da siehst du es wieder auch valgrind kann mann austriksen. Dein code ist falsch.
// atest = calloc(7,sizeof(atest)); // falsch du reservierst 7 pointer atest = calloc(7,sizeof(*atest)); // besser
Kurt
-
@ZuK : Du hast natürlich recht, ist mir aber auch erst aufgefallen nachdem ich weitere Variablen der Strukt hinzugefügt habe.
Danke !!