Article View: pl.comp.lang.c
Article #583Re: Lvalue required
From: Michal Malecki
Date: Mon, 26 Jan 1998 18:56
Date: Mon, 26 Jan 1998 18:56
75 lines
3455 bytes
3455 bytes
Musze przyznac, ze takiego lamerstwa, jakie tu ogladam to dawno nie widzialem
NIGDZIE!
Marek Kotowski <mkot@imm.org.pl> wrote:
: Jarek Kucypera wrote:
:>
:> > void main(void)
:> > {
:> > char x[5] = "abcd"; // - Lvalue required
:> > d1.ind = x;
:> > };
:>
:> Błąd w tym, że w C(++) NIE MOŻNA stosować operatora podstawienia "=" do
:> całych tablic, więc także do stringów, które są tablicami znaków.
I oczywiscie, niestety BABOL! Mozna! Niestety, oczywiscie tylko w momencie
inicjalizacji. No ale spojrzmy dalej.
:>
:> Postawienie, jak u Ciebie, po prawej stronie operatora "=" tablicy,
:> powoduje przekazanie ADRESU PIERWSZEGO ELEMENTU tej tablicy,
:> a więc w tym wypadku wskaźnika typu (char *).
Bzdura! W momencie inicjalizacji wszystko dziala zgodnie z zamierzeniem.
: Sugerowalbym, zeby jesli juz sie radzi, to miec pewnosc, ze rada
: jest dobra. W definicji
: char x[5] = "abcd"; // - Lvalue required
: nie ma bledu. Komunikat "Lvalue required" zostal najwyrazniej
: wygenerowany dla innego zdania.
I z tym sie NIEPODZIELNIE zgodze. Przytocze moze jeszcze raz ten fragment:
void main(void)
{
char x[5] = "abcd"; // - Lvalue required
d1.ind = x;
};
Blad, ktory zostal zacytowany odnosi sie do nastepnej linijki.
W strukturze (ktorej juz mi sie nie chce cytowac, popatrzcie sobie
w poprzednich wiadomosciach) pole 'ind' jest typu char[5].
Oczywiscie nie oznacza to, ze nie da sie uzyc takiej konstrukcji do
zapelnienia tego pola! Mozna to zrobic np. tak:
dane d1 = { "", "abcd" };
Natomiast, juz w trakcie programu musimy przepisac lancuch standartowo, tzn.
strcpy( d1.ind, "abcd" );
Przy okacji wyjasnie drobne niescislosci wynikle z glupoty co niektorych:
1. String "abcd" zajmuje w pamieci 5 (Slownie 5 ZNAKOW!!!). Tak tez string
"abcd " zajmie ich szesc. Tych, ktorzy o tym nie wiedza odsylam do literatury.
2. Mozna napisac char x[5] = { 'a', 'b', 'c', 'd', '\0' }; , ale po co.
Przeciez zapis char x[5] = "abcd"; to jest dokladnie to samo.
No a blad polega na tym, ze w operatorze przypisania po lewej stronie jest
potrzebna wlasnie l-wartosc, to znaczy cos, do czego mozna przypisac.
tablica nie jest l-wartoscia, gdyz reprezentujaca ja zmienna ma przypisany
adres "na twardo", a proba takiego przypisania bedzie zrozumiana przez
kompilator jako proba przypisania do tej wlasnie stalej. A stala - jak wiadomo
- nie jest l-wartoscia.
Z powazaniem (choc nie wiem, czy jest tu kogo powazac)...
--
.---. . . - Michal Malecki <mmalecki@technologist.com>/The things that
\___ ,-. | , |- ,-. ,- mUd: zly.mud.org.pl 4000. /can't destroy you
\ |-' |< | | | | uRl: www.kis.p.lodz.pl/~sektor /make you
`---' `-' ' ` `' `-' ' pGp: sektor@zly.kis.p.lodz.pl /stronger...
Technical Details
Message-ID:
<6aim8e$m1s@polonez.man.lodz.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!news.icm.edu.pl!news.nask.pl!news.man.lodz.pl!not-for-mailReferences:
<690be3$rs8$3@sunsite.icm.edu.pl> <01bd1c42$76482220$2701070a@jark.insert.igo.wroc.pl> <34B4EEC4.382C@imm.org.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!news.icm.edu.pl!news.nask.pl!news.man.lodz.pl!not-for-mail From: Michal Malecki <sektor@zly.kis.p.lodz.pl> Newsgroups: pl.comp.lang.c Subject: Re: Lvalue required Date: 26 Jan 1998 18:56:14 GMT Lines: 75 Message-ID: <6aim8e$m1s@polonez.man.lodz.pl> References: <690be3$rs8$3@sunsite.icm.edu.pl> <01bd1c42$76482220$2701070a@jark.insert.igo.wroc.pl> <34B4EEC4.382C@imm.org.pl> NNTP-Posting-Host: sektor@zly.kis.p.lodz.pl Mime-Version: 1.0 User-Agent: tin/pre-1.4-980105 (UNIX) (SunOS/5.5.1 (i86pc)) Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit