LabVIEWForum.de
Unhandled exception bei Übergabe eines CArrays - 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: Unhandled exception bei Übergabe eines CArrays (/Thread-Unhandled-exception-bei-Uebergabe-eines-CArrays)



Unhandled exception bei Übergabe eines CArrays - abrissbirne - 22.04.2008 12:48

Hallo Community,
ich bin dabei einen funktionierenden C-Code für CIN in eine DLL umzustricken. Soweit funktioniert das auch recht schön. Allerdings gibt es bei dem wichtigsten Teil des Skriptes ein Problem. Ich kann die gewonnenen Kameradaten nicht an LabVIEW übergeben. Ich verwende für die Datenaufnahme die Matrox Imaging Library. Dazu dürftet ihr in diesem Forum schon den ein oder anderen Eintrag von mir findenWink2
Ich grabbe also Bilder von einer Kamera und speichere diese in einen MIL-Puffer. Nun bietet mir MIL die Möglichkeit die Daten des MIL Arrays in ein eigens angelegtes Array zu kopieren. Die Funktion sieht also folgendermaßen aus:
<div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'>MbufGet2d(MilImageBuffer, 0, 0, SizeX, SizeY, &((**Array).Numeric[0])) </div>
0 steht hier für Offset (in X- und Y-Richtung)
SizeX, SizeY = Auflösung
Zum Schluß wird ein Pointer auf das Zielarray erwartet. Diese Zeile funktioniert innerhalb der CIN, aber in der DLL erzeugt sie folgende Fehlermeldung:
<div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'>Unhandled exception at 0x01225BAE in LabVIEW.exe: 0xC0000005:
Access violation reading location 0x1xxxxxxx</div>

Meine Vermutung ist das ich die Array-Initialisierung nicht korrekt durchführe. Innerhalb der CIN habe ich dafür NumericArrayResize genutzt. Innerhalb der DLL mache ich es so:
<div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'>(*Array)->dimSizes[0] = SizeY; //Rows
(*Array)->dimSizes[1] = SizelX; //Cols</div>

Wenn ich diese Codezeilen ausführe wird meine Arraygröße auf SizeY und SizeX innerhalb von LabVIEW erweitert. Ich glaube trotzdem das hier mein Problem liegt. Für Hilfestellung bin ich sehr Dankbar.


Unhandled exception bei Übergabe eines CArrays - rolfk - 22.04.2008 20:36

' schrieb:Hallo Community,
ich bin dabei einen funktionierenden C-Code für CIN in eine DLL umzustricken. Soweit funktioniert das auch recht schön. Allerdings gibt es bei dem wichtigsten Teil des Skriptes ein Problem. Ich kann die gewonnenen Kameradaten nicht an LabVIEW übergeben. Ich verwende für die Datenaufnahme die Matrox Imaging Library. Dazu dürftet ihr in diesem Forum schon den ein oder anderen Eintrag von mir findenWink2
Ich grabbe also Bilder von einer Kamera und speichere diese in einen MIL-Puffer. Nun bietet mir MIL die Möglichkeit die Daten des MIL Arrays in ein eigens angelegtes Array zu kopieren. Die Funktion sieht also folgendermaßen aus:
<div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'>MbufGet2d(MilImageBuffer, 0, 0, SizeX, SizeY, &((**Array).Numeric[0])) </div>
0 steht hier für Offset (in X- und Y-Richtung)
SizeX, SizeY = Auflösung
Zum Schluß wird ein Pointer auf das Zielarray erwartet. Diese Zeile funktioniert innerhalb der CIN, aber in der DLL erzeugt sie folgende Fehlermeldung:
<div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'>Unhandled exception at 0x01225BAE in LabVIEW.exe: 0xC0000005:
Access violation reading location 0x1xxxxxxx</div>

Meine Vermutung ist das ich die Array-Initialisierung nicht korrekt durchführe. Innerhalb der CIN habe ich dafür NumericArrayResize genutzt. Innerhalb der DLL mache ich es so:
<div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'>(*Array)->dimSizes[0] = SizeY; //Rows
(*Array)->dimSizes[1] = SizelX; //Cols</div>

Wenn ich diese Codezeilen ausführe wird meine Arraygröße auf SizeY und SizeX innerhalb von LabVIEW erweitert. Ich glaube trotzdem das hier mein Problem liegt. Für Hilfestellung bin ich sehr Dankbar.

