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 

Problem Aufruf einer C-DLL mit Array Pointer



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!

28.04.2009, 18:08
Beitrag #1

hcl86 Offline
LVF-Neueinsteiger


Beiträge: 3
Registriert seit: Apr 2009

8.2
2008
de

8000
Schweiz
Problem Aufruf einer C-DLL mit Array Pointer
Hallo Zusammen

Seit ca. 7 Wochen arbeite ich mit LabVIEW 8.2 und erstelle damit eine Applikation für meine Bachelorarbeit.

Ich habe ziemlich viel hier im Forum nachgelesen, doch leider keine Antwort auf mein Problem gefunden. Die Funktion ist für ein erfolgreiches gelingen meiner Arbeit
sehr wichtig, weshalb ich auch schon bald am verzweifeln bin.

Lage Rede kurzer Sinn... ich bitte euch um eure Hilfe.

Im Anhang habe ich ein VI, welches das ganze vereinfacht darstellt, was ich genau versuche.

Ich fülle in einem Array of Cluster jeweils 3 Array Elemente ab (als Standard-Einstellung für euch gespeichert) das PhysParamArray stellt die Eingabe dar und hat auf dem Frontpanel keine weitere Verwednung. Beim Start wird eine Datei geladen, es handelt sich dabei um Rohdaten welche durch eine Fit-Funktion angepasst werden sollen (Datei ebenfalls im Anhang). Wenn das VI so wie ich es
hochgeladen habe startet, wird der Fit nicht ausgeführt und in der Signal-Anzeige erscheint ein Plot, der auch korrekt ist. Die While-Schleife habe ich "deaktiviert" und dazu einen kleinen Kommentar
verfasst. Wird nun im Array of Cluster im Index 1 bei der Dicke die Checkbox "anfitten?" ausgewählt, lauft das ganze normal durch und es gibt auch keine Probleme. Im Array "lvResultLayer" erscheint
unter dem Index (1/0/0) der gefittete Wert (Er ist nicht korrekt, dies liegt daran, dass ich euch leider ein Datenfile nicht zurverfügung stellen kann). Soweit so gut, ändert man nun die Abbruch bedingung
der While-Schleife auf "Stopp wenn TRUE", schiesst sich LabVIEW komplett ab. Ich habe das VI zweimal ohne änderung jeglicher Werte ausgeführt. Beim zweiten Aufruf erhalte ich den Fehler 1097, der C-
Code manipuliere den Speicher.

Die DLL habe ich euch natürlich auch angehängt, gemäss meinem Teampartner, der die C-DLL erstellte, sind die Einstellungen der Schnittstelle korrekt. Dass die C-DLL funktioniert haben wir an einer kleinen Beispiel Applikation welche er in C geschrieben hat, gesehen.

In meiner Original Applikation wird die DLL zweimal eingebunden, das einemal für einen Fit und das andere Mal für eine Simulation (einfach Plotten der Werte). Wie gesagt, der Fit funktioniert (unter C, wie auch bei einmaliger Ausführung unter LabVIEW). Woran kann es liegen, dass sich das VI bei mehrfachen ausführen des Fit's verabschiedet?

Ich danke euch für eure baldige Hilfe!

Gruss Oliver

PS: In der C-DLL wird mit numerical recipies gearbeitet, da mein Teamkamerad nicht verfügbar ist, kann ich zurzeit keinen C-Code liefern. Wäre der allenfalls notwendig? Dann sagt mir bitte, was genau ihr benötigt.


Angehängte Datei(en)
Sonstige .vi  DLL_aufruf.vi (Größe: 72,46 KB / Downloads: 278)

Sonstige .dll  libreffit_kernel_2.dll (Größe: 209,66 KB / Downloads: 239)

Sonstige .txt  Lade_Daten.txt (Größe: 4,51 KB / Downloads: 304)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
28.04.2009, 19:23 (Dieser Beitrag wurde zuletzt bearbeitet: 28.04.2009 19:25 von rolfk.)
Beitrag #2

rolfk Offline
LVF-Guru
*****


Beiträge: 2.306
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
Problem Aufruf einer C-DLL mit Array Pointer
' schrieb:Ich fülle in einem Array of Cluster jeweils 3 Array Elemente ab (als Standard-Einstellung für euch gespeichert) das PhysParamArray stellt die Eingabe dar und hat auf dem Frontpanel keine weitere Verwednung. Beim Start wird eine Datei geladen, es handelt sich dabei um Rohdaten welche durch eine Fit-Funktion angepasst werden sollen (Datei ebenfalls im Anhang). Wenn das VI so wie ich es
hochgeladen habe startet, wird der Fit nicht ausgeführt und in der Signal-Anzeige erscheint ein Plot, der auch korrekt ist. Die While-Schleife habe ich "deaktiviert" und dazu einen kleinen Kommentar
verfasst. Wird nun im Array of Cluster im Index 1 bei der Dicke die Checkbox "anfitten?" ausgewählt, lauft das ganze normal durch und es gibt auch keine Probleme. Im Array "lvResultLayer" erscheint
unter dem Index (1/0/0) der gefittete Wert (Er ist nicht korrekt, dies liegt daran, dass ich euch leider ein Datenfile nicht zurverfügung stellen kann). Soweit so gut, ändert man nun die Abbruch bedingung
der While-Schleife auf "Stopp wenn TRUE", schiesst sich LabVIEW komplett ab. Ich habe das VI zweimal ohne änderung jeglicher Werte ausgeführt. Beim zweiten Aufruf erhalte ich den Fehler 1097, der C-
Code manipuliere den Speicher.

Die DLL habe ich euch natürlich auch angehängt, gemäss meinem Teampartner, der die C-DLL erstellte, sind die Einstellungen der Schnittstelle korrekt. Dass die C-DLL funktioniert haben wir an einer kleinen Beispiel Applikation welche er in C geschrieben hat, gesehen.

Tja, da hat er wohl irgendwie nicht ganz recht. Irgendwas stimmt da eindeutig nicht. Was lässt sich aber so nicht sagen. Minimal das Header File der DLL sollte schon auch noch anwesend sein.

Zitat:PS: In der C-DLL wird mit numerical recipies gearbeitet, da mein Teamkamerad nicht verfügbar ist, kann ich zurzeit keinen C-Code liefern. Wäre der allenfalls notwendig? Dann sagt mir bitte, was genau ihr benötigt.

Also wie gesagt ohne Header File der DLL (die alle Datentypen genau deklariert) und wenn möglich einem möglichst einfachen C file dass den Aufruf der DLL Funktion dokumentiert ist da gar nichts zu machen.

Ich vermute mal dass ihr entweder Ausgangsarrays nicht gross genug alloziert oder dass ihr einen Überlegungsfehler mit den mehrdimensionalen Arrays macht.

Rolf Kalbermatter

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
29.04.2009, 08:57
Beitrag #3

hcl86 Offline
LVF-Neueinsteiger


Beiträge: 3
Registriert seit: Apr 2009

8.2
2008
de

8000
Schweiz
Problem Aufruf einer C-DLL mit Array Pointer
Vielen Dank für die schnelle Antwort, durch regen Vorlesungsbetrieb komme ich leider erst jetzt dazu dir zu antworten.

Ich werde mich bemühen dir die gewünschten Informationen heute im Verlauf vom Nachmittag posten zu können. Den Durchblick im C-Souce habe ich leider nicht ganz und mein Teamkollege sitzt in
einer Vorlesung fest.
Was ich jedoch mal posten kann ist der Funktionskopf, welcher vom Node aufgerufen wird:

