array von strukturen als out Parameter
-
Hallo,
ich habe eine Funktion in c#, die Daten aus der Dartenbank ausliest und die Liste in parameter mit der Daten füllt.
Beispiel Code verkürtztpublic struct testStructManaged { public int index; public string name; } public bool Test(out List<testStructManaged> list)
und der Wrapper in C++/CLI
typedef struct TestStructUnmanaged { int index; char sName[41]; }testStructUnmanaged; int __stdcall Wrapper_Test(int* count, TestStructUnmanaged** testUnmanagedArray) { ... TestStructUnmanaged* testTemp = NULL; List<testStructManaged>^ list = gcnew List<testStructManaged>(); char* sName; Test(list); // Aufruf der c# funktion //iterieren der Liste und umkopieren in den unmanaged array von strukturen count = list->Count; // anzahl der Elemente in der Liste //Speicher alloc fuer unmanaged array von strukturen testTemp = (testStructUnmanaged*)malloc(sizeof(testStructUnmanaged)*count); for each (testStructManaged testManaged in list) { testTemp[i].index = testStructManaged .index; sName = (char*)(void*)Marshal::StringToHGlobalAnsi(testStructManaged.name); strcpy(testTemp[i].sName, sName); } *testUnmanagedArray = testTemp // umkopieren in den out Parameter }
der Aufruf von der Funktion in einem anderes C-Program
int _tmain(int argc, _TCHAR* argv[]) { TestStructUnmanaged*testArray = NULL; int count = 0; Wrapper_Test(&count, &Wrapper_Test); // speicher wieder freigeben if(testArray != NULL) free(testArray ); }
dieses Beipiel hat in einem Test Client funktioniert aber in das program wo ich das aufrufen möchte kommt es zu eine Zugriffsverletzung beim free().
ich finde diese Lösung nicht sauber weil der Speicher in den wrapper allokiert ist und nach dem Aufruf freigegeben wird. kann man das irgendwie besser machen.
Ziel ist eine Liste/Array.. von C# nach C zu übergeben und dort weiter verarbeitenfür jede Hilfe, Anregung bin ich dankbar
-
sibourg schrieb:
int _tmain(int argc, _TCHAR* argv[]) { TestStructUnmanaged*testArray = NULL; int count = 0; Wrapper_Test(&count, &Wrapper_Test); // speicher wieder freigeben if(testArray != NULL) free(testArray ); }
Du übergibst in deinen Code eine Referenz auf die Wrapper_Test- Funktion und nicht dein testArray.
-
sorry, das war ein copy-paste fehler in meine Frage
der Ausfruf sieht so aus
int _tmain(int argc, _TCHAR* argv[]) { TestStructUnmanaged*testArray = NULL; int count = 0; Wrapper_Test(&count, &testArray ); // speicher wieder freigeben if(testArray != NULL) free(testArray ); }