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.


Thema geschlossen 

pointer auf struct mit unterschiedlichen datentypen



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!

23.11.2007, 17:01
Beitrag #1

neven Offline
LVF-Grünschnabel
*


Beiträge: 24
Registriert seit: Nov 2007

7.1 & 8.5
-
kA


Deutschland
pointer auf struct mit unterschiedlichen datentypen
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).


   


danke im voraus!

neven
Alle Beiträge dieses Benutzers finden
to top
Anzeige
23.11.2007, 18:44
Beitrag #2

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.689
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
pointer auf struct mit unterschiedlichen datentypen
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.

Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Alle Beiträge dieses Benutzers finden
to top
26.11.2007, 10:08
Beitrag #3

neven Offline
LVF-Grünschnabel
*


Beiträge: 24
Registriert seit: Nov 2007

7.1 & 8.5
-
kA


Deutschland
pointer auf struct mit unterschiedlichen datentypen
...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
Alle Beiträge dieses Benutzers finden
to top
26.11.2007, 16:11
Beitrag #4

neven Offline
LVF-Grünschnabel
*


Beiträge: 24
Registriert seit: Nov 2007

7.1 & 8.5
-
kA


Deutschland
pointer auf struct mit unterschiedlichen datentypen
...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.

       

       

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
Alle Beiträge dieses Benutzers finden
to top
26.11.2007, 21:43
Beitrag #5

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.689
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
pointer auf struct mit unterschiedlichen datentypen
' 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.

Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Alle Beiträge dieses Benutzers finden
to top
27.11.2007, 11:35
Beitrag #6

neven Offline
LVF-Grünschnabel
*


Beiträge: 24
Registriert seit: Nov 2007

7.1 & 8.5
-
kA


Deutschland
pointer auf struct mit unterschiedlichen datentypen
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.

   

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?
Alle Beiträge dieses Benutzers finden
to top
Anzeige
27.11.2007, 13:09 (Dieser Beitrag wurde zuletzt bearbeitet: 27.11.2007 13:12 von Rob.)
Beitrag #7

Rob Offline
LVF-Grünschnabel
*


Beiträge: 25
Registriert seit: Apr 2007

7.1
2007
kA


Deutschland
pointer auf struct mit unterschiedlichen datentypen
' 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
Alle Beiträge dieses Benutzers finden
to top
27.11.2007, 13:22
Beitrag #8

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.689
Registriert seit: Feb 2005

11, 14, 15, 17, 18
-
DE

97437
Deutschland
pointer auf struct mit unterschiedlichen datentypen
' 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.

Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Alle Beiträge dieses Benutzers finden
to top
27.11.2007, 16:42
Beitrag #9

neven Offline
LVF-Grünschnabel
*


Beiträge: 24
Registriert seit: Nov 2007

7.1 & 8.5
-
kA


Deutschland
pointer auf struct mit unterschiedlichen datentypen
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!
Alle Beiträge dieses Benutzers finden
to top
30
Thema geschlossen 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  Datenübergabe an DLL Pointer to Pointer Reiling 2 9.565 02.02.2018 10:59
Letzter Beitrag: Reiling
  Absturz durch unzulässige Pointer VS_03 3 10.273 28.10.2016 18:32
Letzter Beitrag: VS_03
  dll mit Pointer auf komplexe Struktur einbinden Wedgewood 11 16.970 27.04.2014 23:44
Letzter Beitrag: Wedgewood
  Pointer auf Array mit Labview übertragen und darstellen lupus022 35 32.398 19.07.2013 10:53
Letzter Beitrag: lupus022
  Pointer und MoveBlock OXO 4 8.191 03.06.2013 16:31
Letzter Beitrag: OXO
  C-Funktion benötigt Struct Forest 3 6.901 04.05.2013 23:38
Letzter Beitrag: rolfk

Gehe zu: