LabVIEWForum.de
pointer auf struct mit unterschiedlichen datentypen - 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: pointer auf struct mit unterschiedlichen datentypen (/Thread-pointer-auf-struct-mit-unterschiedlichen-datentypen)



pointer auf struct mit unterschiedlichen datentypen - neven - 23.11.2007 17:01

hallo da draußen,

im folgenden screenshot könnt ihr eine funktionsdeklaration sehen, die einen pointer auf ein struct mit verschiedenen datentypen enthält. durch brachiales ausprobieren ist es mir gelungen, den ersten wert (TimeIntegration) ausgelesen zu bekommen. beim rest ist sense. habe mir schon das ganze forum rauf und runter angeschaut und das tutorial zu den dlls durchgelesen, finde aber nix, dass genau auf dieses problem passen würde (auf den quellcode der dll habe ich keinen zugriff, und von moveblock habe ich keine ahnung).


[attachment=9925]


danke im voraus!

neven


pointer auf struct mit unterschiedlichen datentypen - IchSelbst - 23.11.2007 18:44

Das Struct kannst du ersetzen durch ein Array of U32 der Länge 2. Das erste Array-Element (Array[0]) ist dann der Wert IntegrationTime (Ob ULONG ein U32 oder ein U64 ist, ist mir gerade entfallen. Musst du halt selbst kucken). Das zweite Array-Element (Array[1]) kannst du mit einer entsprechenden Operation (Zahl teilen), die du in der Palette Numerisch/Datenmanipulation findest, in vier Bytes (UCHAR) aufteilen. Der Pointer PUNIT_PARAMETER wird dann als Typ U32, Zeiger auf Wert, übergeben. Leg an den Eingang des DLL-Knotens ein Array[2] an und an den korrespondierenden Ausgang auch. Im Ausgang müssen dann die Daten stehen, die nur noch "manuell umgetypt" werden müssen.

Damit entspricht dieses Struct prinzipiell dem Punkt 4.5.2, also 4.4. Dass hier noch zu weiteren Tricks gegriffen werden muss, steht halt noch nirgends explizit.


pointer auf struct mit unterschiedlichen datentypen - neven - 26.11.2007 10:08

...erstmal vielen dank für den lösungsweg! bin gerade wieder eingetroffen, und werde gleich versuchen alles umzusetzen. bei erfolg gibt's die rückmeldung (bei misserfolg sowieso...)!

bis gleich

neven


pointer auf struct mit unterschiedlichen datentypen - neven - 26.11.2007 16:11

...fehlschlag.

grundsätzlich bilde ich mir ein, das problem verstanden zu haben (immerhin...). mit der lösung hapert's aber noch.

das problem: das auslesen von TimeIntegration (array[0]) klappt hervorragend. beim versuch aber, an die restlichen werte (alle in array[1]) durch "hi-lo" aufteilung heranzukommen, kommt nur null heraus. auch ein cast nach hexadezimal-werten führt zum selben ergebnis. da es sich um eine null handelt, kommt eben hexa-mäßig wieder eine null heraus. da kann ich rumcasten wie ich will. ich denke, ich habe das problem nicht ordentlich genug beschrieben. deswegen hier nochmal die GANZE funktionsdefinition. da sieht man dann auch, dass da bei array[1] hexas rauskommen müssen, und die scheinen mir beim gang durch den knoten abhanden gekommen zu sein.

[attachment=9959] [attachment=9960]

[attachment=9961] [attachment=9962]

links unten stecke ich den array als uint_32 rein, rechts nach dem knoten kommt dann oben TimeInt raus, und zwar völlig korrekt. darunter aber kommt einfach nur eine null heraus. hier sieht man noch kein casting (zahl nach hexadezimal-string). das hab ich danach eingefügt, ohne erfolg.

meine überlegung ist jetzt, von anfang an nur strings "as is" aus dem gerät auszulesen, und die dann anschließend aufzutrennen, ähnlich dem vorschlag mit der byte-weisen auftrennung. aber wie?

besten dank!

neven


pointer auf struct mit unterschiedlichen datentypen - IchSelbst - 26.11.2007 21:43

