LabVIEWForum.de
Datenübergabe an DLL Pointer to Pointer - 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: Datenübergabe an DLL Pointer to Pointer (/Thread-Datenuebergabe-an-DLL-Pointer-to-Pointer)



Datenübergabe an DLL Pointer to Pointer - Reiling - 19.01.2018 15:38

Hallo liebe Labview-Gemeinde,

ich habe schwierigkeiten bei der Datenübergabe an eine DLL Funktion. Der Datentyp in C lautet "double** parameter" (siehe Beschreibung der Funktionen im Anhang)

Das Beispielprogramm der Call Libary Funktion bringt mich leider auch nicht weiter. Darum habe ich mich dazu entschlossen hier mein Beispiel VI zum Aufruf der veschiedenen Funktionen der ebenfalls beigefügten dis_fat.dll hier einzustellen, in der Hoffnung, dass ich villeicht doch einen Eintrag dazu im Forum nicht gefunden habe und mir weitergeholfen wird.

Die Besipielfunktionen besitzen unterschiedliche Datenübergabeformate, multiplizieren die übergebenen doubles mit 2 und geben das Ergebnis zurück. Funktionen 14 und 15 laufen einwandfrei, Funktion 16 ist die zu knackende Nuss.

Folgenden Eintrag habe ich nicht angewendet bekommen. Special Case: 2D Arrays klang ganz gut.
https://www.labviewforum.de/Thread-Dereferenzieren-von-Pointern

Ich freue mich auf konstruktive Anregungen


RE: Datenübergabe an DLL Pointer to Pointer - rolfk - 31.01.2018 22:04

(19.01.2018 15:38 )Reiling schrieb:  Die Besipielfunktionen besitzen unterschiedliche Datenübergabeformate, multiplizieren die übergebenen doubles mit 2 und geben das Ergebnis zurück. Funktionen 14 und 15 laufen einwandfrei, Funktion 16 ist die zu knackende Nuss.

Die Anregung ist um solche Parameter NICHT in einer DLL zu verwenden! Was Du da im Prinzip konstruiert hast ist ein Array von Pointern die jeweils ein Array von doubles beinhalten. Das ist in LabVIEW direkt nur mit sehr viel Voddoo zu realisiseren und das macht wenig Sinn. Zudem ist es inherent unsicher da Du in der Funktion von einer Anzahl Reihen und Kolonnen ausgehst aber niemand garantiert dass der Aufrufer dieses Array so angelegt hat.

Wenn Du das wirklich so machen willst müsstest Du ein Array von Pointer sized Integern anlegen das 3 Elemente besitzt und jedem dieser Element ein Memorypointer zuweisen der 4 * 8 bytes (sizeof(double)) besitzt. Es gibt sinnvollere Übungen dann in LabVIEW C Compiler spielen zu wollen. Besser wäre ein LabVIEW 2D Array mit Adapt to Type, Pass Handles, direkt an die DLL zu übergeben. Das sähe dann etwa so aus:

Code:
typedef struct
{
    int32_t dim1;
    int32_t dim2;
    double elm[1];
} Arr2DDoubleRec, *Arr2DDoublePtr, **Arr2DDoubleHdl;

int32_t function(Arr2DDoubleHdl arr)
{
    int32_t i, j;
    for (i = 0; i < (*arr)->dim1; i++)
    {
        for (j = 0; j < (*arr)->dim2; i++)
        {
             (*arr)->elm[i * (*arr)->dim2 + j] *= 2;
        }
    }
    return i * j;
}



RE: Datenübergabe an DLL Pointer to Pointer - Reiling - 02.02.2018 10:59

Vielen Dank für die Rückmeldung mit Lösungsvorschlag zu meinem Thema.

Wir werden auf Grund von Aufwand,sowie Performance und stabilität der Anwendung die Schnittstelle zur DLL ändern. Damit die Schnittstelle für möglichst viele Programme einfach zu händeln ist werden wir mehrdimensionale Arrays eindimensional mit Dimensionen übergeben.

Mit frendlichen Grüßen Steffen Reiling