Andy
Guest
Sat Feb 10, 2007 8:59 pm
Witam
Nie kompiluje mi sie taka konstrukcja pod WinAVR 20070122:
{
char byte;
void *ptr;
byte = *((char*)ptr)++;
// ...
}
error: invalid lvalue in increment
Ktos moze wie dlaczego ?
Umiem sobie z tym poradzic wiec to nie problem
ale czy to jakis bug w nowej wersji WinAVR ?
--
Andrzej
mk
Guest
Sat Feb 10, 2007 11:28 pm
Newsuser "Andy" <anokWYTNIJ@ceti.pl> wrote:
Quote:
Nie kompiluje mi sie taka konstrukcja pod WinAVR 20070122:
{
char byte;
void *ptr;
byte = *((char*)ptr)++;
// ...
}
error: invalid lvalue in increment
Ktos moze wie dlaczego ?
Umiem sobie z tym poradzic wiec to nie problem
ale czy to jakis bug w nowej wersji WinAVR ?
Nie, to nie bug - kompilator zachowuje się poprawnie.
Konwersja nie daje modyfikowalnej l-wartości... a tej wymaga opeator ++.
pzdr
mk
Andy
Guest
Sun Feb 11, 2007 12:15 am
Użytkownik "mk" <REVERSE_lp.pw@myzskm.REMOVE> napisał w wiadomości
news:eqlgtg$254$1@inews.gazeta.pl...
Quote:
Newsuser "Andy" <anokWYTNIJ@ceti.pl> wrote:
Nie kompiluje mi sie taka konstrukcja pod WinAVR 20070122:
{
char byte;
void *ptr;
byte = *((char*)ptr)++;
// ...
}
error: invalid lvalue in increment
Ktos moze wie dlaczego ?
Umiem sobie z tym poradzic wiec to nie problem
ale czy to jakis bug w nowej wersji WinAVR ?
Nie, to nie bug - kompilator zachowuje się poprawnie.
Konwersja nie daje modyfikowalnej l-wartości... a tej wymaga opeator ++.
...
znaczy po konwersji wskaznika ptr na (char*) nie da sie na nim zrobic ++ ?
chyba masz racje ale starsza wersje avr-gcc to lykala
czyzby blad w starszej wersji ?
--
Andrzej
mk
Guest
Sun Feb 11, 2007 1:18 am
Newsuser "Andy" <anokWYTNIJ@ceti.pl> wrote:
Quote:
Nie kompiluje mi sie taka konstrukcja pod WinAVR 20070122:
{
char byte;
void *ptr;
byte = *((char*)ptr)++;
// ...
}
error: invalid lvalue in increment
Ktos moze wie dlaczego ?
Umiem sobie z tym poradzic wiec to nie problem
ale czy to jakis bug w nowej wersji WinAVR ?
Nie, to nie bug - kompilator zachowuje się poprawnie.
Konwersja nie daje modyfikowalnej l-wartości... a tej wymaga opeator
++. ...
znaczy po konwersji wskaznika ptr na (char*) nie da sie na nim zrobic
++ ?
Tak. Rzutowanie daje "wartość wyrażenia", czasami zwaną r-wartością.
Podobnie poniższy przykład nie jest prawidłowy:
int foo();
void bar() {
foo() ++;
}
Quote:
chyba masz racje ale starsza wersje avr-gcc to lykala
czyzby blad w starszej wersji ?
Zdecydowanie błąd. To nie było prawidłowe w C90, ani nie jest w C99.
pzdr
mk
Andy
Guest
Sun Feb 11, 2007 3:30 pm
Użytkownik "mk" <REVERSE_lp.pw@myzskm.REMOVE> napisał w wiadomości
news:eqlnb7$hcs$1@news.onet.pl...
[quote:537e5a2cff]
...
[/quote:537e5a2cff]
Dzieki za wyjasnienia.
Jak na razie wszystko rozumiem ale
cos takiego sie kompiluje:
void * dataPtr;
char byte;
byte = *((char*)dataPtr);
dataPtr++;
a tego nie pojmuje
Skad kompilator wie o ile zwiekszyc ptr skoro jest wskaznikiem na void ?
Kompiluje sie pod avr-gcc ale pod Visualem C++ sie nie kompiluje
co jest w/g mnie normalne.
--
Andrzej
mk
Guest
Sun Feb 11, 2007 3:46 pm
Newsuser "Andy" <anokWYTNIJ@ceti.pl> wrote:
[quote:614ad09863]Dzieki za wyjasnienia.
Jak na razie wszystko rozumiem ale
cos takiego sie kompiluje:
void * dataPtr;
char byte;
byte = *((char*)dataPtr);
dataPtr++;
a tego nie pojmuje
Skad kompilator wie o ile zwiekszyc ptr skoro jest wskaznikiem na
void ?
Kompiluje sie pod avr-gcc ale pod Visualem C++ sie nie kompiluje
co jest w/g mnie normalne.
[/quote:614ad09863]
Kompilator powinien zatrzymać swe działanie i wyświetlić błąd.
Spróbuj włączyć opcję ścisłej zgodności ze standardem, o ile ten kompilator
taką posiada.
Kompilatory dla mikrokontrolerów posiadają wiele rozszerzeń ponad standard,
być może ujawniła się tu jedna z nich.
pzdr
mk