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 

LabVIEW: Absturz nach externem Code-Aufruf



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!

07.09.2007, 09:45 (Dieser Beitrag wurde zuletzt bearbeitet: 07.09.2007 09:47 von rolfk.)
Beitrag #5

rolfk Offline
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
LabVIEW: Absturz nach externem Code-Aufruf
' schrieb:Hier mal noch der Quellcode um den es sich handelt:
/* CIN source file */
#include ”extcode.h“
#include <mil.h>
#include <windows.h>

#define PixelX 320
#define PixelY 256

UseDefaultCINInit
UseDefaultCINDispose
UseDefaultCINAbort
UseDefaultCINLoad
UseDefaultCINUnload
UseDefaultCINSave

/* Typedefs */

typedef struct {
int32 dimSizes[2];
float64 Numerisch[1];
} TD1
typedef TD1 **TD1Hdl;

extern “C” MgErr CINRun(TD1Hdl Array);

MgErr CINRun(TD1Hdl Array)
{

MIL_ID
MilApplication = M_NULL,
MilSystem = M_NULL,
MilDigitizer = M_NULL,
MilGrabBuffer = M_NULL;

unsigned char ImageBuffer[PixelY][PixelX];
float64 *ptrElementOfResultArray;
char *DCF_FILE_PATH;
int row, col;

(*Array)->dimSizes[0] = PixelY;
(*Array)->dimSizes[1] = PixelX;

ptrElementOfResultArray = (*Array)->Numerisch;
*ptrElementOfResultArray = 0;

DCF_FILE_PATH = “D:\Programme\Matrox...\Solios_DCF\Cedip ...”

MilApplication = MappAlloc(M_DEFAULT, M_NULL);
MilSystem = MsysAlloc(M_SYSTEM_SOLIOS, M_DEV0, M_COMPLETE, M_NULL);
MilDigitizer = MdigAlloc(MilSystem, M_DEV0, DCF_FILE_PATH, M_DEFAULT, M_NULL);
MilGrabBuffer = MbufAlloc2d(MilSystem, PixelX, PixelY, M_UNSIGNED+8, M_IMAGE+MGRAB, M_NULL);
if (MappGetError(MGLOBAL, M_NULL))
{
goto release;
}

MdigGrab(MilDigitizer, MilGrabBuffer);
if (MappGetError(MGLOBAL, M_NULL))
{
goto release;
}

MbufGet2d(MilGrabBuffer, 0, 0, PixelX, PixelY, ImageBuffer);
if (MappGetError(MGLOBAL, M_NULL))
{
goto release;
}

for (col = 0; col < PixelX; col++)
{
for(row = 0; row < PixelY; row++)
{
*ptrElementOfResultArray = ImageBuffer[col][row];
ptrElementOfResultArray++;
if (MappGetError(MGLOBAL, M_NULL))
{
goto release;
}
}
}

release:
MbufFree(MilGrabBuffer);
MdigFree(MilDigitizer);
MsysFree(MilSystem);
MappFree(MilApplication);

Return noErr;
}

Und stellst Du dann sicher, dass Du da im LabVIEW Diagramm ein PixelX * PixelY grosses Array allozierst und das an die CIN gibst? Wohl kaum!Tongue

Ansonsten bekommst Du eben nur ein Handle ins CIN das 0 * 0 pixel gross ist, also nur Speicher alloziert hat für die zwei Dimensionsgrössen die dann eben 0 sind. Ein bischen Memorymanagement musst Du halt schon tun wenn Du in C arbeitest. Da ist nicht LabVIEW da, das Dir schön immer das Händchen haltend alles dahingehend für Dich erledigt.

Alternativ kannst Du auch bevor Du die Werte ins Array einfügst eine LabVIEW Memorymanager Funktion aufrufen um das Array korrekt zu resizen. Das ist sowieso vorzuziehen, da ansonsten Dein CIN nur korrekt aufrufbar ist wenn Du vor dem Aufruf das Array richtig anlegst mit Informationen die eigentlich im CIN stehen.

In Deinem Fall sollte ein Aufruf wie etwa folgender genügen:

err = NumericArrayResize(f64, 2, &Array, PixelX * PixelY):
if (err)
// clean up everything and return with error to LabVIEW

Bitte die entsprechenden Dimensionen nach dem Resize einfügen. Ist zwar eher kosmetisch aber normalerweise die korrekte Weise da NumericArrayResize im Falle eines Fehlers nichts mit dem Arrayhandle tut und LabVIEW dann eventuel über die inkorrekten Dimensionslängen stolpern könnte bei der Zurückkehr.

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
Antwort schreiben 


Nachrichten in diesem Thema
LabVIEW: Absturz nach externem Code-Aufruf - rolfk - 07.09.2007 09:45

Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  Absturz durch unzulässige Pointer VS_03 3 10.306 28.10.2016 18:32
Letzter Beitrag: VS_03
  Labview blockiert serielle Schnittstelle nach Aufruf der DLL Berdschi 5 8.215 24.04.2014 08:38
Letzter Beitrag: Berdschi
  Fehler beim Schließen des VIs nach Delphi-DLL-Aufruf Bärbel 10 14.246 11.11.2013 11:44
Letzter Beitrag: andreaskoller
  Labview-Code in Visual Studio GladiatoreSardo 1 5.660 12.11.2012 10:41
Letzter Beitrag: GerdW
  Absturz von Labview nach schliessen eines VIs sima 4 7.886 23.01.2012 17:07
Letzter Beitrag: sima
  Absturz und fehler bei aufrufen einer externen dll Georg26 3 6.500 18.07.2011 09:45
Letzter Beitrag: Georg26

Gehe zu: