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 

DLL: C++ Addresseninhalt an Labview schicken



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!

17.08.2011, 10:36
Beitrag #1

Castorp Offline
LVF-Neueinsteiger


Beiträge: 6
Registriert seit: Aug 2011

2010
2010
DE



DLL: C++ Addresseninhalt an Labview schicken
Hallo,

Ich habe eine DLL in Labview eingebunden. Die Funktion berechnet die Distantz zwischen zwei Geometrien im Raum. Der C++-Code sieht grob wie folgt aus:

1. Objekt m1 wird erstellt (Geometrie 1)
2. Objekt m2 wird erstellt (Geometrie 2)
3. Distance(&dres,&m1,&m2); (Funktionsaufruf, dres=distance result)


Ich möchte die DLL jetzt in zwei DLLs aufteilen:

In der ersten DLL werden die Objekte erstellt.
Die zweite DLL soll nur noch die Funktion Distance(&dres,&m1,&m2); ausführen.

Meine Frage ist nun: Wie reiche ich die Adressen &m1 und &m2 and die zweite DLL weiter?
Wird der Inhalt der Adresse nicht nach dem Ausführen der ersten DLL gelöscht?
Muss ich den Inhalt und nicht nur die Adresse erst an Labview weitergeben und dann an die zweite DLL schicken?


Vielen Dank für die Hilfe!

Gruß
Castorp
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
18.08.2011, 13:16
Beitrag #2

M@rRy Offline
LVF-Padawan
***


Beiträge: 273
Registriert seit: Aug 2011

7.1
2011
EN


Deutschland
RE: DLL: C++ Addresseninhalt an Labview schicken
Moin,

wie hast du denn deinen C Code eingebunden?

Gruß

Nur wer neugierig ist, lernt ständig dazu.

Mythos:
Mit LabView lassen sich gut Programme leichter entwickeln

Realität:
Mit LabView lassen sich gut und schlechte Programme leichter enwickeln!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
19.08.2011, 16:52
Beitrag #3

Castorp Offline
LVF-Neueinsteiger


Beiträge: 6
Registriert seit: Aug 2011

2010
2010
DE



RE: DLL: C++ Addresseninhalt an Labview schicken
Hallo,

bis jetzt habe ich die Variablen mit Hilfe von Zeigern übergeben.
Ich glaube ich kann das Problem jetzt genauer formulieren:

Die Objekte m1 und m2 gehören zu einer Klasse und zwar zur Klasse "Model".

"buildmodel" heißt die Funktion der DLL.
x, y und z sind Arrays der Punkte, die die Geometrie beschreiben.

OURDLL_API int* buildmodel(double *x, double *y, double *z)
{
....erstelle Objekt....

return &m1;
}


-> error C2440: 'return': 'Model *' kann nicht in 'int*' konvertiert werden


Wie kann ich ein Objekt an Labview schicken? Gibt es Zeiger, die nicht an einen Datentyp gebunden sind?

Dankeschön für eure Hilfe.

Gruß
Castorp
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
19.08.2011, 17:01
Beitrag #4

jg Offline
CLA & CLED
LVF-Team

Beiträge: 15.864
Registriert seit: Jun 2005

20xx / 8.x
1999
EN

Franken...
Deutschland
RE: DLL: C++ Addresseninhalt an Labview schicken
Ein Zeiger ist ja nichts anderes als eine Adresse im Speicher (also eine U32 / U64).
Wenn du also so tust, als ob der Rückgabewert eine U32 ist, solltest du den Zeigerwert erhalten.

Gruß, Jens

Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)

!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!

Einführende Links zu LabVIEW, s. GerdWs Signatur.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
22.08.2011, 13:10
Beitrag #5

Castorp Offline
LVF-Neueinsteiger


Beiträge: 6
Registriert seit: Aug 2011

2010
2010
DE



RE: DLL: C++ Addresseninhalt an Labview schicken
Danke, Jens! Das hat mich schonmal weitergebracht. Es funktioniert mit dem Rückgabewert void*.

Allerdings gebe ich jetzt die Adresse einer lokalen Variable zurück, d.h. der Inhalt wird in Labview möglicherweise überschrieben oder geht verloren, habe ich das richtig verstanden?
Ist es möglich den Inhalt zu sichern, ohne den gesamten Inhalt als Variable ausgeben zu müssen?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
24.08.2011, 09:10
Beitrag #6

rolfk Offline
LVF-Guru
*****


Beiträge: 2.306
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
RE: DLL: C++ Addresseninhalt an Labview schicken
(22.08.2011 13:10 )Castorp schrieb:  Danke, Jens! Das hat mich schonmal weitergebracht. Es funktioniert mit dem Rückgabewert void*.

