005
15.01.2004, 13:01 Uhr
RHBaum
|
Aber die DLLs nutzen eine C Schnitstelle ... also waere die frage aequivalent zu: Wie gebe ich unter C als Rueckgabewert einer Funktion ein Long-Array zurueck ?
Antwort: Zeig mal deine Finger her und gib mit mal den Rohrstock da ...:p
Im ernst ... Arrays sind eine komplexe geschichte, und grade bei solchen Anwendungsfaellen nen stolperstein ...
was wissen wir von arrays ?
- die variable repraesentiert eigentlich die Adresse des 1. wertes im array. - Arrays koennen statisch oder dynamisch erzeugt werden.
Weiter gibts noch paar richtlinien : - Erzeuge Dynamische Variablen immer so weit wie moglich am ort des geschehens - erzeuge dynamsiche variablen aber auch so, das sie dort zertsoerst, wo du sie auch erzeugst. Also in der gleichen funktion / methode, oder im konstruktor/Destruktor der selben klasse (fuer c ist nur 1.tes relevant.)
Daraus leiten wir ab: um arrays zu spezifizieren hab ich 3 Paarmeter. den typ, die startadresse die groesse. Die krieg ich aber nur in 2. variablen, parameter unter, als zeiger auf typ (fuer adresse und typ) und groesse. deshalb ... ist ein array als reuckgabetyp eher ungeeignet. Schau dir die WinAPI an, da wirst sowas auch nie finden ...
Wie macht man nun sowas ?
DIe winapi deklariert funktionen der art meist so
int myfunc(long * pdata,int buffersize, int * size);
Rueckgabe ist nen Fehlerindikator pdata, ist zeiger auf das Array, buffersize ist die groesse des arrays size ist die anzahl der elemente, die die funktion wirklich reingeschrieben hat.
Wichtig, die funktion allociert keinen speicher, das solltest selbst machen.
Um den benoetigten speicher im voraus berechnen zu koennen, und nicht auf verdacht endlos viel speicher zu allokieren, unterstuetzen manche funktionen 2 modi. im 2. modi gibst als pdata NULL (0) an, und als buffersize auch, dann gibt dir die funktion in size die benoetigte groesse des arrays zurueck ...
aussehen tut das dann folgendermassen statisch:
C++: |
long data[500]; int valuecount; int ireturn = myfunc(data,500,&valuecount);
|
dynamisch:
C++: |
int array_size; int ireturn = myfunc(0,0,&array_size); long * data =(long *) malloc(array_size * sizeof(long)); int valuecount; ireturn = myfunc(data,array_size ,&valuecount);
|
Natuerlich fehlen noch ne menge code um fehler abzufangen, rueckgabewert und den wert in size solltest auf alle checken ...
Hoffe das hilft ....
CIao Dieser Post wurde am 15.01.2004 um 13:07 Uhr von RHBaum editiert. |