INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

Übergabe eines C Array



Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!

10.04.2008, 14:11 (Dieser Beitrag wurde zuletzt bearbeitet: 10.04.2008 14:12 von abrissbirne.)
Beitrag #1

abrissbirne Offline
LVF-Stammgast
***


Beiträge: 480
Registriert seit: Aug 2007

LV2009, LV2010
2007
EN

66123
Deutschland
Übergabe eines C Array
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.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
13.04.2008, 22:12 (Dieser Beitrag wurde zuletzt bearbeitet: 13.04.2008 22:14 von rolfk.)
Beitrag #2

rolfk Offline
LVF-Guru
*****


Beiträge: 2.302
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
Übergabe eines C Array
' schrieb: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.

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

Rolf Kalbermatter
Technische Universität Delft, Dienst Elektronik und Mechanik
https://blog.kalbermatter.nl
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  DLL mit String Nullpointer Übergabe Hubert R. 5 4.752 25.08.2023 11:43
Letzter Beitrag: rolfk
  Übergabe eines struct arrays an eine DDL und wieder Auslesen SK-AC 4 6.466 12.08.2010 17:01
Letzter Beitrag: rolfk
  Mehrere Cuda DLLs Context-Übergabe grey 2 5.520 17.06.2010 19:50
Letzter Beitrag: rolfk
  LV 7.1, VC++-DLL (VC++2008), string-Übergabe ptillmann 1 4.746 12.03.2010 20:34
Letzter Beitrag: rolfk
  Unhandled exception bei Übergabe eines CArrays abrissbirne 8 8.239 25.04.2008 23:31
Letzter Beitrag: abrissbirne
  Übergabe von Datenzeiger Cubaner 3 5.466 22.01.2008 13:18
Letzter Beitrag: rolfk

Gehe zu: