🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.c
16 messages
16 total messages Started by Tomasz Cichacki Wed, 07 Jan 1998 16:41
Lvalue required
#576
Author: Tomasz Cichacki
Date: Wed, 07 Jan 1998 16:41
31 lines
1039 bytes
Mam taki kawalek programu w c++
Podczas kompilacji pojawia sie Lvalue required
Gdzie jest blad?
O odp prosze na priv
dziekuje


typedef struct dane
{
  char ind[5];
  char imie[20];
};
dane d1;

//***************************
// zapis danych do pliku
//***************************

void main(void)
{
  char x[5] = "abcd"; // - Lvalue required
  d1.ind = x;
};



--
Tomek
hermes@venus.wmid.amu.edu.pl
http://venus.wmid.amu.edu.pl
tel 0 602 664 791
Re: Lvalue required
#577
Author: Jacek Pietraszek
Date: Wed, 07 Jan 1998 21:02
37 lines
1218 bytes
Tomasz Cichacki wrote:
> [...]
> void main(void)
> {
>   char x[5] = "abcd"; // - Lvalue required

To nie przechodzi, bo albo inicjujesz tablice,
ale wowczas wymagane jest PIEC znakow np.

char x[5] = "abcd ";

albo inicjujesz element po elemencie.

>   d1.ind = x;

To tez nie przejdzie, bo kontrola typow
jest na poziomie nazw tzn. deklaracja

char x[5]

i

char y[5]

to sa deklaracje DWOCH ROZNYCH typow.
Jezeli chcesz stosowac takie podstawianie,
to najpierw zdeklaruj typedef np.

typedef napis5 char[5]

a dopiero potem np.
napis5 x i napis5 y
Wowczas x = y przejdzie.

Pozdrawiam,

Jacek
Re: Lvalue required
#580
Author: Qrczak
Date: Wed, 07 Jan 1998 21:13
38 lines
1835 bytes
On Wed, 7 Jan 1998, Tomasz Cichacki wrote:

> typedef struct dane
> {
>   char ind[5];
>   char imie[20];
> };

Nie tak. Albo "struct dane {...};" (AFAIK wtedy w zwykłym C, a
niekoniecznie w C++, trzeba by później używać tego typu przez "struct
dane"), albo "typedef struct {...} dane;". Pooglądaj różne przykłady
typedef i struct, z helpów czy z czegoś tam.

> dane d1;

W tym przypadku najprościej "struct dane {...} d1;" albo zgoła
"struct {...} d1;".

> void main(void)
> {
>   char x[5] = "abcd"; // - Lvalue required

Tutaj nie ma prawa być takiego błędu!

>   d1.ind = x;

Ale powinien być tutaj. Pole ind jest tablicą, nie można przypisać całej
tablicy przez =. Gdyby ind było wskaźnikiem, czyli typu char *, toby
można było przypisać sam wskaźnik (z wiadomymi mam nadzieję tego
konsekwencjami), a do kopiowania łańcuchów służy strcpy i strncpy.

> };

-- 
                                 QRCZAK      #
    __("<              Marcin Kowalczyk     #*#
    \__/              qrczak@knm.org.pl    #\#&#
     ^^      http://qrczak.home.ml.org/      I
Re: Lvalue required
#578
Author: Marcin Olszewski
Date: Thu, 08 Jan 1998 13:20
31 lines
1542 bytes
Jacek Pietraszek wrote:
> 
> Tomasz Cichacki wrote:
> > [...]
> > void main(void)
> > {
> >   char x[5] = "abcd"; // - Lvalue required
> 
> To nie przechodzi, bo albo inicjujesz tablice,
> ale wowczas wymagane jest PIEC znakow np.
> 
> char x[5] = "abcd ";
Oczywiscie ze wchodzi! Jesli znakow jest mniej niz dlugosc char'a, to
reszta powinna wypelnic sie zerami (przynajmniej w Borlandzie i gcc). A
przy okazji, to ciag "abcd" ma w rzeczywistosci dlugosc 5 - cztery
litery + konczace zero.

> albo inicjujesz element po elemencie.
> 
> >   d1.ind = x;
> 
> To tez nie przejdzie, bo kontrola typow
> jest na poziomie nazw tzn. deklaracja
(...) 
> to najpierw zdeklaruj typedef np.
> typedef napis5 char[5]
> a dopiero potem np.
> napis5 x i napis5 y
> Wowczas x = y przejdzie.
Mam mocne watpliwosci. Nie lepiej uzyc strcpy albo wskaznikow?
Maly.
Re: Lvalue required
#579
Author: Marek Kotowski
Date: Thu, 08 Jan 1998 14:13
26 lines
1309 bytes
Marcin Olszewski wrote:
> > char x[5] = "abcd ";
> Oczywiscie ze wchodzi! Jesli znakow jest mniej niz dlugosc char'a, to
> reszta powinna wypelnic sie zerami (przynajmniej w Borlandzie i gcc). A

  Tak stanowi standard ANSI C. Jesli obiekt jest inicjowany tylko
czesciowo, nieinicjowane elementy otrzymuja wartosci 0, NULL lub 0.0.

> > to najpierw zdeklaruj typedef np.
> > typedef napis5 char[5]

Blad formalny! Ta deklaracja powinna miec postac 

typedef char napis5[5];


> > a dopiero potem np.
> > napis5 x i napis5 y
> > Wowczas x = y przejdzie.
> Mam mocne watpliwosci. 

I slusznie. Zawsze mozna sprawdzic. :-)

  Z powazaniem 

  Marek Kotowski
Re: Lvalue required
#581
Author: Jarek Kucypera
Date: Thu, 08 Jan 1998 14:35
40 lines
1673 bytes
Tomasz Cichacki <hermes@venus.wmid.edu.pl> napisał(a) w artykule 

> Gdzie jest blad?

> typedef struct dane
> {
>   char ind[5];
>   char imie[20];
> };
> dane d1;
> 
> //***************************
> // zapis danych do pliku
> //***************************
> 
> 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.
Do operacji na stringach służą funkcje zadeklarowane w pliku
nagłówkowym <string.h>.

Funckję main() można poprawić na dwa sposoby:

1)
main() {
char x[5] = {'a','b','c','d','\0'};            /* W C(++) MOŻNA inicjować tablice w momencie deklaracji */
strcpy(d1.ind,x); }

2)
main() { char x[5]; strcpy(x,"abcd"); strcpy(d1.ind,x); }

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 *).
Re: Lvalue required
#582
Author: Marek Kotowski
Date: Thu, 08 Jan 1998 15:20
29 lines
1360 bytes
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.