[code]/* Dll Schnittstellen Funktion */
__declspec(dllexport) int Read_LVData(double *lvX,
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
29.04.2009, 09:21
Beitrag #4

rolfk Offline
LVF-Guru
*****


Beiträge: 2.306
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
Problem Aufruf einer C-DLL mit Array Pointer
' schrieb:Eine ähnliche Funktion haben wir erstellt um eine Simulation unserer Messung durchführen zu können. Dabei haben wir keine Probleme gehabt (zumindest den in-Parameter Arrays), weshalb wir bisher davon ausgingen dass dies keine Probleme bereitet. Die grösse der Arrays werden übrigens der Schnittstelle übergeben( lvLayerCount, lvAttributeCount, lvParameterCount, sind die Grössen des 3D-Arrays). Ebenfalls haben wir ja keine Probleme wenn die Checkbox für den Fit nicht ausgwählt wird und beim erstmaligen Ausführen des Fits.

Diese Dinge sagen im Zusammenhang mit dem Aufruf einer C Funktion sehr wenig oder gar nichts. Wenn zum Beispiel ein zu kleines Ausgangsarray and eine C Funktion übergeben wird kann das:

1) sofort crashen
2) irgendwann mal später crashen
3) Erst crashen wenn man LabVIEW (oder das VI) abschliesst und LabVIEW beim aufräumen über zerschossenen Pointer stolpert.
4) Andere Daten in Deinem Programm zerstören

Alles hängt davon ab wie in em Moment die verschiedenen Arrays, die LabVIEW Verwaltungsstrukturen selber und so weiter im Speicher angeordnet sind.

Ein Crash beim zweiten Durchlauf könnte zum Beispiel daher rühren dass ihr irgend eine Speicheraddresse überschreibt. Beim zweiten Durchlauf versucht LabVIEW diese neu zu allozieren und will die alte deallozieren aber leider ist da jetzt etwas Falsches so dass der entsprechende free() Aufruf voll in die hosen geht.

Ich habe sehr viel Erfahrung mit Aufrufen von DLLs und grundsäzlich ist dazu zu sagen, wenn es crasht und funkt dann ist beinahe nie LabVIEW der Schuldige sondern der Programmierer. Ob das von einer verkehrten Konfiguration der Call Library Node kommt, von einer zu kleinen Allokation von Buffern oder ganz einfach einem Programmierfehler in der DLL ist dabei völlig egal.

Das zu finden ist nicht immer einfach und grundsätzlich erachte ich Source Code Debugging der DLL bei Aufruf davon aus LabVIEW als die einzige wirklich funktionierende Lösung.

Rolf Kalbermatter

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
01.05.2009, 10:18
Beitrag #5

hcl86 Offline
LVF-Neueinsteiger


Beiträge: 3
Registriert seit: Apr 2009

8.2
2008
de

8000
Schweiz
Problem Aufruf einer C-DLL mit Array Pointer
' schrieb:Ich habe sehr viel Erfahrung mit Aufrufen von DLLs und grundsäzlich ist dazu zu sagen, wenn es crasht und funkt dann ist beinahe nie LabVIEW der Schuldige sondern der Programmierer. Ob das von einer verkehrten Konfiguration der Call Library Node kommt, von einer zu kleinen Allokation von Buffern oder ganz einfach einem Programmierfehler in der DLL ist dabei völlig egal.


Vielen Dank für deine Schnellen Antworten, wir haben nun in den letzten Tagen unsere C-DLL nocheinmal genau kontrolliert und konnten den Feheler in C reproduzieren. Unteranderem hat es daran gelegen, dass wir (und auch NR) Variabeln deklariert und gleich instanziert haben. Bei einem erneuten aufruf der DLL wurde die Variable dann nicht neu instanziert und somit waren unsere Array-Indizes schlicht nicht in dem Bereich in dem sie sein sollten.
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
  Problem bei Aufruf einer dll swoc 5 3.366 08.09.2022 17:01
Letzter Beitrag: Martin.Henz
  Datenübergabe an DLL Pointer to Pointer Reiling 2 9.644 02.02.2018 10:59
Letzter Beitrag: Reiling
  Absturz durch unzulässige Pointer VS_03 3 10.369 28.10.2016 18:32
Letzter Beitrag: VS_03
  dll mit Pointer auf komplexe Struktur einbinden Wedgewood 11 17.081 27.04.2014 23:44
Letzter Beitrag: Wedgewood
  Pointer auf Array mit Labview übertragen und darstellen lupus022 35 32.776 19.07.2013 10:53
Letzter Beitrag: lupus022
  Pointer und MoveBlock OXO 4 8.277 03.06.2013 16:31
Letzter Beitrag: OXO

Gehe zu: