LabVIEWForum.de
Übergabe von Datenzeiger - 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 von Datenzeiger (/Thread-Uebergabe-von-Datenzeiger)



Übergabe von Datenzeiger - Cubaner - 16.01.2008 10:30

Hallo liebe LabVIEW Gemeinde,

ich habe ein Problem mit der Übergabe von Datenzeigern in LabVIEW.
Kurz zur Problembeschreibung. Ich will mit hilfe einer dll, und einer Funktion aus dieser dll, eine Datei in einen Umrichter schreiben. Leider gelingt es mir noch nicht ganz dies zu realisieren. Zur besseren Darstellung hier mal die Funktion, die Probleme bereitet.

int CALLBACK _export AllVarDataDownload (unsigned char com, unsigned char addr, char *filename, void(*fktptr)()=NULL, void(*errptr)(int errcode)=NULL)

Zur Erklärung der Funktion: com = COM-Port (macht kein Problem),
addr = Adresse des Umrichters (macht kein Problem),
*filename = ist der Dateipfad (LabVIEW übergebe ich hier einen C-Pointer mit der Größe des Strings in meinem Beispiel 42Byte)
Jetzt die Große Herausforderung für mich: void(*fktptr)()=NULL und void(*errptr)(int errcode)=NULL sind ja Datenzeiger die auf nichts zeigen. Oder verstehe ich das ganz falsch?

Im Anhang ist ein Bild von meinem bisherigen Entwurf. In diesem Beispiel habe ich einfach diese Datenzeiger nicht berücksichtigt, da sie eh NULL sind.

Zu meinem Erstaunen geht bei der Ausführung des VI´s der Umrichter in einen Fehler. d.h. ja schon mal das etwas passiert.

Jetzt meine Fragen:

1. Weiß jemand wie ich diese Datenzeiger korrekt übergeben kann?

2. könnte es eventuell doch an der Übergabe des C-Pointers (Dateipfad) liegen?



Ich danke schon mal all denjenigen die sich dieser Herausforderung widmen.

Viele Grüße,

Nico


Übergabe von Datenzeiger - IchSelbst - 16.01.2008 10:41

' schrieb:*filename = ist der Dateipfad (LabVIEW übergebe ich hier einen C-Pointer mit der Größe des Strings in meinem Beispiel 42Byte)
Ich würde hier "Zeiger auf Daten" empfehlen.

Zitat:Jetzt die Große Herausforderung für mich: void(*fktptr)()=NULL
Hier KANN eine Funktion übergeben werden. Diese würde wohl als Callback aufgerufen werden. Wird in C++-Programmierung hier kein Wert angegeben, so macht der C++-Kompiler automatisch NULL. In LV geht das so aber nicht. Erstens kann man in LV keine Callbacks in dieser Art hier machen. Zweitens MUSST du hier einen Parameter angeben. Also musst du deinen DLL-Knoten erweitern um diesen Parameter, dem du den Wert 0 (U32) übergibst.

Zitat:void(*errptr)(int errcode)=NULL
Gleiches gilt für diesen Parameter, der auch eine Funktion darstellt.

Dein DLL-Knoten muss genau so viele Anschlüsse haben, wie im Prototyp der aufzurufenden Funktion definiert sind.


Übergabe von Datenzeiger - Cubaner - 16.01.2008 11:37

Hey IchSelbst,

vielen vielen Dank für die sehr guten Tipps!!!
Es funktioniert!!
Du bist spitze! Guru1

' schrieb:Ich würde hier "Zeiger auf Daten" empfehlen.
nur hier ist ein C-Pointer der richtige Weg.

Bei den anderen Tipps lagst du vollkommen richtig.

Nochmals vielen Dank!!!

Gruß

Nico


Übergabe von Datenzeiger - rolfk - 22.01.2008 13:18

' schrieb:Hey IchSelbst,

vielen vielen Dank für die sehr guten Tipps!!!
Es funktioniert!!
Du bist spitze! Guru1
nur hier ist ein C-Pointer der richtige Weg.

Nun wahrscheinlich machst Du es gut, aber drückst Du dich nicht ganz korrekt aus. Am Einfachsten sollte das gehen indem man den Parameter als String und dann als C String Pointer konfiguriert. Kann man dan, direkt einen LabVIEW String damit verbinden. Ein C pointer könnte auch ein Array Pointer sein.

Rolf Kalbermatter