Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C Programming > lvalue required as increment operand

Reply
Thread Tools

lvalue required as increment operand

 
 
Ben Pfaff
Guest
Posts: n/a
 
      12-24-2007
"Roman Mashak" <(E-Mail Removed)> writes:

> extern inline void copy(void *pSource, void *pDest, unsigned int dLength)
> {
> unsigned int dI;
>
> for (dI = 0; dI < dLength; dI++) {
>
> *((char *) pDest) = *((char *) pSource);
> ((char *) pDest)++; /* error */
> ((char *) pSource)++; /* error */
> }
> }


extern inline void copy(void *pSource_, void *pDest_, unsigned int dLength)
{
char *pSource = pSource_;
char *pDest = pDest_;
unsigned int dI;

for (dI = 0; dI < dLength; dI++) {
*pDest = *pSource;
pDest++;
pSource++; /* error */
}
}

--
char a[]="\n .CJacehknorstu";int putchar(int);int main(void){unsigned long b[]
={0x67dffdff,0x9aa9aa6a,0xa77ffda9,0x7da6aa6a,0xa6 7f6aaa,0xaa9aa9f6,0x11f6},*p
=b,i=24;for(;p+=!*p;*p/=4)switch(0[p]&3)case 0:{return 0;for(p--;i--;i--)case+
2:{i++;if(i)break;else default:continue;if(0)case 1utchar(a[i&15]);break;}}}
 
Reply With Quote
 
 
 
 
Eric Sosman
Guest
Posts: n/a
 
      12-24-2007
Roman Mashak wrote:
> Hello,
>
> I'm porting code, previously compiled by IAR compiler, for ARM-gcc compiler.
> This snippet results in error, posted in subject:
>
> /*
> * copies a structure in a buffer
> * pSource Data to copy
> * pDest Buffer in which to copy the data
> */
> extern inline void copy(void *pSource, void *pDest, unsigned int dLength)
> {
> unsigned int dI;
>
> for (dI = 0; dI < dLength; dI++) {
>
> *((char *) pDest) = *((char *) pSource);
> ((char *) pDest)++; /* error */
> ((char *) pSource)++; /* error */
> }
> }
>
> As I understand, casting ends up with 'rvalue', and '++' or any other
> operations can't be applied to rvalue. So, what is the proper solution here?
> I'm unable to find a way


Ben Pfaff has shown how to fix the code, but I'll offer
another solution:

#include <string.h>
extern inline void copy(void *pSource, void *pDest,
unsigned int dLength)
{
memcpy (pDest, pSource, dLength); /* note arg swap */
}

If you're using a free-standing rather than a hosted
implementation, it's possible that <string.h> and memcpy()
are not provided, but take a look anyhow: If they're present,
they'll likely be speedier than anything written in plain C.
Also, memcpy() will behave unpredictably if the source and
destination areas overlap; you could use memmove() to get
predictable behavior, but that behavior might not be precisely
what you get from the original. You need to study the "contract"
of the copy() function to see if it's a candidate for replacement.

--
Eric Sosman
http://www.velocityreviews.com/forums/(E-Mail Removed)lid
 
Reply With Quote
 
 
 
 
Keith Thompson
Guest
Posts: n/a
 
      12-24-2007
"Roman Mashak" <(E-Mail Removed)> writes:
> I'm porting code, previously compiled by IAR compiler, for ARM-gcc compiler.
> This snippet results in error, posted in subject:
>
> /*
> * copies a structure in a buffer
> * pSource Data to copy
> * pDest Buffer in which to copy the data
> */
> extern inline void copy(void *pSource, void *pDest, unsigned int dLength)
> {
> unsigned int dI;
>
> for (dI = 0; dI < dLength; dI++) {
>
> *((char *) pDest) = *((char *) pSource);
> ((char *) pDest)++; /* error */
> ((char *) pSource)++; /* error */
> }
> }
>
> As I understand, casting ends up with 'rvalue', and '++' or any other
> operations can't be applied to rvalue. So, what is the proper solution here?

[...]

Another possibility is to change the two "++"s to:

pDest = (char*)pDest + 1;
pSource = (char*)pSource + 1;

The void* values are explicitly converted to char* so you can
increment them, then the char* result is implicitly converted back to
void* by the assignment.

--
Keith Thompson (The_Other_Keith) <(E-Mail Removed)>
Looking for software development work in the San Diego area.
"We must do something. This is something. Therefore, we must do this."
-- Antony Jay and Jonathan Lynn, "Yes Minister"
 
Reply With Quote
 
Flash Gordon
Guest
Posts: n/a
 
      12-24-2007