[...]

> 
> 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 *).

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.

  Z powazaniem

  Marek Kotowski
Re: Lvalue required
#591
Author: Yossarian
Date: Thu, 08 Jan 1998 15:56
17 lines
950 bytes
On Wed, 7 Jan 1998 17:41:18 +0100, "Tomasz Cichacki"
<hermes@venus.wmid.edu.pl> wrote:

>void main(void)
>{
>  char x[5] = "abcd"; // - Lvalue required
>  d1.ind = x;
  ^^^^^^^^^^^
uzyj strcpy(d1.ind,x)
albo memcpy, jezeli chcesz kopiowac znaki o kodzie ASCII 0


Jarek Woloszyn

ysr@kki.net.pl
http://free.polbox.pl/w/woljar
UIN: 1922941
Re: Lvalue required
#584
Author: Pawel Matejski
Date: Tue, 20 Jan 1998 14:00
43 lines
1720 bytes
Jarek Kucypera <jark@insert.com.pl> wrote:
> Tomasz Cichacki <hermes@venus.wmid.edu.pl> napisa?(a) w artykule 

>> Gdzie jest blad?

>> typedef struct dane
>> {
>>   char ind[5];
>>   char imie[20];
>> };
>> dane d1;
>> 
>> //***************************
>> // zapis danych do pliku
>> //***************************
>> 
>> 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

[Ciach]

> 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 *).

To wkoncu to jest blad, czy nie? Przeczysz sam sobie.

Bledu w kompilacji tego fragmentu nie ma (kompilowane przez gcc),
za to konstrukcja, d1.ind = x; jest niebezpiczna, gdyz w tym
momencie gubisz wskaznik do zarezerwowanego miejsca w pamieci.
Postepujac tak czesciej w programie, moze Ci zabrakonac pamieci.

--

Pozdrawiam

						Madej
Re: Lvalue required
#585
Author: Jarek Kucypera
Date: Thu, 22 Jan 1998 12:38
18 lines
1346 bytes
Pawel Matejski <madej@gacek.ds14.agh.edu.pl> napisał(a) w artykule > 

> To wkoncu to jest blad, czy nie? Przeczysz sam sobie.

Jest - logiczny. To, że program chodzi, nie znaczy że nie ma błędu

> 
> Bledu w kompilacji tego fragmentu nie ma (kompilowane przez gcc),
> za to konstrukcja, d1.ind = x; jest niebezpiczna, gdyz w tym
> momencie gubisz wskaznik do zarezerwowanego miejsca w pamieci.
> Postepujac tak czesciej w programie, moze Ci zabrakonac pamieci.

Zgadza się. Ale zdaje się, że sedno problemu polegało na tym, że 
string "nie chciał" się skopiować. 

> Pozdrawiam

I ja również
Re: Lvalue required
#586
Author: Tomasz Wysocki
Date: Thu, 22 Jan 1998 18:20
51 lines
2273 bytes
Pawel Matejski wrote:
> 
> Jarek Kucypera <jark@insert.com.pl> wrote:
> > Tomasz Cichacki <hermes@venus.wmid.edu.pl> napisa?(a) w artykule
> 
> >> Gdzie jest blad?
> 
> >> typedef struct dane
> >> {
> >>   char ind[5];
> >>   char imie[20];
> >> };
> >> dane d1;
> >>
> >> //***************************
> >> // zapis danych do pliku
> >> //***************************
> >>
> >> 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
> 
> [Ciach]
> 
> > 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 *).
> 
> To wkoncu to jest blad, czy nie? Przeczysz sam sobie.
> 
> Bledu w kompilacji tego fragmentu nie ma (kompilowane przez gcc),
> za to konstrukcja, d1.ind = x; jest niebezpiczna, gdyz w tym
> momencie gubisz wskaznik do zarezerwowanego miejsca w pamieci.
> Postepujac tak czesciej w programie, moze Ci zabrakonac pamieci.

Pamieci nie zabraknie.
d1.ind jest typu char [5] a nie char * a zatem wskaznika nie gubimy.
Sprawdz rozmiar struktury d1. ( u mnie 25*sizeof(char) )
Mimo ze nazwe tablicy mozna rozumiec jako wskaznik do jej pierwszego
elementu to w C++ sa to dwa rozne typy.
Tyle ze kompilator wykonuje niejawny type-cast do char *.
Pod GCC sie kompiluje. Tylko ze to jest dobry kompilator i wie ze chodzi
nam o przepisanie tablic.
Aczkolwiek ANSI C++ zabrania przepisywania tablic.
( Sprawdzcie z opcja -Wall )

tawek@friko2.onet.pl
Re: Lvalue required
#587
Author: Jakub Slocki
Date: Mon, 26 Jan 1998 00:32
47 lines
1933 bytes
> Jarek Kucypera <jark@insert.com.pl> wrote:
> > Tomasz Cichacki <hermes@venus.wmid.edu.pl> napisa?(a) w artykule 
> 
> >> Gdzie jest blad?
> >> typedef struct dane
> >> {
> >>   char ind[5];
> >>   char imie[20];
> >> };
> >> dane d1;
> >> 
> >> //***************************
> >> // zapis danych do pliku
> >> //***************************
> >> 
> >> void main(void)
> >> {
> >>   char x[5] = "abcd"; // - Lvalue required
> >>   d1.ind = x;

blad jest TU
d1.ind - nie jest zadeklarowany jako char* a statyczna tablica
do statycznej tablicy nie nalezy przypisywac wskaznika ot co.
Jesli ktorys kompilator to puscil to blad kompilatora. 

a jak chcesz przepisac to masz strcpy albo oprogramuj to sam

> >> };

> > 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 *).
no wlasnie - a po lewej stronie nie jest (z punktu widzenia kompilatora) 
to wskaznik zmienialny.
jak tak sie chcecie bawic to proponuje:

char **wsk;
wsk = &(d1.ind);
*wsk = x;

i po klopocie :)))))))
tylko nie obwiniac mnie za to ze cos potem pojdzie nie tak.
lepiej na samym wstepie strcpy.



K.
Re: Lvalue required
#588
Author: Qrczak
Date: Mon, 26 Jan 1998 10:58
21 lines
1217 bytes
On Mon, 26 Jan 1998, Jakub Slocki wrote:

> > >> typedef struct dane
> > >> {
> > >>   char ind[5];
> > >>   char imie[20];
> > >> };
> > >> dane d1;
[...]

> char **wsk;
> wsk = &(d1.ind);
> *wsk = x;

Nie sprawdzałem, ale IMHO to nie ma prawa zadziałać.

-- 
                                 QRCZAK
    __("<              Marcin Kowalczyk
    \__/              qrczak@knm.org.pl
     ^^      http://qrczak.home.ml.org/
Re: Lvalue required
#589
Author: Greg Malewski
Date: Mon, 26 Jan 1998 14:23
37 lines
1723 bytes
Ja rowniez nie rozumiem jak to mogloby procowac. Jesli nie strcpy, no to

char *pointer,i;
pointer = d1->ind;
for (i=0;*pointer=x[i]!=0;i++,pointer++);

ostatnia linia to pracuje tak jak strcpy - pamietaj ze zawsze music konczyc
sie "string " z \0.

Greg
gregm@eit.ltd.uk

Qrczak <qrczak@knm.org.pl> wrote in article
<Pine.LNX.3.96.980126115749.1306A-100000@qrnik.knm.org.pl>...
> On Mon, 26 Jan 1998, Jakub Slocki wrote:
> 
> > > >> typedef struct dane
> > > >> {
> > > >>   char ind[5];
> > > >>   char imie[20];
> > > >> };
> > > >> dane d1;
> [...]
> 
> > char **wsk;
> > wsk = &(d1.ind);
> > *wsk = x;
> 
> Nie sprawdzałem, ale IMHO to nie ma prawa zadziałać.
> 
> -- 
>                                  QRCZAK
>     __("<              Marcin Kowalczyk
>     \__/              qrczak@knm.org.pl
>      ^^      http://qrczak.home.ml.org/
> 
> 
Re: Lvalue required
#583
Author: 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...
Re: Lvalue required
#590
Author: Jakub Slocki
Date: Mon, 26 Jan 1998 22:09
30 lines
1678 bytes
In article <Pine.LNX.3.96.980126115749.1306A-100000@qrnik.knm.org.pl>, 
qrczak@knm.org.pl says...
> On Mon, 26 Jan 1998, Jakub Slocki wrote:
> 
> > > >> typedef struct dane
> > > >> {
> > > >>   char ind[5];
> > > >>   char imie[20];
> > > >> };
> > > >> dane d1;
> [...]
> 
> > char **wsk;
> > wsk = &(d1.ind);
> > *wsk = x;
> 
> Nie sprawdzałem, ale IMHO to nie ma prawa zadziałać.
> 

nie napisalem ze jest to rozwiazanie tego problemu :) :) 
napisalem tylko konstrukcje ktora przedpisca (taki odpowiednik 
przedmowcy) chcial zrealizowac a kompilator mu nie ruszyl. to co 
pokazalem na pewno sie skompiluje ale tak samo nie przepisze zawartosci 
stringa a w dodatku smienia adres wskaznika ktory nie powinien byc 
zmieniany. 

Pisalem przeciez i przed tym fragmentem jak i po tym fragmencie ze 
najlepiej strcpy albo samemu recznie przepisywac.

K.
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads