Email: Password: Remember Me | Create Account (Free)

Back to Subject List

Old thread has been locked -- no new posts accepted in this thread
???
03/23/10 08:19
Read: times


 
#174417 - Agreed - after bitter experience
Responding to: ???'s previous message
Per Westermark said:
I think that unions are used too often for clever attempts at "cleaning up" code.

They are originally intended for storing "either" varable A or variable B or variable C in the same memory space.

Strictly, the effect of writing a union as variable A and then reading it as variable B is undefined.

In practice, all compilers I've used will overlay the different "variants" of the union - so using it for type conversion will "work" (sic).

In this case, it would be easier to create an enumeration naming the indices of the different array entries, and instead access my_time[MINUTES].

Agreed.

A 32-bit processor may add 2 pad bytes to make the data type n*4 bytes large.

You can try to get around this by using compiler-specific extensions such as a "packed" option on the union - but you can then get into real trouble with unaligned accesses...

You generally escape all these issues on an 8-bit processor, which can lead you to become "lazy" - because it all just "works" (sic).
But, if you then try to adopt the same approach on a 32-bit processor, it is quite likely to fall apart in your hands.

Well, that's what I found, anyhow!


List of 23 messages in thread
TopicAuthorDate
Unions and position of bytes            01/01/70 00:00      
   Syntax and strategy problem.            01/01/70 00:00      
      wow that was quick and excellent thanks            01/01/70 00:00      
      Works a treat            01/01/70 00:00      
   Note that this is heavily compiler-reliant            01/01/70 00:00      
      Code for transparency            01/01/70 00:00      
         Agreed - after bitter experience            01/01/70 00:00      
            Compiler Specific            01/01/70 00:00      
               How many compler brands/versions to test for?            01/01/70 00:00      
                  Create a Compiler header            01/01/70 00:00      
                     Didn't we talk about unions - your examples doesn't...            01/01/70 00:00      
                        Someone already wrote up a good way....            01/01/70 00:00      
                           Incomplete byte order. But pad is still dangerous            01/01/70 00:00      
                              why bother?            01/01/70 00:00      
                                 how would you know?            01/01/70 00:00      
                                    Exactly my point... you don't            01/01/70 00:00      
                                       Never give up on portability - just decide the amount            01/01/70 00:00      
               Yes, but            01/01/70 00:00      
               why bother?            01/01/70 00:00      
      unions and portability            01/01/70 00:00      
         OT: use TR0 = 0; TMR0 -= offset; TR0 = 1;            01/01/70 00:00      
         you're not?            01/01/70 00:00      
            It was just a warning that union type casts are dangerous            01/01/70 00:00      

Back to Subject List