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 

Einbinden einer DLL, Speichermanagement



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!

13.10.2009, 18:59 (Dieser Beitrag wurde zuletzt bearbeitet: 13.10.2009 19:07 von rolfk.)
Beitrag #3

rolfk Offline
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
Einbinden einer DLL, Speichermanagement
' schrieb:
Code:
unsigned int GetData(double **X, double **Y);

Das ist wie Du schon richtig erkannt hast jeweils ein Pointer auf ein Array.

Zitat:Typ: Array
Datentyp: 8-Byte-Double
Dimension: 1
Array-Format: Array-Handle
An die Ein- und Ausgänge des LabVIEW-Blocks habe ich zum Testen Bedien- bzw. Anzeigeelemente gehängt.

Das geht leider so nicht. LabVIEW Arrays sind speziale LabVIEW Handles und müssen deshalb auch mit LabVIEW Funktionen alloziert und dealloziert werden. Da kannst Du nicht einen Speicherbereich der von einer DLL einfach so angelegt wird hineinwürgen. Auch die Pointer to Handle Option ist hier keine Lösung.

Zitat:Das Problem ist, dass LabVIEW nach dem Aufruf entweder den Dialog "Nicht genügend Speicher zum Abschließen dieser Operation" anzeigt, oder direkt nach der Ausführung abstürzt. (Unabhängig davon, ob ich die Funktion zum Freigeben des Speichers aufrufe oder nicht.) Ich denke mal, da kommen sich die DLL und der Speichermanager in die Quere, oder?

Das ist logisch und Deine Vermutung, dass das mit Speichermanagement zu tun hat trifft hier im Prinzip zu. Die DLL alloziert einen Speicher durch Aufruf von alloc() oder anverwandten Freunden und Du gibts Sie an LabVIEW zurück und sagst ihm schau das ist ein Arrayhandle. Irgenwann versucht LabVIEW das vermeintliche Arrayhandle anzusprechen oder auf seine eigene Weise zu deallozieren und läuft schrecklich ins Nirvana.

Zitat:Tja jedenfalls weiß ich nicht genau wie ich die Funktion behandeln soll, sodass keine Speicherkonflikte entstehen.

Da hängt davon ab was Du mit diesem Array in LabVIEW tun können musst. Grundsätzlich kannst Du diesen Arraypointer ganz einfach als Pointersized Integer behandeln (in Deinem Fall konfigurierst Du den Parameter als Pointersized Integer, Pass Pointer to Value). Dann bekommst Du in LabVIEW einen 32/64 Bit-Integer der den Pointer auf das Array representiert. Musst Du diesen Pointer "nur" an andere C Funktionen mittels Call Library Node übergeben, ist das Problem schon gelöst.
Willst Du dagegen die Daten im Array in LabVIEW auch noch lesen können, kommst Du nicht darum herum die entsprechende Information aus diesem Pointer herauszukopieren. Das kann man tun indem man die LabVIEW C Funktion MoveBlock() mittels Call Library Node aufruft.

Das geht ungefähr so:

Library Name: LabVIEW
Function Name: MoveBlock
Calling Convention: C
return value: void
1. Parameter: source, pointersized integer (Dein Pointer von Deiner Funktion)
2. Parameter: dest, Arraytype Deiner Wahl passed als C Array Pointer
3. Parameter: length, int32, passed as value, hier übergibst Du die Anzahl Byte die kopiert werden müssen, also Anzahl Arrayelemente * Arrayelement size in Bytes (8 für double Array)

Last but not least: Pointer die irgendwann angelegt wurden sollten auch wieder dealloziert werden. Deine DLL sollte dazu entsprechende Funktionen exportieren oder die Dokumentation sollte erwähnen, welche (OS-)Funktion dazu verwendet werden sollte. Verwendung von free() ist jedenfalls keine Option, da die DLL und der Aufrufer zwei verschiedene Versionen der C Runtime Library verwenden könnten und dann ist ein Speicherbereich, angelegt in der einen Runtime, undefiniert innerhalb der anderen.

Rolf Kalbermatter
CIT Engineering Netherlands

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 


Nachrichten in diesem Thema
Einbinden einer DLL, Speichermanagement - rolfk - 13.10.2009 18:59

Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  Einbinden einer DLL mit mehr Output-Parametern, als Input-Parametern Herm 3 6.253 14.06.2011 11:12
Letzter Beitrag: rolfk
  DLL in LV einbinden. Geht es nur mit einer anderen Wrapper-DLL Dimitri 24 27.166 02.07.2010 15:16
Letzter Beitrag: Dimitri
  Einbinden einer dll (*.so) Apu 3 6.331 08.03.2010 19:51
Letzter Beitrag: rolfk
  Problem beim Einbinden einer DLL preacha 18 19.224 25.09.2008 11:51
Letzter Beitrag: baliik
  Einbinden einer Delphi-dll Svenni 6 8.377 17.10.2006 12:05
Letzter Beitrag: Svenni

Gehe zu: