[ BoLa @ 14.11.2004. 16:45 ] @
imam sljedecu strukturu:
typedef struct cl_st {
unsigned int cid;
char ime[25] ;
char prezime [25];
char adresa [128];
char brtel [10] ;
char brlk [10] ;
struct cl_st *next;
} clan;

e sada, zelim da formiram stack, tj. jednostavnu povezanu listu.

kada uradim sljedece
clan *clan_s=NULL;

clan_s = (clan *)malloc( sizeof(clan));
clan->ime = "neki tekst";

dobijem gresku da nije Lvalue. zasto?
ps:dalje nisam pisao, formiranje liste sa push i to, jer ne razumjem zasto ovo ne radi?
[ Sardon @ 14.11.2004. 16:55 ] @
Poslednji red
clan_s->ime = "neki tekst";
[ BoLa @ 14.11.2004. 17:08 ] @
Uh izvinjavam se, tako mi i pise u programu nisam dobro napisao u postu:
clan_s->ime = "tekst";

ali stvar ne funkcionise!?
[ caboom @ 14.11.2004. 17:55 ] @
tako se ne prave aeroplani... u ovom slucaju bi radilo:

memcpy(clan_s->ime, "neki tekst\0", 11);

u principu je nespretno drzati char buffer-e fixne velicine u strukturi, ali ako vec to moras da radis pazi da uvek ostavis prostora za jedan \0 i pazi na velicinu buffer-a i teksta koji u njega kopiras, posto ako budes kompajlirao kod sa nekim optimizacijama, lako bi moglo da se desi da takav overrun utice na rad aplikacije (da ne ulazimo u pricu o security-u, blah, blah), posto ce alocirani page-ovi biti sabijeni - sto moze rezultovanti nasty memory access problemima koji mogu biti veoma problematicni za debagovanje.
[ Milos Stojanovic @ 14.11.2004. 18:01 ] @
ili strcpy, gde nije potrebno da specificiraš dužinu stringa, već on kopira do prvog terminating ('\0') znaka. Mada i kod ovog važe iste napomene koje ti je i caboom dao.
[ caboom @ 14.11.2004. 18:49 ] @
ja bih ipak zaobilazio strcpy... strncpy je bolji izbor posto nece kopirati vise od N bajtova, ali je opet prilicno bitno baratati sa \0-ovima kada je bilo sta sa char*-ovima u pitanju, moze ustedeti mnogo glavobolja.
[ BoLa @ 14.11.2004. 18:53 ] @
hvala.

ma u biti ja imam zadatak da napravim neku aplikaciju za biblioteke koja koristit datoteke za smjestanje podataka uz upotrebu jednostruko spregnutih lista. eh sad, ja znam normalno uraditi to sa nizovima struktura bez problema, ali eto oko ovakvih stvari ne znam.

kako biste vi definisali strukturu?

i ah da, to mi je zadatak iz seminarskog :D
[ zvrba @ 15.11.2004. 08:26 ] @
Citat:
caboom: ja bih ipak zaobilazio strcpy... strncpy je bolji izbor posto nece kopirati vise od N bajtova, ali je opet prilicno bitno baratati sa \0-ovima kada je bilo sta sa char*-ovima u pitanju, moze ustedeti mnogo glavobolja.


strncpy je tek nesretan izbor. on pak nekad zapise \0, a nekad ne, ovisno o tome je li mu buffer bio dovoljno velik! UNIX man stranica kaze:

Citat:
The strncpy(3) copies not more than len characters into dst, appending \0 characters if src is less than len characters long, and not terminating dst if src is more than len characters long.
[ caboom @ 15.11.2004. 12:18 ] @
poenta je to da ne treba da prepustas terminisanje stringa nekoj od postojecih stdlibc f-ja, vec da to moras da uradis sam... cisti strcpy je sjajan nacin da napravis buffer overrun.
[ filmil @ 15.11.2004. 13:01 ] @
Citat:
sam... cisti strcpy je sjajan nacin da napravis buffer overrun.
strncpy? A, da, kada je dužina stringa tačno jednaka n, onda ne postavlja NUL na kraj stringa, pa je opet potrebna intervencija.

Hm, čemu li služe uopšte funkcije iz runtime biblioteke?

f

[Ovu poruku je menjao filmil dana 15.11.2004. u 15:18 GMT+1]
[ caboom @ 15.11.2004. 13:44 ] @
da, ali sta se desava ako sa strcpy pregazis buffer? u debug modu cesto nista, ali radosne stvari krecu da se desavaju sa npr. nekim optimizacijama. lakse je rucno zalepiti '\0', nego posle potrositi i nekoliko dana buljenja u debugger-u i raznim purify alatima da bi video sta se tacno desilo, pogotovo ako baratas slozenijim api-em i enkapsulacijama. sve u svemu, divni svet C-a i memorije.
[ BoLa @ 16.11.2004. 13:49 ] @
Da ne bi otvarao novi topic pitat cu na ovome. Zasto u sljedecem kodu, upisuje se posljednji elemenat 2 puta u datoteku!? Naveo sam samo funkcije koje sam napisao za upis i ispis bez main() u kojem ih pozivam ... NIkako da skontam gdje sam pogrijesio ...

struct clanovi
{
int id;
char ime[20];
};


void upisdat(char ime[20])
{
FILE *Dat;
struct clanovi tmpc;

Dat = fopen(ime,"a");
if (Dat !=NULL)
{
puts("ID: ");
scanf("%d",&tmpc.id);
puts("Ime: ");
scanf("%s",&tmpc.ime);
fwrite(&tmpc,sizeof(tmpc),1,Dat);
}
else exit(1);

fclose(Dat);
}

void ispisdat(char ime[20])
{
FILE *Dat;
struct clanovi tmpc;

Dat = fopen(ime,"r");
if (Dat!=NULL)
{
puts("rezultati ispisa");
while (!feof(Dat))
{
fread(&tmpc,sizeof(tmpc),1,Dat);
printf("\n Id %d, ime %s \n",tmpc.id,tmpc.ime);
}
}
fclose(Dat);
}

[ BoLa @ 16.11.2004. 15:43 ] @
Rjeseno ... Skonto. feof sucks