02-16-2016 05:32 AM
Thanks again Rolfk for your prompt response.
I'm actually not interested in porting my code to LV64-bit later on, so no need to worry about struct sizes, etc. And also my code doesn't use any "fancy" pointers or dynamic structures that might show incompatibility between LV32 & LV64. It's pretty simple I would say. I did read about the memory alignment that LV32 uses (1 byte) vs. C which uses 8byte.
So anyway, I have added the lv_prolog.h and lv_epilog.h header files between my struct and it all seemed to work fine at first, but when I tried accessing a fixed int array inside my struct, LV crashes.
Here is my DLL code, again very simple.
#include "extcode.h" static int example; #include "lv_prolog.h" struct channel { int32 a; double x; double y; int32 c[3]; //this is the array that makes LV crash. }; #include "lv_epilog.h" _declspec(dllexport) void CLUSTERSimple(struct channel *input); _declspec(dllexport) void CLUSTERSimple2(struct channel *input); _declspec(dllexport) void CLUSTERSimple(struct channel *input) { example = input->a; input->x += 1; input->y += 1; } _declspec(dllexport) void CLUSTERSimple2(struct channel *input) { input->a = example * example; input->c[0] = 1; //I believe here is where it crashes. input->c[1] = 2; input->c[2] = 3; }
And the VI looks the exact same as the previous one, except I modified the cluster to match this new struct:
Using "Adapt to Type" and "Handles by Value". I32 -> int32, DBL -> double.
I don't know what's the error since LV closes immediately and doesn't show anything. By the way, I tried updating to LV2013 SP-1 and f2 patch or something like that but it didn't make a difference. Would you recommend to try this in LV2015 maybe? It's really not something very complicated what I'm trying to do, I just don't know what's going on.
Thanks again. Cheers!
02-16-2016 05:45 AM - edited 02-16-2016 05:48 AM
Fixed size arrays inside a structure are inlined by the C compiler. That means they are in LabVIEW equivalent to a cluster inside the cluster with as many elements as the fixed size array contains, of the type the array element is. In Addition even if there was a pointer in the struct that is NOT the same as a LabVIEW array or string. LabVIEW variable sized elements like arrays and strings are handles, that is a pointer to a pointer and only the LabVIEW manager functions can be used to create, resize and destroy them. A C function expeting there to be a char * element will go completely awry when trying to read (or even worse write) into that.
But comments like "I tried updating to LV2013 SP-1 and f2 patch or something like that but it didn't make a difference." in an attempt to fix this, really show that you are treading in way to deep water for your own good.