Hello,
Another solution I had last night which should fix the alignment-problem, because the union is
compiler will align this union to its biggest member:
===============================================================
union {
char u8[8];
short u16[4];
} buff = {1, 2, 3, 4, 5, 6, 7, 8};
int main(void) {
short x[10], i;
for (i = 0; i < 4; i++) {
x[i] = buff.u16[i];
printf(" %04x, ", x[i]);
}
return 0;
}
===============================================================
Sten
brendanmurphy37 wrote:
> Dave,
>
> Think about whet your saying here:
>
>
>>ip = (int *)&buf[5];
>>
>>should be treated by the compiler as:
>>
>>ip = (__packed int *)&buf[5];
>>
>
>
> "should" doesn't come into it! You have explicitley told the
> compiler exectly how you want it treated (the "(int *)"). Now if you
> had one of those magic "do what I mean, not what I say" compilers,
> you'd be fine......
>
> By the way, if you find that compiler, let me know!
>
> Brendan
>
> --- In lpc2000@yahoogroups.com, "dsidlauskas1" <dsidlauskas@...>
> wrote:
>
>>Jaya,
>>
>>I don't think I'm asking it to connect the two statements.
>>
>>What I'm expecting it to do is to recognize that buf is a byte
>
> packed
>
>>object (the defalt for the compler)and when casting byte packed
>>objects the compiler should cast them to other byte packed objects.
>>
>>in otherwords;
>>
>>char buf[10];
>>int ip*;
>>
>>ip = (int *)&buf[5];
>>
>>should be treated by the compiler as:
>>
>>ip = (__packed int *)&buf[5];
>>
>>and this is because char buf[10] is a byte packed object for this
>>compiler.
>>
>>Dave
>>
>>
>>--- In lpc2000@yahoogroups.com, "jayasooriah" <jayasooriah@> wrote:
>>
>>>Dave,
>>>
>>>I think what you are asking of the compiler is to connect the two
>>>statements in the for() loop. Compilers do not have this
>
> capability.
>
>>> Even if it did, it would have to also consider the for()
>
> statement
>
>>>too, as your code would be legitimate if the for() statement was:
>>>
>>>
>>>> for (i = 0; i < ...; i += 4)
>>>
>>>A purist would argue is that there is nothing wrong with the
>
> pointer
>
>>>assignment given the explicit cast. The error occurs only if
>
> (and
>
>>>when) the pointer is dereferenced at runtime.
>>>
>>>Making it a packed array on these grounds may not be what the
>>>programmer intended. Besides, packed array methods involve
>>>implementation issues.
>>>
>>>GCC was kind enough to allude you to the possibility of such an
>
> event
>
>>>ocurring. Note that it too did not make the relationship
>
> between the
>
>>>two statements. If it did, it would report an error, not a
>
> warning.
>
>>>Jaya
>>>
>>>--- In lpc2000@yahoogroups.com, "dsidlauskas1" <dsidlauskas@>
>
> wrote:
>
>>>>Jaya,
>>>>
>>>>Since the compiler knows that buf is a byte aligned object,
>
> woutldn't
>
>>>>it be resonable for the compiler to treat
>>>>
>>>>(int *)&buf[i]
>>>>
>>>>as
>>>>
>>>>(__packed int *)&buf[i]
>>>>
>>>>In general, if non-naturaly aligned objects are promoted by a
>
> cast,
>
>>>>shouldn't, by default, the cast be of the proper non-aligned
>
> type?
>
>>>>BTW. Really appreciate your discussion of interupts on your
>
> web site.
>
>>>>Dave
>>>
>
>
>
>
>
>
>
> Yahoo! Groups Links
>
>
>
>
>
>
>
--
/************************************************
Do you need a tiny and efficient real time
operating system (RTOS) with a preemtive
multitasking for LPC2000 or AT91SAM7?
http://nanortos.net-attack.de/
Or some open-source tools and code for LPC2000?
http://www.net-attack.de/
************************************************/Message
Re: [lpc2000] Re: For C Experts
2006-03-31 by Sten
Attachments
- No local attachments were found for this message.