06-02-2011 02:55 AM
Hi,
I've seen in a post that is possible to create an union in LabVIEW[and without using a dll]
but I don't understand the method, is there someone who can help me and explain how to
handle this trick in the following example :
typedef struct _ssscmddata_haltest
{
u8 test_flags; // Reserved, must be zero
u8 test_start; // SSSVAL_HAL_TSTART_xxxx
u16 target_output; // Target output in volts or milli-amps
u16 time_ramp_tgt; // Time in tenths of a second to ramp to target voltage
u16 time_hold; // Time in tenths of a second to hold target voltage
u16 time_ramp_zero; // Time in tenths of a second to ramp to zero volts
union {
float r; // Generic access
float milli_amps; // HIPOT. Used only at end of test for pass/fail determination.
float mega_ohms; // DCIR. Used only at end of test for pass/fail determination.
float milli_ohms; // EBOND. Used only at end of test for pass/fail determination.
}lo_limit;
union {
float r; // Generic access
float milli_amps; // HIPOT. Test fails immediately if this limit exceeded.
float mega_ohms; // DCIR. Used only at end of test for pass/fail determination.
float milli_ohms; // EBOND. Used only at end of test for pass/fail determination.
}hi_limit;
u8 arc_detect; // 0 thru 9, 0=off, 1=most sensitive, ..., 9=least sensitive
u8 channel; // HAL: 0, HALSCAN: 0 thru 4, G2 0=front, 1=rear
} ssscmddata_haltest;
Thanks in advance :-]
Solved! Go to Solution.
06-02-2011 06:37 AM
I may be a bit thick here, but what is the purpose of the union in your example? I recall from my line code days that a union was designed to handle multiple data types in ONE block of memory. Since your unions are all floats, you could simple use float lo_limit/hi_limit and be done without the need to use a union.
without having searched the forum for unions, the closest direct structure I can think of to do this would be an array of U8s, initialized to the specific number of bytes of your largest union 'variable'. Then implement a LV2 style global to keep from allocating new memory. What I am not sure of is the efficiency of the conversions into and out of said array. I also do not know if you save a String with a specific number of characters if Labview will not reallocate memory anyway.
-p
06-02-2011 07:41 AM
The datatype in LabVIEW that most closely resembles a union would be variant. You would need to do the required conversion to your specific data type but a variant will allow you to assign it different data types. The other method would be to use flatten to string. When unflattened you get your data back.
06-03-2011 09:42 AM
@Mark Yedinak wrote:
The datatype in LabVIEW that most closely resembles a union would be variant. You would need to do the required conversion to your specific data type but a variant will allow you to assign it different data types. The other method would be to use flatten to string. When unflattened you get your data back.
Mark, the only thing with those two solutions is that they do not allocate a specific block of memory of fixed size and hold onto it. The whole purpose of the union is to allow different datatypes to store data in a finite block of memory allocated by the largest type size. The only way I know to come close to that is a fixed array and then convert data in and out of that, but then again, I am not sure that the memory allocation to do the conversions wouldn't be more costly.
06-03-2011 10:03 AM
@PJS wrote:
@Mark Yedinak wrote:
The datatype in LabVIEW that most closely resembles a union would be variant. You would need to do the required conversion to your specific data type but a variant will allow you to assign it different data types. The other method would be to use flatten to string. When unflattened you get your data back.
Mark, the only thing with those two solutions is that they do not allocate a specific block of memory of fixed size and hold onto it. The whole purpose of the union is to allow different datatypes to store data in a finite block of memory allocated by the largest type size. The only way I know to come close to that is a fixed array and then convert data in and out of that, but then again, I am not sure that the memory allocation to do the conversions wouldn't be more costly.
While I agree with what you are saying the issue of memory management is somewhat mute. LabVIEW, unlike many other languages handles the memory management for you. In most cases there is no need to worry about it. As LabVIEW moves more towards embedded solutions more control over memory management may be necessary. However, if a new person to LabVIEW is simply looking to do things in the same way then they may not realize it isn't necessary to worry about it.
06-06-2011 07:02 AM
Yup you're right, I'm just thinking about the main purpose of a union: it's for one variable having the choice among several types.
I'm gonna try your method 😄
06-16-2011 05:31 AM
It works
Thank you so much