Dann zeige doch mal denn Code. Wie ist das Array deklariert? Wie rufst Du NumericArrayResize auf? Warum hast Du beim Aufruf der MIL Funktion SizeX und SizeY aber bei der Initialisierung SizelX und SizeY? Bist Du sicher dass die MIL Funktion kein Padding von Rows durchführt und damit das Array effektiv zu klein ist? Was für ein Bilddatentyp ist es (Integer, Float, Greyscale, RGB)?

Rolf Kalbermatter


Unhandled exception bei Übergabe eines CArrays - abrissbirne - 23.04.2008 08:13

' schrieb:Dann zeige doch mal denn Code. Wie ist das Array deklariert?

<div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'>
#include "extcode.h"
#include <stdio.h>
#include <windows.h>
#include <mil.h>

#define DLL_EXPORT __declspec (dllexport)

typedef struct {
int32 dimSizes[2];
uInt16 Numeric[1];
} TD1;
typedef TD1 **TD1Hdl;

.
.
.

DLL_EXPORT void Fetch(TD1Hdl Array, uInt16 *FrameNumber);

void Fetch(TD1Hdl Array, uInt16 *FrameNumber)
{
if(MilGrabImageBuffer[NumberOfGrabBuffers])
{
(*Array)->dimSizes[0] = PixelY; // rows
(*Array)->dimSizes[1] = PixelX; // cols

// Check user given value.
if((*FrameNumber > NumberOfGrabBuffers) || (*FrameNumber <= 0))
MessageBox(NULL, "Your chosen Frame number is out of range.nChose a smaller value.", "Mil Hub Error", MB_ICONSTOP | MB_OK | MB_SYSTEMMODAL);
else
{
// Copy 2d buffer into an user allocated array (*Array).
MbufGet2d(MilGrabImageBuffer[*FrameNumber], 0, 0, PixelX, PixelY, &((**Array).Numeric[0])); // Pointer to first array element
if(MappGetError(M_GLOBAL, M_NULL))
MessageBox(NULL, "Error occured by getting image buffer.", "Mil Hub Error", MB_ICONSTOP | MB_OK | MB_SYSTEMMODAL);
}
}
}
</div>

' schrieb:Wie rufst Du NumericArrayResize auf?
<div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'>NumericArrayResize(uW, 2L, (UHandle *) (*Array)->Numeric, SizeX*SizeY);</div>
uW = Data is an array of unsigned 16-bit integers.
2L = 2 Dimensions
UHandle = A pointer to the handle that you want to resize.
SizeX*SizeY = The new number of elements to which the handle should refer.

' schrieb:Warum hast Du beim Aufruf der MIL Funktion SizeX und SizeY aber bei der Initialisierung SizelX und SizeY?
Falls du SizelX meinst, dass war ein Tippfehler. Im code ist es richtig.

' schrieb:Bist Du sicher dass die MIL Funktion kein Padding von Rows durchführt und damit das Array effektiv zu klein ist?
Nein bin ich mir nicht. Allerdings hatte ich nie Probleme innerhalb der CIN. Da klappte das Kopieren des Puffers ohne Probleme.

' schrieb:Was für ein Bilddatentyp ist es (Integer, Float, Greyscale, RGB)?

Rolf Kalbermatter
uInt16

Danke für deine schnelle Antwort. Meine Angaben waren wohl etwas unvollständig.


Unhandled exception bei Übergabe eines CArrays - abrissbirne - 23.04.2008 10:06

Konnte meinen oberen Post leider nicht berabeiten. Hab mich aber wieder vertippt. NumericArrayResize sieht so aus:
<div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'>NumericArrayResize(uW, 2L, (UHandle *) &Array->Numeric, SizeX*SizeY);</div>
uW = Data is an array of unsigned 16-bit integers.
2L = 2 Dimensions
UHandle = A pointer to the handle that you want to resize.
SizeX*SizeY = The new number of elements to which the handle should refer.


Unhandled exception bei Übergabe eines CArrays - rolfk - 23.04.2008 17:07

