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 

Dieses Thema hat akzeptierte Lösungen:

Fehler 1097 beim Übergeben von Arrays



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!

12.09.2017, 17:56
Beitrag #1

Flemmy Offline
LVF-Neueinsteiger


Beiträge: 8
Registriert seit: Oct 2013

2013
2013
DE

28359
Deutschland
Fehler 1097 beim Übergeben von Arrays
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


Angehängte Datei(en)
0.0 .dll  example_dll.dll (Größe: 12,02 KB / Downloads: 11)

13.0 .vi  dllTest.vi (Größe: 7,56 KB / Downloads: 11)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
13.09.2017, 10:03 (Dieser Beitrag wurde zuletzt bearbeitet: 13.09.2017 10:05 von jg.)
Beitrag #2

jg Offline
CLD & CLED
LVF-Team

Beiträge: 14.975
Registriert seit: Jun 2005

20xx / 8.x
1999
EN

Franken...
Deutschland
RE: Fehler 1097 beim Übergeben von Arrays

Akzeptierte Lösung

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:

   

zu keinem Absturz mehr.

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
13.09.2017, 16:00
Beitrag #3

Flemmy Offline
LVF-Neueinsteiger


Beiträge: 8
Registriert seit: Oct 2013

2013
2013
DE

28359
Deutschland
RE: Fehler 1097 beim Übergeben von Arrays
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!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
13.09.2017, 16:33
Beitrag #4

jg Offline
CLD & CLED
LVF-Team

Beiträge: 14.975
Registriert seit: Jun 2005

20xx / 8.x
1999
EN

Franken...
Deutschland
RE: Fehler 1097 beim Übergeben von Arrays
(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

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.10.2017, 21:07 (Dieser Beitrag wurde zuletzt bearbeitet: 22.10.2017 21:08 von rolfk.)
Beitrag #5

rolfk Offline
LVF-Guru
*****


Beiträge: 2.272
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
RE: Fehler 1097 beim Übergeben von Arrays
(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.

Rolf Kalbermatter
Test & Measurements Solutions
http://www.tm-solutions.eu
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  Aufruf externe DLL Fehler 1097 Lars_Tragl 1 1.342 11.08.2016 16:13
Letzter Beitrag: Freddy
  Error 1097 katanad 2 1.830 15.06.2016 11:31
Letzter Beitrag: katanad
Exclamation Backgroundworker aus VB.NET DLL - Fehler beim Beenden Max92 0 1.995 03.11.2015 14:17
Letzter Beitrag: Max92
  DLL Fehler 1097 M.VI 1 3.114 02.12.2014 08:38
Letzter Beitrag: GerdW
  Fehler 1097 bei Knoten zum Aufruf externer Bibliotheken in CLF-Knoten.vi KingLui 2 3.510 16.09.2014 13:47
Letzter Beitrag: KingLui
  Fehler 1097 bei Aufruf C++ DLL F-Trooper 9 11.133 24.02.2014 12:38
Letzter Beitrag: Kiesch

Gehe zu: