' schrieb: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!
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
Habs mal mit der NumericArrayResize() Funktion versucht. Den typeCode f64 kennt die Funktion schonmal nicht. Habs dann so versucht:
if(err = NumericArrayResize(uB, 2, (UHandle*) &Array, PixelX * PixelY))
goto release
Das hat er dann auch geschluckt. Mein Skript sieht nun also folgendermaßen aus:
#include ”extcode.h“
#include <mil.h>
#include <windows.h>
UseDefaultCINInit
UseDefaultCINDispose
UseDefaultCINAbort
UseDefaultCINLoad
UseDefaultCINUnload
UseDefaultCINSave
/* Typedefs */
typedef struct {
int32 dimSizes[2];
float64 Numerisch[1];
} TD1
typedef TD1 **TD1Hdl;
typedef char * STRING;
#define PixelX 320
#define PixelY 256
extern "C" MgErr CINRun(TD1Hdl Array, LVBoolean *Done);
MgErr CINRun(TD1Hdl Array, LVBoolean *Done)
{
MIL_ID
MilApplication = M_NULL,
MilSystem = M_NULL,
MilDigitizer = M_NULL,
MilGrabBuffer = M_NULL;
int ImageBuffer[PixelX][PixelY];
int col, row;
float64 *ptrResultArrayElement;
MgErr err=noErr;
STRING DCF_FILE_PATH = “D:\Programme\Matrox...\Solios_DCF\Cedip ...”
if(err = NumericArrayResize(uB, 2L, (UHandle*)&Array, PixelX * PixelY))
goto release;
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;
}
ptrResultArrayElement = (*Array)->Numerisch;
for (col = 0; col < PixelY; col++)
{
for(row = 0; row < PixelX; row++)
{
*ptrElementOfResultArray = ImageBuffer[col][row];
ptrElementOfResultArray++;
if (MappGetError(MGLOBAL, M_NULL))
{
goto release;
}
}
}
release:
MbufFree(MilGrabBuffer);
MdigFree(MilDigitizer);
MsysFree(MilSystem);
MappFree(MilApplication);
*Done = LVTRUE;
return err;
}
Hab noch eine LED in mein Frontpanel eingebaut, das mir anzeigen soll, wenn das CIN sauber zurückgekehrt ist. Die LED wird auch gesetzt. LabVIEW stürtzt nicht ab, aber Daten hab ich immer noch keine. Wo bleiben die denn auf der Strecke? Ach ja, was mir noch aufgefallen ist. Wenn ich die erste for Schleife PixelY mal durchlaufen lasse, stürtzt LabVIEW immernoch ab. Hab dann mal nur 5 Schleifendurchläufe gemacht und dann wird das Skript sauber durchlaufen.