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:

ext. DLL - Einbindung Read Funktion



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!

31.01.2017, 00:38 (Dieser Beitrag wurde zuletzt bearbeitet: 12.02.2017 18:37 von rolfk.)
Beitrag #5

rolfk Offline
LVF-Guru
*****


Beiträge: 2.302
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
RE: ext. DLL - Einbindung Read Funktion

Akzeptierte Lösung

Ein paar Hinweise:

1) Du spezifizierst überall ein Bufferlänge von 8194 Bytes für die Stringbuffer obwohl du daneben auch noch jeweils einen Parameter übergibts wieviele Bytes der jeweilige Buffer maximal empfangen kann. Ändere diese Zahl in den Variablennamen der entsprechenden Längenvariablen. Zwar ist 8194 immer grösser dann die Zahl die Du dann effektiv als Länge angibst, also passiert so kein Crash, ABER!!!! wenn Du das immer so machst gehst Du irgendwann mal bei einer Funktion mit der Länge spielen und vergisst den Buffer auch länger zu machen und Kabumm, krachts. Zudem ist das schwerwiegende Speicherverschwendung wenn Du überall einen Buffer von 8194 Bytes übergibst aber die Funktion nur 16 davon verwenden darf!

2) Der Rückgabewert der ReadRaw Funktion liefert gemäss Dokumentation -1 zurück im Fehlerfall und 0 oder eine positivie Zahl die angibt wieviele Bytes effektiv in den Buffer geschrieben wurden.

3) Da diese Funktion Rawdaten zurückgibt kann auch ein Nullwert im Buffer vorkommen. Da Du diesen Wert als Stringtyp definiert hast, der als C Stringpointer übergeben wird, kontrolliert LabVIEW nach der Rückkehr der Funktion ob der Buffer ein Nullbyte enthält und kürzt den String bis vor dieses Nullbyte. Das ist korrekt den Du hast angegeben, dass es ein C Stringpointer ist und bei C Strings wird halt einfach der Characterwert hinter dem letzten gültigen Character auf NULL gesetzt. Um das zu verhindern machst Du daraus ein Bytearray und übergibst das als C Array Pointer an die Funktion. Da Arrays durchaus 0 als Wert enthalten dürfen macht LabVIEW hier keinen Scan nach der Zürückkehr und lässt Dir den Buffer in der Länge die Du am Eingang angegeben hast.

4) Last but not least kann der Buffer natürlich weniger Bytes enthalten dann die Büfferlänge die Du angegeben hast, Hier verwendet man dann ein Array Subset mit der Länge die die Funktion als Rückgabewert zurückgegeben hat, aber nur wenn dieser Wert grösser ist dann -1, ansonsten hat die Funktion einen Fehler gehabt und solltest Du saubere Fehlerbehandlung durchführen. Nach dem Array Subset verwendest Du noch ein Byte Array zu String wenn Du unbedingt willst und dann kannst Du Dir den RawBytebuffer doch noch als String betrachten, aber eigentlich ist das wahrscheinlich irreführend, raw Bytes sind normalerweise keine Strings.

Und nein gemäss C Syntax besteht absolut kein Unterschied zwischen einem ANSI C Stringpointer und einem Byte Arraypointer. Aber gemäss uralter C Konvention benützen halt alle Stringfunktionen dieses Nullbyte, währenddem Arrayfunktionen typischerweise immer einen expliziten Längenparameter notwendig machen.

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
Antwort schreiben 


Nachrichten in diesem Thema
RE: ext. DLL - Einbindung Read Funktion - rolfk - 31.01.2017 00:38

Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  Einbindung DLL funktioniert nicht Schrankwand 1 3.264 10.03.2023 18:50
Letzter Beitrag: GerdW
  Einbindung DLL mit geschachtelten Structures lab-falballa 2 8.071 10.05.2017 08:28
Letzter Beitrag: lab-falballa
  DLL-Einbindung schlägt fehl lupus022 7 9.072 23.05.2013 11:16
Letzter Beitrag: lupus022
  Problem bei Struct Einbindung wie in C/C++ raverel 5 7.728 24.04.2013 14:22
Letzter Beitrag: raverel
  DLL-Einbindung, Struct mit verschiedenen Datentypen als Pointer übergeben hawk72 4 10.231 11.05.2012 14:41
Letzter Beitrag: hawk72
  Einbindung der Vector XL Driver Library 5.3 in LabVIEW ... nmoerchen 15 24.577 17.10.2011 07:32
Letzter Beitrag: Mik

Gehe zu: