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 

Unhandled exception bei Übergabe eines CArrays



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!

22.04.2008, 12:48
Beitrag #1

abrissbirne Offline
LVF-Stammgast
***


Beiträge: 480
Registriert seit: Aug 2007

LV2009, LV2010
2007
EN

66123
Deutschland
Unhandled exception bei Übergabe eines CArrays
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.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
22.04.2008, 20:36
Beitrag #2

rolfk Offline
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
Unhandled exception bei Übergabe eines CArrays
' 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

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
23.04.2008, 08:13
Beitrag #3

abrissbirne Offline
LVF-Stammgast
***


Beiträge: 480
Registriert seit: Aug 2007

LV2009, LV2010
2007
EN

66123
Deutschland
Unhandled exception bei Übergabe eines CArrays
' 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.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
23.04.2008, 10:06
Beitrag #4

abrissbirne Offline
LVF-Stammgast
***


Beiträge: 480
Registriert seit: Aug 2007

LV2009, LV2010
2007
EN

66123
Deutschland
Unhandled exception bei Übergabe eines CArrays
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.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
23.04.2008, 17:07 (Dieser Beitrag wurde zuletzt bearbeitet: 23.04.2008 17:08 von rolfk.)
Beitrag #5

rolfk Offline
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
Unhandled exception bei Übergabe eines CArrays
' 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

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
24.04.2008, 08:15
Beitrag #6

abrissbirne Offline
LVF-Stammgast
***


Beiträge: 480
Registriert seit: Aug 2007

LV2009, LV2010
2007
EN

66123
Deutschland
Unhandled exception bei Übergabe eines CArrays
' 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).


Angehängte Datei(en) Thumbnail(s)
   
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
24.04.2008, 19:21
Beitrag #7

rolfk Offline
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
Unhandled exception bei Übergabe eines CArrays
' 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

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
25.04.2008, 08:56
Beitrag #8

abrissbirne Offline
LVF-Stammgast
***


Beiträge: 480
Registriert seit: Aug 2007

LV2009, LV2010
2007
EN

66123
Deutschland
Unhandled exception bei Übergabe eines CArrays
' 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.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
25.04.2008, 23:31
Beitrag #9

abrissbirne Offline
LVF-Stammgast
***


Beiträge: 480
Registriert seit: Aug 2007

LV2009, LV2010
2007
EN

66123
Deutschland
Unhandled exception bei Übergabe eines CArrays
' 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.
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
  DLL mit String Nullpointer Übergabe Hubert R. 5 6.001 25.08.2023 11:43
Letzter Beitrag: rolfk
  Übergabe eines struct arrays an eine DDL und wieder Auslesen SK-AC 4 7.240 12.08.2010 17:01
Letzter Beitrag: rolfk
  Mehrere Cuda DLLs Context-Übergabe grey 2 6.132 17.06.2010 19:50
Letzter Beitrag: rolfk
  LV 7.1, VC++-DLL (VC++2008), string-Übergabe ptillmann 1 5.177 12.03.2010 20:34
Letzter Beitrag: rolfk
  Exception "Catch" DaniH 6 7.638 08.02.2010 00:55
Letzter Beitrag: rolfk
  Übergabe eines C Array abrissbirne 1 5.026 13.04.2008 22:12
Letzter Beitrag: rolfk

Gehe zu: