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ürtzt

    public 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 verarbeiten

    fü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 ); 
    }
    

Anmelden zum Antworten