Hoi,
ik heb een tijdje geleden al eerder iets gepost over IDL en C. (deze IDL).
Ik probeer een camera aan te sturen via IDL. Ik ben nu zover dat ik alles in C in orde heb. Ik krijg alleen het array niet goed terug gestuurd naar IDL.
Als ik in C een toepassing maak, en die de output van de camera in een textbestand laat zetten, en vervolgens het textbestand in IDL inlees en plot, dan gaat alles goed, en krijg ik het plaatje goed in beeld.
Maar, als ik in IDL een array aanmaak, die doorgeef naar C en in C het plaatje naar het array wegschrijf, dan krijg ik een vervormd plaatje terug. (dimensies kloppen, maar plaatje is langerekt, en het lijkt alsof C niet precies op de goede pointeradressen wegschrijft)
Dit is de code die ik gebruik om de camera aan te roepen in IDL:
[code=IDL]
image=lonarr(param.width,param.height)
returnvalue = CALL_EXTERNAL(lib, 'take_image', param, image, /CDECL, /AUTO_GLUE)
[/code=IDL]
param is een structure met instellingen voor de camera.
Vervolgens in de C code:
[code=C]
int take_image(param* settings, IDL_LONG* p_idl_image) {
short x,y,err;
unsigned short* row;
blablabla bereid camera voor e.d.
row = (unsigned short*) malloc(settings->width*sizeof(unsigned short));
if (row == NULL) return 101;
for(y=0; y<settings->height; y++){
err = SBIGUnivDrvCommand(CC_READOUT_LINE, &rlp, row);
if(err != CE_NO_ERROR) return err;
for (x=0; x<settings->width; x++) {
p_idl_image[x+y*settings->width] = (IDL_LONG) *(row+x);
}
}
free( row );
[/code=C]
err = SBIGUnivDrvCommand(CC_READOUT_LINE, &rlp, row); leest een rij pixels uit de camera uit, en zet die weg op het adres van row.
En vervolgens schrijf ik de rij weg op de het adres van de het IDL array.
Als ik direct de waarden van "*(row+x)" wegschrijf, en weer inlees in IDL dan gaat het prima.
Als ik de waarden van "p_idl_image[x+y*settings->width]" wegschrijf, en terug inlees in IDL, gaat het ook goed.
Maar als ik direct na call_external image probeer te plotten krijg ik dus een vervormd plaatje.
Ik ben hier nu al 2 dagen mee bezig
ik heb een tijdje geleden al eerder iets gepost over IDL en C. (deze IDL).
Ik probeer een camera aan te sturen via IDL. Ik ben nu zover dat ik alles in C in orde heb. Ik krijg alleen het array niet goed terug gestuurd naar IDL.
Als ik in C een toepassing maak, en die de output van de camera in een textbestand laat zetten, en vervolgens het textbestand in IDL inlees en plot, dan gaat alles goed, en krijg ik het plaatje goed in beeld.
Maar, als ik in IDL een array aanmaak, die doorgeef naar C en in C het plaatje naar het array wegschrijf, dan krijg ik een vervormd plaatje terug. (dimensies kloppen, maar plaatje is langerekt, en het lijkt alsof C niet precies op de goede pointeradressen wegschrijft)
Dit is de code die ik gebruik om de camera aan te roepen in IDL:
[code=IDL]
image=lonarr(param.width,param.height)
returnvalue = CALL_EXTERNAL(lib, 'take_image', param, image, /CDECL, /AUTO_GLUE)
[/code=IDL]
param is een structure met instellingen voor de camera.
Vervolgens in de C code:
[code=C]
int take_image(param* settings, IDL_LONG* p_idl_image) {
short x,y,err;
unsigned short* row;
blablabla bereid camera voor e.d.
row = (unsigned short*) malloc(settings->width*sizeof(unsigned short));
if (row == NULL) return 101;
for(y=0; y<settings->height; y++){
err = SBIGUnivDrvCommand(CC_READOUT_LINE, &rlp, row);
if(err != CE_NO_ERROR) return err;
for (x=0; x<settings->width; x++) {
p_idl_image[x+y*settings->width] = (IDL_LONG) *(row+x);
}
}
free( row );
[/code=C]
err = SBIGUnivDrvCommand(CC_READOUT_LINE, &rlp, row); leest een rij pixels uit de camera uit, en zet die weg op het adres van row.
En vervolgens schrijf ik de rij weg op de het adres van de het IDL array.
Als ik direct de waarden van "*(row+x)" wegschrijf, en weer inlees in IDL dan gaat het prima.
Als ik de waarden van "p_idl_image[x+y*settings->width]" wegschrijf, en terug inlees in IDL, gaat het ook goed.
Maar als ik direct na call_external image probeer te plotten krijg ik dus een vervormd plaatje.
Ik ben hier nu al 2 dagen mee bezig
