Yahoo Groups archive

Lpc2000

Index last updated: 2026-04-28 23:31 UTC

Message

Re: For C Experts

2006-03-30 by dsidlauskas1

Jaya,

Thanks. The x[4] was a blunder on my part when I wrote the message.
Make it x[10].

Your second point is the key issue. Why can't the compiler understand
that the cast (int *)&buf[i] is to a byte aligned type, since buf is
declared as char buf[x], and the default Keil compiler alignment for
char is byte? 

This sure isn't the way this code should be written, but I'm porting
old code so I have to deal with what I've got.

Thanks for your comments.

Dave S.
   

--- In lpc2000@yahoogroups.com, "jayasooriah" <jayasooriah@...> wrote:
>
> Hello Dave,
> 
> I see two errors in the program that the KEIL compiler (justifiably
> IMHO) does not pick up.
> 
> The first error, assignment #1 in for loop, explicitly tells the
> compiler to cast to (int *) something that it will not understand as
> (int *).  Thus the compiler thus has no say (IMHO) in questioning this
> assignment, and which will no doubt cause of unaligned access errors
> in the statement immediately after.
> 
> The second error, assignment #2 in the for loop, is the proverbial
> array bounds problem that compilers tradionally shy away becuase of
> the need for (potentially expensive) run-time support libraries to do
> this properly.
> 
> Hope this helps.
> 
> Jaya
> 
> PS:  E&OE -- yahoo mail is not getting through and I have to resort to
> web interface!
> 
> --- In lpc2000@yahoogroups.com, "dsidlauskas1" <dsidlauskas@> wrote:
> >
> > Consider the following code:
> > 
> > ============================
> > char buf[]={1,2,3,4,5,6,7,8};
> > int *ip, x[4];
> > 
> > for (i=0; i<4; i++)
> >     {
> >     ip = (int *)&buf[i];
> >     x[4]  = *ip;
> >     }
> > =============================
> > The Keil compiler compiles this without warning, but does not produce
> > the expected (for me) result in x. The problem is that Keil uses the
> > LDR instruction to effect the transfer and this is valid only on 4
> > byte boundaries.
> > 
> > GCC compiles but does give a non-aligned access warning.
> > 
> > I believe that the compiler has enough information to use byte aligned
> > transfers, and should, or at least give a warning.
> > 
> > Anybody want to weigh in on this one.
> > 
> > Thanks in advance for your comments.
> > 
> > Dave Sidlauskas
> >
>

Attachments

Move to quarantaine

This moves the raw source file on disk only. The archive index is not changed automatically, so you still need to run a manual refresh afterward.