Einbinden externen Code mit unbekannter Parameterstruktur
Ich denke dass der Programmierer voll recht hat. Wo's happert sind Deine C Kenntnisse und speziell was Pointer sind. Die Funktion Int SR_API_SetupCam() schreibt zwar Informationen in die Speicherbuffer den Du als cd1 und pars1 übergibt, legt aber diese Bereiche nicht selber an. Dass muss der Aufrufer. Da Du sagst dass da Pointer drin sind ist das schon mal nichts was Du mit LabVIEW selber machen kannst.
Deine Optionen sind folgende:
1) Berechnen der Bytegrösse dieser Strukturen. Dabei auch auf Alignment achten. Alignment besagt das ein Struktureelement immer auf einem Vielfachen der kleineren der beiden Werte Elementgrösse und Alignmentsetting ist. Bei Visual C DLLs ist das Aligment default auf 8 Byte eingestellt, kann aber in den Projecteinstellungen oder mittels pragmas vor den entsprechenden Deklarationen jederzeit verändert werden. Wenn Du diese Grösse hast ein entsprechendes Array mit sovielen Elementen met Intilialize Array anlegen und diesen Funktionen übergeben. Dabei macht es nichts aus dass die Funktion eine Struktur erwartet und Du ihr ein Array übergibst. Solange nur der Speicherbereich den das Array belegt gross genug ist um die ganze Struktur abzudecken. Dass Du die Information innerhalb des Arrays nicht einfach interpretieren kannst da es nicht mit dem Strukturlayout übereinstimmt ist ja nach Deiner eigenen Aussage kein Problem. Bei allen Funktionen wo dieser Buffer übergeben werden muss, wird der entsprechende Parameter dann als Array konfiguriert und als C Array Pointer.
2) Du baust Dir einen entsprechenden Cluster in LabVIEW der genau mit der Struktur in C übereinstimmt. Auch hier musst Du auf das Alignment der Library achten. LabVIEW macht nie Alignment, also packt die Daten immer so kompakt als möglich. Das kann bedeuten dass man in den Cluster sogenannte Fillerbytes einfügen muss um die Elementgrenzen auf die selben Offsets zu kriegen wie in der C Struktur. Pointer kannst Du auf diese Weise nicht wirklich anlegen aber Du kannst sie als 32Bit Integer in 32 Bit LabVIEW oder 64Bit Integer in 64 Bit LabVIEW in den Cluster legen und auch hier natürlich auf das Alignment achten. Du siehst dann im Cluster den Wert des Pointers in der Integerzahl aber natürlich nicht den Inhalt und solange das nicht absolut mit aller Macht nötig ist lassen wir das bitteschön so, da ich vermute dass Du wahrscheinlich jetzt schon nicht mehr durchblickst. Diesen Cluster kannst Du dann an die Funktion übergeben indem Du den Parameter als Adapt to Source einstellst wonach LabVIEW einen Pointer auf diesen Cluster an die Funktion übergibt.
Dies ist so ein bischen die ausführlichste Erklärung die ich geben kann ohne die ganze Arbeit ganz für Dich zu machen (was ohne die Headerdateien sowieso nicht möglich ist). Bei Variante 1 kannst Du eventuel wegkommen mit einer groben Schätzung der Bufferlänge für die Struktur und dann noch eine Sicherheitsmarge hinzufügen um für extra Alignment Bytes Rechnung zu tragen. So oder so wirst Du dich ein wenig mit C Syntax und Datentypen, und deren Speichergrösse abgeben müssen.
|