468,504 Members | 2,003 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 468,504 developers. It's quick & easy.

lvalue required as increment operand

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: mr*@tusur.ru
Dec 24 '07 #1
9 7764
"Roman Mashak" <mr*@tusur.ruwrites:
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 1:putchar(a[i&15]);break;}}}
Dec 24 '07 #2
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.hand 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
es*****@ieee-dot-org.invalid
Dec 24 '07 #3
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
ESanother 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: mr*@tusur.ru
Dec 24 '07 #4
"Roman Mashak" <mr*@tusur.ruwrites:
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) <ks***@mib.org>
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"
Dec 24 '07 #5
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.hand 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
Dec 24 '07 #6
On Dec 24, 11:24*pm, "Roman Mashak" <m...@tusur.ruwrote:
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: m...@tusur.ru
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;
}
Dec 24 '07 #7
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

Dec 25 '07 #8
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: mr*@tusur.ru

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 ---
Dec 25 '07 #9
Joe Wright <jo********@comcast.netwrites:
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) <ks***@mib.org>
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"
Dec 25 '07 #10

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

9 posts views Thread by Steven T. Hatton | last post: by
5 posts views Thread by Sai Krishna M | last post: by
9 posts views Thread by junky_fellow | last post: by
14 posts views Thread by Akhil | last post: by
3 posts views Thread by Kavya | last post: by
54 posts views Thread by Rahul | last post: by
reply views Thread by NPC403 | last post: by
3 posts views Thread by gieforce | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.