' schrieb:Konnte meinen oberen Post leider nicht berabeiten. Hab mich aber wieder vertippt. NumericArrayResize sieht so aus:
<div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'>NumericArrayResize(uW, 2L, (UHandle *) &Array->Numeric, SizeX*SizeY);</div>
uW = Data is an array of unsigned 16-bit integers.
2L = 2 Dimensions
UHandle = A pointer to the handle that you want to resize.
SizeX*SizeY = The new number of elements to which the handle should refer.

Mach daraus doch bitte mal

<div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'>NumericArrayResize(uW, 2L, (UHandle *) &Array, SizeX*SizeY);</div>

Array->Numeric is der Datenpointer innerhalb des Handles, nicht das Handle selber.

Rolf Kalbermatter


Unhandled exception bei Übergabe eines CArrays - abrissbirne - 24.04.2008 08:15

' schrieb:Mach daraus doch bitte mal

<div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'>NumericArrayResize(uW, 2L, (UHandle *) &Array, SizeX*SizeY);</div>

Array->Numeric is der Datenpointer innerhalb des Handles, nicht das Handle selber.

Rolf Kalbermatter
Hab nochmal in meinen Quellcode geschaut. Hatte es bereits so wie du hier sagst. Ich habe das Array einfach mal auf die doppelte Größe wie benötigt initialisiert und schon bekomme ich Daten. Sehr seltsam, vor allem das ich nun ein doppeltes Livebild bekomme. Ich hab mal ein Screenshot davon gemacht. Wenn ich das Array also auf 320*256 Elemente initialisiere bekomme ich besagte Fehlermeldung. Wenn ich das Ganze nochmal mit 2 multipliziere bekomme ich ein doppeltes Bild (siehe Bild). Ehrlich gesagt kann ich mir momentan keinen Reim darauf machen. Der Code ist zudem auch schonmal so gelaufen. Der einzige unterschied es war halt eine lsb Datei (CIN).


Unhandled exception bei Übergabe eines CArrays - rolfk - 24.04.2008 19:21

' schrieb:Hab nochmal in meinen Quellcode geschaut. Hatte es bereits so wie du hier sagst. Ich habe das Array einfach mal auf die doppelte Größe wie benötigt initialisiert und schon bekomme ich Daten. Sehr seltsam, vor allem das ich nun ein doppeltes Livebild bekomme. Ich hab mal ein Screenshot davon gemacht. Wenn ich das Array also auf 320*256 Elemente initialisiere bekomme ich besagte Fehlermeldung. Wenn ich das Ganze nochmal mit 2 multipliziere bekomme ich ein doppeltes Bild (siehe Bild). Ehrlich gesagt kann ich mir momentan keinen Reim darauf machen. Der Code ist zudem auch schonmal so gelaufen. Der einzige unterschied es war halt eine lsb Datei (CIN).

Also irgendwas stimmt da nicht. Du sagst zwar das es ein uInt16 Bild ist und hast das auch so im C code aber im Frontpanel sehe ich Zahlen von rund 600'000'000. Das kann nie und nimmer ein uInt16 sein, diese Werte gingen nur bis maximal 65'535.

Rolf Kalbermatter


Unhandled exception bei Übergabe eines CArrays - abrissbirne - 25.04.2008 08:56

' schrieb:Also irgendwas stimmt da nicht. Du sagst zwar das es ein uInt16 Bild ist und hast das auch so im C code aber im Frontpanel sehe ich Zahlen von rund 600'000'000. Das kann nie und nimmer ein uInt16 sein, diese Werte gingen nur bis maximal 65'535.

Rolf Kalbermatter
Das ist mir noch gar nicht aufgefallen. Da muss ich die Kameraspezifikationen nochmal durchgehen.


Unhandled exception bei Übergabe eines CArrays - abrissbirne - 25.04.2008 23:31

' schrieb:Also irgendwas stimmt da nicht. Du sagst zwar das es ein uInt16 Bild ist und hast das auch so im C code aber im Frontpanel sehe ich Zahlen von rund 600'000'000. Das kann nie und nimmer ein uInt16 sein, diese Werte gingen nur bis maximal 65'535.

Rolf Kalbermatter
Also es hat daran gelegen. Danke das du mich darauf aufmerksam gemacht hast. Ich hatte in den Settings des DLL Knotens den Datentyp uInt32 festgelegt. Hab es dann auf uInt16 geändert und nu funktionierts.