LabVIEW & Dll ->Absturz?!? - Druckversion +- LabVIEWForum.de (https://www.labviewforum.de) +-- Forum: LabVIEW (/Forum-LabVIEW) +--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein) +---- Forum: Application Builder (/Forum-Application-Builder) +---- Thema: LabVIEW & Dll ->Absturz?!? (/Thread-LabVIEW-Dll-Absturz) |
LabVIEW & Dll ->Absturz?!? - moojoo - 29.08.2006 14:17 Hallo! Ich "nerve" dieses Forum mal wieder mit einem Post zu einem Dll Problem. Meine selbstgeschriebene Dll-Funktion(Code siehe unten) wird in LabVIEW aufgerufen. Die Funktion soll einfach nur die Daten des Array-Handles in ein anderes, neu dimensioniertes Handle überschreiben, und dann in ein x-y-diagramm ausgeben. Nun stürzt LabVIEW immer dann ab, wenn ich etwas mit der Größe des Ausgangsarray herumspiele. sprich, erst läuft alles super, wenn ich ein Array mit 4 Elementen benutze, aber dann kackt das Prog ab, wenn ich im laufenden Betrieb den Array in der Oberfläche um beispielsweise eins erhöhe (also sprich, in ein "inaktives" eingabefeld des Array einen neuen Wert reinschreib, und damit dem Array ein neues element hinzufüg.) Das komische ist, dass der Fehler willkürlich zu sein scheint, also ich kann nicht sagen, bei welcher Konstellation von Werten und Größen LabVIEW abstürzt (das Abstürzen ist dann das üblicherweise von Windows kommende "diese Anwendung wird geschlossen" blabla). Nun weiss ich nicht, woran diese Instabilität liegt - an meinem Code(obwohl der ja sehr einfach gehalten ist)? Ich hänge zum Code auch noch die VI-Datei mit der erstellten dll an, damit man mein beschriebenes Umfeld hat (wahrscheinlich müsst ihr dann nach dem laden noch den dll-verweis aktualisieren) Wäre toll, wenn ihr mir helfen könntet, und schon mal danke im Vorraus Gruß Johannes PS: Ich benutze noch ein schon etwas angegrautes LabVIEW 5.1, hoffe doch ma, dass die Abstürze nich daran liegen... Code: [code]#include "stdafx.h" #include "dlltest.h" #include "maxdiff.h" #include "extcode.h" #include "diffcollection.h" #pragma comment (lib, "LabVIEW.lib") //#include <iostream> using namespace std; typedef struct { LabVIEW & Dll ->Absturz?!? - eg - 29.08.2006 14:36 Bei Speicherzugriffproblemen in LV bei Benutzung von DLLs immer Initialize Array benutzen und auf keinen Fall Array Konstanten. Bei Init Array kannst du die grösse vorgeben, die muss aber mit der Grösse des Datenarray übereinstimmen. Gruss LabVIEW & Dll ->Absturz?!? - moojoo - 29.08.2006 16:35 ' schrieb:Bei Speicherzugriffproblemen in LV bei Benutzung von DLLs immer Initialize Array benutzen und auf keinen Fall Array Konstanten. Erstmal danke für die schnelle Antwort Meinst du, ich soll das LabVIEW-Element Initialize Array benutzen (also bei der graphischen Programmierung) oder im Sourcecode einen anderen Befehl als das Resize verwenden? Ich hab mal ersteres versucht (Aufbau, siehe Bild), da stürzt das Prog jetzt JEDESMAL ab, glaub, ich hab da was falsch gemacht... Was meinst du genau mit "Größe des Datenarray"? Meinst du die Anzahl der Elemente (die ich im übringen nicht weiss), oder meinst du die Größe in Bits eines einzelnen Elementes des Arrays? Gruß LabVIEW & Dll ->Absturz?!? - eg - 29.08.2006 17:09 Ersetze deinen Array-Control mit Init-Array(genauso, wie die unteren zwei). Ersetze die Zahl 10 durch eine 3. Wenn du dann irgendwelche Werte an DLL übergeben willst, benutze "Replace Array Subset dazu". Melde dich, wenn du es ausprobiert hast. Gruss LabVIEW & Dll ->Absturz?!? - moojoo - 29.08.2006 18:19 ' schrieb:Ersetze deinen Array-Control mit Init-Array(genauso, wie die unteren zwei). Ersetze die Zahl 10 durch eine 3. Hab versucht deine Tipps zu realisieren. Hoffe, ich habs so gemacht, wie du meintest (siehe Bild). Warum sollte ich auf drei umstellen(naja im Endeffekt ist es ja auch egal, da das Handle ja eh von der Größe her angepasst wird)? Dank deiner Hinweise scheint es jetzt zumindest bei einzelausführung stabil zu laufen. Nur wenn ich auf Wiederholtes Ausführen klicke und dann sowohl Werte als auch die Größe verändere, stürzt er ab (siehe zweites Bild). Jetz frag ich mich, ob das an der wiederholten Ausfühung liegt, oder woran sonst? Ich mein, der geschriebene Code scheint ja richtig zu sein!?! Im Endeffekt wollte ich eigenlich nur mal testen, wie die Prozedur dann im wirklichen "Leben" so klarkommt, wenn sie oft hintereinander aufgerufen wird. Hm, das muss scheinbar dann die Praxis zeigen. LabVIEW & Dll ->Absturz?!? - eg - 29.08.2006 18:52 Dein "data" ist vom Typ "TD1Hdl" und dieser Typ besteht aus einer Int-Zahl und einem Array aus 2 Int-Zahlen, also 3 Integers. Die Zeile typedef TD1 **TD1Hdl; verstehe ich nicht so ganz, ist aber egal. Wenn du aber an DLL ein Array aus vier Ints übergibst, weiss die DLL nicht wohin mit der vierten Zahl und gibt eine Fehlermeldung aus. Oder ich verstehe dein Prog ganz falsch. Die Grösse (in Bits) jedes einzelnen Argumentes in der Eintrittsfunktion soll mit den an die DLL zu übergebenden Werten exakt übereinstimmen. Und schaue mal in den Einstellungen ob die DLL reentrant aufgerufen wird. Die Doku "Using external Code in LV" hast du bestimmt schon gelesen, nehme ich mal an. Gruss, Eugen LabVIEW & Dll ->Absturz?!? - moojoo - 29.08.2006 19:05 ' schrieb:Dein "data" ist vom Typ "TD1Hdl" und dieser Typ besteht aus einer Int-Zahl und einem Array aus 2 Int-Zahlen, also 3 Integers.hm eigentlich besteht es aus mehr, da Numeric ja ein Array von vorher unbekannter Größe ist. D.h. ich weiss zwar das er eindimensional ist, aber wie viele Elemente diese eine dimension hat, sagt das ja noch nicht, is aber egal Zitat:Die ZeileDas wurde mir von LV so generiert, mittels eines CINs, wo ich mal meine Ein - und Ausgänge drangepappt hab. Das ist die einzige Möglichkeit, um ein Arrayhandle zu übergeben und den Array dann dynamisch zur Laufzeit mit hilfe einer LV-Funktion zu resizen. Zitat:Wenn du aber an DLL ein Array aus vier Ints übergibst, weiss die DLL nicht wohin mit der vierten Zahl und gibt eine Fehlermeldung aus.Also die Stuktur dient der Datenübergabe. In dim steht die Anzahl der Elemente von Numeric. Und darin stehen dann die eigentlichen Daten. Und dieses Beispielprog kopiert praktisch aus den gegebenen Data nur rüber in den y-Array Zitat:Und schaue mal in den Einstellungen ob die DLL reentrant aufgerufen wird.Hatte ich eingestellt, aber damit is er mir immer abgeschmiert mit ner Fehlermeldung in irgendeinenr Thread.h, also hab ichs wieder auf das andere UIThread bla eingestellt Zitat:Die Doku "Using external Code in LV" hast du bestimmt schon gelesen, nehme ich mal an.Hab ich. Hab so ziemlich alles gelesen:)aber irgendwie nur wenig passendes gefunden (nochdazu kein BeispiVI für LV5.1, sind alle für höhere Versionen, mist LabVIEW & Dll ->Absturz?!? - jg - 30.08.2006 08:10 <div align="left">Hallo, wenn ich richtig verstehe, hast du deine externe DLL selbst geschrieben. Ändere doch den Funktionsaufruf nach Möglichkeit so ab, dass du nicht die "structure" als Parameter aus LabVIEW heraus übergeben musst. Das ist prinzipiell (auch in LV8) kompliziert und gefährlich. Mit der Übergabe von (nur) Arrays und Integer-Variablen müsste es etwas einfacher werden. MfG, Jens</div> LabVIEW & Dll ->Absturz?!? - moojoo - 30.08.2006 12:57 ' schrieb:<div align="left">Hallo, Die Übergabe der Struktur hat den Vorteil, dass man die eigentlichen Daten gebündelt hat mit der Größe des Datenarrays, und, da man ein Handle übergibt (also ein Pointer auf Pointer) kann man die Daten gleich verändern, und das Handle in der Größe anpassen. Wenn man nur einen Array übergibt, so wird nur der Pointer auf das erste Element übergeben, man erhält also keine Aussage über die Anzahl der Elemente des Arrays. Zweiter Nachteil ist, dass man den Array nicht von der Größe anpassen kann. Man müsste die Größe schon vorher in LabVIEW einstellen, das geht für mich aber nicht. Gut, in diesem einfachen Beispiel, das ich hier gepostet hab, mag das gehen, aber eigentlich brauche ich die Möglichkeit, die Größe des Arrays zur Laufzeit festzulegen. LabVIEW & Dll ->Absturz?!? - eg - 30.08.2006 13:37 ' schrieb:aber eigentlich brauche ich die Möglichkeit, die Größe des Arrays zur Laufzeit festzulegen. 1) Genau das sollte man vermeiden, weil LabVIEW diesbezüglich so sensibel ist. 2) LV hat einen Vorteil aber auch Nachteil, dass man sich beim Programmieren nicht um den Speicher kümmern muss, man kann aber auch keine Speicheroperationen durchführen. Gruss |