Übergabe eines C Array - Druckversion +- LabVIEWForum.de (https://www.labviewforum.de) +-- Forum: LabVIEW (/Forum-LabVIEW) +--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein) +---- Forum: DLL & externer Code (/Forum-DLL-externer-Code) +---- Thema: Übergabe eines C Array (/Thread-Uebergabe-eines-C-Array) |
Übergabe eines C Array - abrissbirne - 10.04.2008 14:11 Hallo, ich arbeite mich gerade in die Einbindung von DLL's in LabVIEW und Erzeugung von DLL's über Visual Studio ein. Früher habe ich dies über CIN's gemacht. Momentan bekomme ich ein fertiges C Array aber nicht an LabVIEW übergeben. Wenn ich Position für Position fülle funtkioniert es. Folgend der funktionsfähige Code: <div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'>uInt16 *ElementPointer; uInt16 Reihen2 = 10, Spalten2 = 5; int32 i, j, x; (*Initialize)->dimSizes[0] = Reihen2; (*Initialize)->dimSizes[1] = Spalten2; ElementPointer = (*Initialize)->Numeric; for(i = 0; i < Reihen2; i++) { for(j = 0; j < Spalten2; j++) { *ElementPointer = 0; for(x = 0; x < Reihen2*Spalten2; x++) { *ElementPointer = 0; ElementPointer++; } } }</div> Jetzt würde ich gerne ein bereits gefülltes Array übergeben. Sowas in der Art: <div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'>uInt16 Array[2][2]; Array[0][0] = 0; Array[0][1] = 1; Array[1][0] = 2; Array[1][1] = 3;</div> Danke für eure Hilfe. Übergabe eines C Array - rolfk - 13.04.2008 22:12 ' schrieb:Hallo, C Arrays werden vom Caller alloziert, d.h. wenn Du ein Array von einer Funktion zurückgeben willst, muss der Aufrufer (hier LabVIEW) ein Array allozieren das gross genug ist und der Aufgerufene (Deine DLL) füllt dieses dann ein. Wenn Du ein statisches Array hast so wie das bei Dir scheint, bleibt Dir nichts anderes übrig als dessen Inhalt in das LabVIEW Array hineinzukopieren. So funktioniert C! Zurückgeben eines Array Pointers ist zwar im Prinzip möglich aber bedingt Aushandlung von Memory Manager Konventionen. Du wirst dieses Array irgendwie allozieren müssen (malloc(), HeapAlloc()) oder irgendeine andere Funktion die Dein Entwickelsystem unterstützt und dann auch eine entsprechende Funktion exportieren die diesen Arraypointer wider auf die richtige Weise aus dem Speicher entfernt. Zum Beispiel ist es nicht genügend um zu sagen dass das Array mit free() dealloziert werden muss da der Aufrufer eine andere Standard C Library Implementation verwenden kann dann Dein Programm und dann gibts Probleme da der Heap von der Visual C runtime Library auf der Basis von den Windows APIs implementiert wird, aber LabVIEW beispielsweise sehr lange einen Memorymanager auf der Basis von Smartheap benützte und andere Umgebungen können wieder eigene Memory Manager Routinen verwenden oder gar selber implementieren. Zurückgeben eines Pointers auf statisches Memory is schon gar nicht zu empfehlen. Das macht eine DLL absolut nicht Multitasking oder gar Multicore kompatibel. Rolf Kalbermatter |