LabVIEWForum.de - Fehler 1097 beim Übergeben von Arrays

LabVIEWForum.de

Normale Version: Fehler 1097 beim Übergeben von Arrays
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Moin,

Ich befasse mich gerade damit eine selbstgeschriebene DLL mit LabVIEW (2013) einzubinden.
Hintergrund des Ganzen ist, dass ich mir die einfache GUI Programmierung von LabVIEW zunutzen machen möchte um einige Funktionen zu testen, die ich anschließend jedoch in C bereitstelle. C++/Qt kommen aktuell aber nicht in Frage, da müsste ich mich erste einarbeiten.

Bei einfachen Funktionen funktioniert der Aufruf aus der DLL auch einwandfrei.
Code:
uint8_t add(uint8_t a, uint8_t b);
void mult(uint8_t a, uint8_t b, uint16_t *ret);

Problematisch wird es, wenn Arrays hinzukommen.
Was mein Code macht, ist einen Array gemäß einiger Parameter zu füllen:
Code:
void composeMsgTest(uint32_t a,
                    uint32_t b,
                    uint32_t c,
                    float    d,
                    uint8_t  *retData,
                    uint16_t *retLen);
Hier ist retData das Array (oder viel mehr der Pointer auf dessen erstes Element) und retLen dessen Länge.
Sobald ich diesen Code dann in eine DLL compiliere kommt es in LabVIEW zu Problemen, genauer dem Fehler 1097. Binde ich das

Zum Testen habe ich mir dann ein kleines C Programm geschrieben. Dieses läuft einwandfrei durch und gibt mir die erwarteten Daten aus.

Nach einigem rumprobieren habe ich nun festgestellt, dass ich mich bei den Arrays in LabVIEW zu doof anstelle.
In dem Beispielen habe ich dann die "DW Test Copy.vi" gefunden. In der entsprechenden Header Datei der DLL wird der Array als
Code:
int arr[]
übergeben. Ändere ich meinen Code dahingehend tritt weiterhin der selbe Fehler auf.

Beim Aufruf der externen Bib stelle ich das entsprechende Parameter auf den Typ "Array", den Datentyp "uint8_t" und das Format auf "Array Datenzeiger". Der angezeigt Funtionsprototyp entspricht dabei dem, was in meiner Header Datei steht.

Anbei gibt es einmal die DLL und die Test Vi.

Ich wäre für Anregungen und Tipps im Umgang mit Arrays beim Aufruf von externen Bibs sehr dankbar.

Gruß
Flemmy
Der Memory-Manager von LabVIEW ist sehr eigen bei Speicher-Allozierungen, das Übernehmen von Speicherbereichen, die in irgendwelchen DLLs angelegt werden, mag er nicht sonderlich. In der Regel funktionieren solche Array-Rückgaben aber, wenn der Speicher in LabVIEW vorbelegt wird und dann an die DLL übergeben wird. Da wir nicht wissen, was du in deiner DLL machst, hab ich mal rumgespielt und zumindest kommt es so:

[attachment=58241]

zu keinem Absturz mehr.

Gruß, Jens
Ja wunderbar!

Wenn ich das so sehe, da macht das auch total Sinn. Im C Testprogramm übergebe ich auch einen initialisierten Array. Da kommt der auch nicht aus dem Nichts.

Nun gut, vielen Dank!
(13.09.2017 16:00 )Flemmy schrieb: [ -> ]Ja wunderbar!

Wenn ich das so sehe, da macht das auch total Sinn. Im C Testprogramm übergebe ich auch einen initialisierten Array. Da kommt der auch nicht aus dem Nichts.

Nun gut, vielen Dank!

Soso, du allozierst also das Array nicht einmal innerhalb deiner DLL. Kein Wunder, dass LabVIEW abstürzt... Confused

Gruß, Jens
(13.09.2017 16:33 )jg schrieb: [ -> ]
(13.09.2017 16:00 )Flemmy schrieb: [ -> ]Ja wunderbar!

Wenn ich das so sehe, da macht das auch total Sinn. Im C Testprogramm übergebe ich auch einen initialisierten Array. Da kommt der auch nicht aus dem Nichts.

Nun gut, vielen Dank!

Soso, du allozierst also das Array nicht einmal innerhalb deiner DLL. Kein Wunder, dass LabVIEW abstürzt... Confused

Gruß, Jens

Das hätte keinerlei Sinn!

Code:
void composeMsgTest(uint32_t a,
                    uint32_t b,
                    uint32_t c,
                    float    d,
                    uint8_t  *retData,
                    uint16_t *retLen);

retData ist hier nur ein Pointer der by value übergeben wird. Selbst wenn die DLL hier einen eigenen Pointer intern anlegen würde und ihn diesem Parameter zuweisen würde, käme der nie beim Anrufer an, da er auf dem Stack liegt und vom Aufrufer grundsätzlich NIE Parameter vom Stack zurückgelesen werden.
Da müsste die Funktion schon so aussehen:
Code:
void composeMsgTest(uint32_t a,
                    uint32_t b,
                    uint32_t c,
                    float    d,
                    uint8_t  **retData,
                    uint16_t *retLen);

und dann bekommst Du tatsächlich das Problem dass LabVIEW damit direkt nicht sehr viel kann. Denn LabVIEW Arrays sind nun einmal grundsätzlich "managed" aber dann auf LabVIEW Art und nicht .Net, da LabVIEW ungefähr 20 Jahre vor .Net entstand.
Referenz-URLs