' schrieb:das auslesen von TimeIntegration (array[0]) klappt hervorragend.
Wenn das geht, muss der Rest automatisch auch stimmen. Hmm

Zitat:beim versuch aber, an die restlichen werte (alle in array[1]) durch "hi-lo" aufteilung heranzukommen, kommt nur null heraus.
Kann das auch richtig so sein?

Zitat:da sieht man dann auch, dass da bei array[1] hexas rauskommen müssen,
"hexas rauskommen müssen" gibt es nicht. Rauskommen tun immer Zahlen. Hex, Dezimal, Binär wie auch immer sind Darstellungsformen von Zahlen.


Folgende Sachen musst du noch machen:

1. Verifizieren
Wenn die vier Stück UChars in einem UINT32 stehen, dann ist Gain das niederwertige Byte und Reserve das Höchstwertige. Beachte die Zerteilung eines Bytes durch die Funktion "Zahl teilen". Oben kommt Hi raus, unten Low. In deinem Code ist die Reihenfolge vertauscht.

2. Rückgabewert
Was sagt denn der Rückgabewert (Returnvalue) der Funktion selbst?

3. Noch ne Möglichkeit.
Es kann auch sein, dass die vier Stück UChars jeweils als eigener UINT32 übergeben werden. Dann muss das Array 5 UINT32 lang sein. Jeder der Variablen Gain bis Reserve hat dann einen eigenen Index im Array. Probier das mal aus.


pointer auf struct mit unterschiedlichen datentypen - neven - 27.11.2007 11:35

Zitat:1. Verifizieren
Wenn die vier Stück UChars in einem UINT32 stehen, dann ist Gain das niederwertige Byte und Reserve das Höchstwertige. Beachte die Zerteilung eines Bytes durch die Funktion "Zahl teilen". Oben kommt Hi raus, unten Low. In deinem Code ist die Reihenfolge vertauscht.

...alles klar. hab die "gebrauchsanweisung" nicht ordentlich durchgelesen.

Zitat:2. Rückgabewert
Was sagt denn der Rückgabewert (Returnvalue) der Funktion selbst?

...rückgabewert: 0, was gleichbedeutend ist mit USBDEV_SUCCES, bzw. Werte erfolgreich ausgelesen. auch an anderer stelle zeigen die r-werte nur positives.

Zitat:3. Noch ne Möglichkeit.
Es kann auch sein, dass die vier Stück UChars jeweils als eigener UINT32 übergeben werden. Dann muss das Array 5 UINT32 lang sein. Jeder der Variablen Gain bis Reserve hat dann einen eigenen Index im Array. Probier das mal aus.

...gerade getestet (siehe schnappschuss), selbes ergebnis wie gestern: alles außer TimeIntegration ist 0.

[attachment=9987]

noch mal was grundsätzliches: der pointer auf den struct zeigt im obigen fall auf den ersten der 5 plätze im speicher mit der BREITE u32, das format, also ob binär hexad., etc. rührt er dabei nicht an. hab ich das richtig verstanden? beim aufruf wird der inhalt der 5 plätze übergeben, im ersten fall TimeInt., im zweiten Gain, usw. und dabei kommt bei TimeInt. halt das richtige raus, und beim rest die nullen? vorbehaltlich sonstiger fehler, liege ich da richtig?


pointer auf struct mit unterschiedlichen datentypen - Rob - 27.11.2007 13:09

' schrieb:...alles klar. hab die "gebrauchsanweisung" nicht ordentlich durchgelesen.
...rückgabewert: 0, was gleichbedeutend ist mit USBDEV_SUCCES, bzw. Werte erfolgreich ausgelesen. auch an anderer stelle zeigen die r-werte nur positives.
...gerade getestet (siehe schnappschuss), selbes ergebnis wie gestern: alles außer TimeIntegration ist 0.

[attachment=36971:knoten.png]

noch mal was grundsätzliches: der pointer auf den struct zeigt im obigen fall auf den ersten der 5 plätze im speicher mit der BREITE u32, das format, also ob binär hexad., etc. rührt er dabei nicht an. hab ich das richtig verstanden? beim aufruf wird der inhalt der 5 plätze übergeben, im ersten fall TimeInt., im zweiten Gain, usw. und dabei kommt bei TimeInt. halt das richtige raus, und beim rest die nullen? vorbehaltlich sonstiger fehler, liege ich da richtig?
Hallo,

habe leider nur 8.0, insofern stimmen evtl. ein paar Angaben nicht. Was mir aber auffällt:
- der Rückgabewert der Funktion stimmt noch nicht (sollte U16 sein)
- benutz als Array mal ein U8 Array der Größe 8, Mindestlänge auch ruhig mal in Funktionsaufruf eintragen
=> erste 4 Bytes wieder zusammenfügen (Integration time), in den letzten 4 Bytes (also Arrayindex 3...7) stehen dann deine restlichen Parameter

Viel Erfolg,

Robert


pointer auf struct mit unterschiedlichen datentypen - IchSelbst - 27.11.2007 13:22

' schrieb:der pointer auf den struct zeigt im obigen fall auf den ersten der 5 plätze im speicher mit der BREITE u32
Stimmt.

Zitat:das format, also ob binär hexad., etc. rührt er dabei nicht an.
Stimmt.

Zitat:beim aufruf wird der inhalt der 5 plätze übergeben, im ersten fall TimeInt., im zweiten Gain, usw. und dabei kommt bei TimeInt. halt das richtige raus, und beim rest die nullen?
Wahrscheinlich meinst du das richtige.
"Übergeben beim Aufruf" wird nicht der Inhalt der 5 Plätze, sondern eben der Pointer auf den ersten Platz. "Während des Aufrufes" (also in der DLL) schreibt das Programm in der DLL an die Stelle, auf die der Pointer zeigt, den Wert TimeInt. (Dann wird der Pointer um 4 erhöht, dort wird Gain hingeschrieben, wieder um vier erhöhen ...)

Zitat:liege ich da richtig?
Ja. Ich bin der Meinung, dass es genau so funktionieren muss.


Probiere noch was aus. Belegte das Array am Eingang mit "sinnvollen" Werten. z.B. Arr[0]=0x12345678; Arr[1]=0x56789012; Arr[2]=0x34567890; etc. Dann kuckst du am Ausgang, welcher Wert sich geändert hat. Schreibt die DLL nichts rein, z.B. bei Gain, dann muss die Vorbesetzung drinnen stehen. Schreibt die DLL was rein, wird die Vorbesetzung überschrieben und der Wert stammt eben aus der DLL.


pointer auf struct mit unterschiedlichen datentypen - neven - 27.11.2007 16:42

ok, jetzt bitte nicht böse sein...

das problem ist gelöst, war's eigentlich schon nach der ersten antwort von i.s.. man könnte sagen, ich habe den wald vor lauter bäumen nicht gesehen.

die letzte antwort von i.s. brachte mich darauf, doch selbst einfach mal mit SetParameter werte zu setzen, und anschließend zu sehen, wo die geblieben sind. dabei kamen sofort alle gesetzten werte heraus, alles funktionierte perfekt, und da wurde mir klar, dass es das schon die ganze zeit getan hatte.

davor habe ich, bevor ich die werte mit GetParameter auslesen wollte, mit der mitgelieferten software des geräteherstellers immer nur TimeInt. eingestellt, und die anderen werte einfach übernommen. danach habe ich geschaut, ob die beim automatischen auslesen wieder herauskamen, was sie bis auf TimeInt. nicht taten. was ich allerdings nicht wusste, war der umstand, dass alle anderen werte für die dll auf null liegen, wenn sie mit dem mitgelieferten zeug nicht angefasst werden, obwohl die software da ja was anderes anzeigt. eine "mischbedienung" zwischen software und dll-einbindung in lv ist also nicht möglich! in der doku zum gerät stand da nix von drin (kann ich eigentlich auch nicht erwarten), jetzt bin ich schlauer.

dennoch war diese aktion für mich alles andere als sinnlos. über i.s. hab ich die pointergeschichte kapiert, und robs vorschlag zur byte-weisen zerlegung in die andere richtung war für mich auch ein sehr hilfreicher beitrag.

vielen dank für die hilfe!