Thread View: pl.comp.lang.c
16 messages
16 total messages
Started by Tomasz Cichacki
Wed, 07 Jan 1998 16:41
Lvalue required
Author: Tomasz Cichacki
Date: Wed, 07 Jan 1998 16:41
Date: Wed, 07 Jan 1998 16:41
31 lines
1039 bytes
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
Author: Jacek Pietraszek
Date: Wed, 07 Jan 1998 21:02
Date: Wed, 07 Jan 1998 21:02
37 lines
1218 bytes
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
Author: Qrczak
Date: Wed, 07 Jan 1998 21:13
Date: Wed, 07 Jan 1998 21:13
38 lines
1835 bytes
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
Author: Marcin Olszewski
Date: Thu, 08 Jan 1998 13:20
Date: Thu, 08 Jan 1998 13:20
31 lines
1542 bytes
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
Author: Marek Kotowski
Date: Thu, 08 Jan 1998 14:13
Date: Thu, 08 Jan 1998 14:13
26 lines
1309 bytes
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
Author: Jarek Kucypera
Date: Thu, 08 Jan 1998 14:35
Date: Thu, 08 Jan 1998 14:35
40 lines
1673 bytes
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
Author: Marek Kotowski
Date: Thu, 08 Jan 1998 15:20
Date: Thu, 08 Jan 1998 15:20
29 lines
1360 bytes
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
Author: Yossarian
Date: Thu, 08 Jan 1998 15:56
Date: Thu, 08 Jan 1998 15:56
17 lines
950 bytes
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
Author: Pawel Matejski
Date: Tue, 20 Jan 1998 14:00
Date: Tue, 20 Jan 1998 14:00
43 lines
1720 bytes
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
Author: Jarek Kucypera
Date: Thu, 22 Jan 1998 12:38
Date: Thu, 22 Jan 1998 12:38
18 lines
1346 bytes
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
Author: Tomasz Wysocki
Date: Thu, 22 Jan 1998 18:20
Date: Thu, 22 Jan 1998 18:20
51 lines
2273 bytes
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
Author: Jakub Slocki
Date: Mon, 26 Jan 1998 00:32
Date: Mon, 26 Jan 1998 00:32
47 lines
1933 bytes
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
Author: Qrczak
Date: Mon, 26 Jan 1998 10:58
Date: Mon, 26 Jan 1998 10:58
21 lines
1217 bytes
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
Author: Greg Malewski
Date: Mon, 26 Jan 1998 14:23
Date: Mon, 26 Jan 1998 14:23
37 lines
1723 bytes
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
Author: 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...
Re: Lvalue required
Author: Jakub Slocki
Date: Mon, 26 Jan 1998 22:09
Date: Mon, 26 Jan 1998 22:09
30 lines
1678 bytes
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