🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.c
Article #583

Re: Lvalue required

#583
From: Michal Malecki
Date: Mon, 26 Jan 1998 18:56
75 lines
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-mail
References: <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