Eric Sosman wrote, On 24/12/07 05:17:
> Roman Mashak wrote:
>> Hello,
>>
>> I'm porting code, previously compiled by IAR compiler, for ARM-gcc
>> compiler. This snippet results in error, posted in subject:
>>
>> /*
>> * copies a structure in a buffer
>> * pSource Data to copy
>> * pDest Buffer in which to copy the data
>> */
>> extern inline void copy(void *pSource, void *pDest, unsigned int dLength)
>> {
>> unsigned int dI;
>>
>> for (dI = 0; dI < dLength; dI++) {
>>
>> *((char *) pDest) = *((char *) pSource);
>> ((char *) pDest)++; /* error */
>> ((char *) pSource)++; /* error */
>> }
>> }
>>
>> As I understand, casting ends up with 'rvalue', and '++' or any other
>> operations can't be applied to rvalue. So, what is the proper solution
>> here? I'm unable to find a way

>
> Ben Pfaff has shown how to fix the code, but I'll offer
> another solution:
>
> #include <string.h>
> extern inline void copy(void *pSource, void *pDest,
> unsigned int dLength)
> {
> memcpy (pDest, pSource, dLength); /* note arg swap */
> }


Unless you explicitly need the function version I would use a macro instead.

> If you're using a free-standing rather than a hosted
> implementation, it's possible that <string.h> and memcpy()
> are not provided, but take a look anyhow: If they're present,


At least some free-standing implementations provide memcpy (and as much
of the rest of the standard library as they sensibly can).

> they'll likely be speedier than anything written in plain C.
> Also, memcpy() will behave unpredictably if the source and
> destination areas overlap; you could use memmove() to get
> predictable behavior, but that behavior might not be precisely
> what you get from the original. You need to study the "contract"
> of the copy() function to see if it's a candidate for replacement.


Indeed. Personally I would want to change the code that calls copy to
call memmove or memcpy as appropriate. Then there is one less function
for the next maintainer to learn.
--
Flash Gordon
 
Reply With Quote
 
Roman Mashak
Guest
Posts: n/a
 
      12-24-2007
Hello,

I'm porting code, previously compiled by IAR compiler, for ARM-gcc compiler.
This snippet results in error, posted in subject:

/*
* copies a structure in a buffer
* pSource Data to copy
* pDest Buffer in which to copy the data
*/
extern inline void copy(void *pSource, void *pDest, unsigned int dLength)
{
unsigned int dI;

for (dI = 0; dI < dLength; dI++) {

*((char *) pDest) = *((char *) pSource);
((char *) pDest)++; /* error */
((char *) pSource)++; /* error */
}
}

As I understand, casting ends up with 'rvalue', and '++' or any other
operations can't be applied to rvalue. So, what is the proper solution here?
I'm unable to find a way

Thanks.

With best regards, Roman Mashak. E-mail: (E-Mail Removed)


 
Reply With Quote
 
Ahmed Samieh
Guest
Posts: n/a
 
      12-24-2007
On Dec 24, 11:24*pm, "Roman Mashak" <(E-Mail Removed)> wrote:
> Hello,
>
> I'm porting code, previously compiled by IAR compiler, for ARM-gcc compiler.
> This snippet results in error, posted in subject:
>
> /*
> * copies a structure in a buffer
> * pSource Data to copy
> * pDest * Buffer in which to copy the data
> */
> extern inline void copy(void *pSource, void *pDest, unsigned int dLength)
> {
> * * unsigned int dI;
>
> * * for (dI = 0; dI < dLength; dI++) {
>
> * * * * *((char *) pDest) = *((char *) pSource);
> * * * * ((char *) pDest)++; * */* error */
> * * * * ((char *) pSource)++; * */* error */
> * * }
>
> }
>
> As I understand, casting ends up with 'rvalue', and '++' or any other
> operations can't be applied to rvalue. So, what is the proper solution here?
> I'm unable to find a way
>
> Thanks.
>
> With best regards, Roman Mashak. *E-mail: (E-Mail Removed)


void* mcpy(void *dst, void *src, size_t n)
{
size_t i;
char* ldst = (char*)dst;
char* lsrc = (char*)src;
for (i = 0; i < n; ++i)
{
*ldst++ = *lsrc++;
}
return dst;
}
 
Reply With Quote
 
Roman Mashak
Guest
Posts: n/a
 
      12-24-2007
Hello, Eric!
You wrote on Mon, 24 Dec 2007 00:17:21 -0500:

[skip]
ES> Ben Pfaff has shown how to fix the code, but I'll offer
ES> another solution:

ES> #include <string.h>
ES> extern inline void copy(void *pSource, void *pDest,
ES> unsigned int dLength)
ES> {
ES> memcpy (pDest, pSource, dLength); /* note arg swap */
ES> }
[skip]

Thanks a lot!

With best regards, Roman Mashak. E-mail: (E-Mail Removed)


 
Reply With Quote
 
CBFalconer
Guest
Posts: n/a
 
      12-25-2007
Roman Mashak wrote:
>
> I'm porting code, previously compiled by IAR compiler, for ARM-gcc
> compiler. This snippet results in error, posted in subject:
>
> /*
> * copies a structure in a buffer
> * pSource Data to copy
> * pDest Buffer in which to copy the data
> */
> extern inline void copy(void *pSource, void *pDest, unsigned int dLength) {
> unsigned int dI;
>
> for (dI = 0; dI < dLength; dI++) {
> *((char *) pDest) = *((char *) pSource);
> ((char *) pDest)++; /* error */
> ((char *) pSource)++; /* error */
> }
> }
>
> As I understand, casting ends up with 'rvalue', and '++' or any
> other operations can't be applied to rvalue. So, what is the
> proper solution here? I'm unable to find a way


/* copies a structure in a buffer. */
extern inline void copy(void *psor, void *pdst, size_t lgh) {
char *cs = psor, cd = pdst;

while (lgh--) *cd++ = *cs++;
} /* untested */

Notice the absence of casts, which are usually errors. Also note
the change in the type of the lgh parameter. The above should drop
in wherever you were calling the old version. Any reasonable
compiler will absorb the extra data items.

--
Merry Christmas, Happy Hanukah, Happy New Year
Joyeux Noel, Bonne Annee, Frohe Weihnachten
Chuck F (cbfalconer at maineline dot net)
<http://cbfalconer.home.att.net>



--
Posted via a free Usenet account from http://www.teranews.com

 
Reply With Quote
 
Joe Wright
Guest
Posts: n/a
 
      12-25-2007
Roman Mashak wrote:
> Hello,
>
> I'm porting code, previously compiled by IAR compiler, for ARM-gcc compiler.
> This snippet results in error, posted in subject:
>
> /*
> * copies a structure in a buffer
> * pSource Data to copy
> * pDest Buffer in which to copy the data
> */
> extern inline void copy(void *pSource, void *pDest, unsigned int dLength)
> {
> unsigned int dI;
>
> for (dI = 0; dI < dLength; dI++) {
>
> *((char *) pDest) = *((char *) pSource);
> ((char *) pDest)++; /* error */
> ((char *) pSource)++; /* error */
> }
> }
>
> As I understand, casting ends up with 'rvalue', and '++' or any other
> operations can't be applied to rvalue. So, what is the proper solution here?
> I'm unable to find a way
>
> Thanks.
>
> With best regards, Roman Mashak. E-mail: (E-Mail Removed)
>
>

Too complicated. First, if copy() would use pSourse and pDest as char*
it should declare them such. :

void copy(char *pSource, char *pDest, unsigned dLength)

Even if you call it with void* the compiler will do the conversions to
char* for you.

--
Joe Wright
"Everything should be made as simple as possible, but not simpler."
--- Albert Einstein ---
 
Reply With Quote
 
Keith Thompson
Guest
Posts: n/a
 
      12-25-2007
Joe Wright <(E-Mail Removed)> writes:
> Roman Mashak wrote:
>> I'm porting code, previously compiled by IAR compiler, for ARM-gcc
>> compiler. This snippet results in error, posted in subject:
>>
>> /*
>> * copies a structure in a buffer
>> * pSource Data to copy
>> * pDest Buffer in which to copy the data
>> */
>> extern inline void copy(void *pSource, void *pDest, unsigned int dLength)

[...]
> Too complicated. First, if copy() would use pSourse and pDest as char*
> it should declare them such. :
>
> void copy(char *pSource, char *pDest, unsigned dLength)
>
> Even if you call it with void* the compiler will do the conversions to
> char* for you.


I disagree. This kind of thing is exactly what void* is for (see the
standard memcpy() and memmove() functions, for example). If the
parameters are declared as char* (why not unsigned char*?), the
function can't be used with, say, int* arguments without a cast. Any
required explicit conversions should be done inside the function, not
imposed on the user.

Of course, just using memcpy() or memmove() directly is probably
better than re-implementing it.

--
Keith Thompson (The_Other_Keith) <(E-Mail Removed)>
Looking for software development work in the San Diego area.
"We must do something. This is something. Therefore, we must do this."
-- Antony Jay and Jonathan Lynn, "Yes Minister"
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
lvalue required as increment operand -- why does the Standard requiresthis for fundamental types only? Pavel C++ 13 07-05-2011 12:53 AM
Re*: Re: Re*: Re: lvalue required as increment operand -- why does the Standard requires this for fundamental types only? Leo \Equinox\ Gaspard C++ 2 07-03-2011 12:15 PM
Re*: Re: lvalue required as increment operand -- why does the Standard requires this for fundamental types only? Leo \Equinox\ Gaspard C++ 1 07-03-2011 09:48 AM
using a method as an lvalue and "invalid lvalue in assignment"compilation error markryde@gmail.com C Programming 11 09-22-2008 10:42 AM
operators requiring lvalue/rvalue operands and resulting in rvalue/lvalue Kavya C Programming 9 10-28-2006 01:45 AM



Advertisments