Allerdings gebe ich jetzt die Adresse einer lokalen Variable zurück, d.h. der Inhalt wird in Labview möglicherweise überschrieben oder geht verloren, habe ich das richtig verstanden?
Ist es möglich den Inhalt zu sichern, ohne den gesamten Inhalt als Variable ausgeben zu müssen?

Also Du musst Dir einfach auch bewusst werden über die Lebenszeit von Variablen und Objekten. Das ist nicht dasselbe.

class {

} MyObject;


MyObject * function(x, y, z) {
MyObject *o = new MyObject;

........

return o;
}

o ist zwar eine lokale Variable und wird ungültig nach der Rückkehr der Funktion. Das heisst aber nicht dass das Objekt auf das o zeigt auch ungültig wird. C++ kennt schliesslich keine automatische Garbage Collection die sowas tun könnte. Ein Objekt wird nur ungültig wenn man es mit delete auch wieder aus dem Speicher entfernt und das sollte man auch tunlichst tun, ansonsten bekommst Du echte Speicherleaks.

Das ist auch der Grund warum ich persönlich obige Implemtation nicht so empfehle. Es geht zwar und auch gut, wenn der LabVIEW Programmierer weiss was er tut und die entsprechenden Paradigmen kennt, aber die meisten LabVIEW Programmierer sind gewöhnt dass man zum debuggen ein VI abbrechen kann und dann wieder neu starten. Wenn man das in einem VI oder Applikation tut in der solche C++ Objekte angelegt werden, und zwar irgendwo zwischen dem Anlegen und wieder Freigeben der Objekte, erzeugt man Memoryleaks die in manchen Fällen durchaus ein Problem werden können. Und wenn der weniger bedarfte LabVIEW Programmierer gar vergisst die Freigabefunktion aufzurufen läuft die Applikation nicht mal in non-debug sehr lange.

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
Anzeige
25.08.2011, 14:19
Beitrag #7

Castorp Offline
LVF-Neueinsteiger


Beiträge: 6
Registriert seit: Aug 2011

2010
2010
DE



RE: DLL: C++ Addresseninhalt an Labview schicken
Danke für die ausführliche Erklärung!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
01.09.2011, 13:46 (Dieser Beitrag wurde zuletzt bearbeitet: 01.09.2011 13:52 von Castorp.)
Beitrag #8

Castorp Offline
LVF-Neueinsteiger


Beiträge: 6
Registriert seit: Aug 2011

2010
2010
DE



RE: DLL: C++ Addresseninhalt an Labview schicken
Wenn ich die Adresse von &m1 und &m2 in Labview entgegen nehme, kann ich sie in Labview als Integer anzeigen lassen, z.b "1240624".
Die zweite DLL soll diese Adresse nun entgegennehmen und die Distanzeberechnung ausführen. Ich habe dazu jeweils die Adresse auf einen Pointer des Objekttypen (Model) gecastet. Die Adresse des Pointers sollte dann der Addresse des Objekts entsprechen.


OURDLL_API double* distance(double *x, double *y, double *z, int m1address, int m2address)
{

Model *m1 = reinterpret_cast<Model*>(m1address);
Model *m2 = reinterpret_cast<Model*>(m2address);

Distance(&dres,m1,m2);

return dres.distance;
}



Es gibt zwar beim kompilieren keine Fehlermeldung. Die Berechnung ist aber falsch.

Muss ich evtl. die Adresse von integer in eine hexadezimal Zahl überführen, um sie zu casten (z.b. "1240624" ->"12EE30")?
Ist mein Ansatz logisch korrekt, oder gibt es eine andere Möglichkeit?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
07.09.2011, 19:44
Beitrag #9

rolfk Offline
LVF-Guru
*****


Beiträge: 2.306
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
RE: DLL: C++ Addresseninhalt an Labview schicken
Das geht viel einfacher:

Code:
OURDLL_API double* distance(double *x, double *y, double *z, Model* m1address, Model* m2address)

Und in LabVIEW machst Du davon einfach ein Pointer sized integer für die Model Parameter. Das solte für neuere LabVIEW Versionen sogar als Funktionsreturnwert möglich sein.

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
12.09.2011, 10:07
Beitrag #10

Castorp Offline
LVF-Neueinsteiger


Beiträge: 6
Registriert seit: Aug 2011

2010
2010
DE



RE: DLL: C++ Addresseninhalt an Labview schicken
So habe ich das auch schon probiert, allerdings gibt es dann beim Kompilieren einen Fehler:

Code:
error C2061: Syntaxfehler: Bezeichner 'Model'

Heißt das ich kann nur innerhalb der Funktion Zeiger der Klasse "Model" erstellen?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Antwort schreiben 


Gehe zu: