[ TrinitI @ 17.03.2001. 19:47 ] @
Kako se kreiraju doticne ? I kako da upisujem tj citam iz njih ? Auu koliko ja pitanja postacih na ovom forumu ? |
[ TrinitI @ 17.03.2001. 19:47 ] @
[ Vojislav Milunovic @ 17.03.2001. 21:13 ] @
Pa definisu se sa
struct imestrukture{ tippodatka ime; }; evo i primer struct player{ char *name; int visina; int tezina; }; kreiras objekat (navika mi ostala iz C++) player predator; predator.name="voja"; predator.visina=187; predator.tezina=87; Ako ovo koristis kao pinter onda -> player *preda = & predator; printf(" Ime : %s\n",preda->name); printf(" visina : %d\n",preda->visina); printf(" tezina : %d\n",preda->tezina); [ Mikky @ 17.03.2001. 21:44 ] @
cekaj struktura je isto sto i klasa samo sto kod kod klase su ti unutrasnje promenljive i funkcije private po defaultu a kod struct su public? ili obrnuto???
zasto si pointer ka char name a ne jednostavno char name?? [ Vojislav Milunovic @ 18.03.2001. 09:33 ] @
Clanovi klase mogu da budu private,protected i public ->
public moze da menja svako i bilo otkud protected -> moze da menja izvedena klasa i cale klasas (heh terminologija fork()) private -> mogu da menjaju samo funkcije clanice te klase gde su private definisani char *name sam stavio jer bi char name alociralo mesto za 1 bajt a char *-u mozes da pridodas adresu nekog stringa koji se nalazi u memoriji -> struct player *preda = {"predator",187,87}; a sa char name -> struct player *preda1 = { 0x41,187,87}; i sad bi char name imalo A :o) [ Mikky @ 18.03.2001. 22:09 ] @
aha, nisam znao da to moze
ql fora [ Vojislav Milunovic @ 19.03.2001. 09:23 ] @
Pa moras da pravis razliku izmedju
char char [] char * char je alociranje jednog byte na stacku ili u data segmentu programa char [] je alociranje niza bajtova na stacku ili u datan segmentu programa char * je pointer i samim tim alocira 4 byte za 32bitnu adresu... primena : char pa sta zanm recimo zqa ispisivanje svih znakovao od 0 - 255 char [] se cesto koristi kao char niz[]="predator"; i samim tim se alocira memorija na stacku dovoljno velika da sacuva rec predator moze i char niz[1024] ali onda sa njim pri predavanju funkciji i koriscenju u programu manipulises slicno kao sa pointerom :o) Code: char gg[1024]; gg="predator"; //pogresno !!!!!!!!!!!! strcpy(gg,"predator"); //ispravno i char * se koristi na dva nacina -> char *preda="predator"; char *preda=malloc(200); bzero(preda,200); prvo pointeru dodeljuje adresu od pocetka stringa predator u data segmentu a drugo alocira 200 byte i pocetak dodeljuje pointeru preda...ima jos primena ali ove su najvaznije ... [ Mikky @ 19.03.2001. 21:53 ] @
Citat: predator wrote: Code: char gg[1024]; gg="predator"; //pogresno !!!!!!!!!!!! [b]ok ali ovo je sasvim legalan iskaz zar ne?? samo sto ce se prvih 8 mesta plus null karakter u nizu popuniti a ostalih 1015 ostati prazno[/b] strcpy(gg,"predator"); //ispravno strcpy je neka funkcija iz nekog headera? kakva je razlika izmedju toga sto ona radi i onoga sto si napisao gore, zar nece u oba slucaja da se popuni prvih 9 mesta niza a ostalo da ostane prazno ok a koja je razlika izmedju definisanja na staku i u memoriji (data segmentu), zar nije bolje to raditi u memoriji jer je stak ogranicen tj dosta manji od raspolozive memorije, i sta radi kompajler po defaultu, da li stavlja na stak ili ds [ Vojislav Milunovic @ 20.03.2001. 08:21 ] @
[quote]Mikky wrote:
[quote]predator wrote: Code: char gg[1024]; gg="predator"; //pogresno !!!!!!!!!!!! [b]ok ali ovo je sasvim legalan iskaz zar ne?? samo sto ce se prvih 8 mesta plus null karakter u nizu popuniti a ostalih 1015 ostati prazno[/b] [quote] Pazi ovako-> ovo "predator" se nece predati kao "predator" vec kao adresa gde je ovaj string sacuvan u data semgmentu programa i samim tim se tebi javlja greska kod kompajliranja :o) Citat: strcpy(gg,"predator"); //ispravno strcpy je neka funkcija iz nekog headera? kakva je razlika izmedju toga sto ona radi i onoga sto si napisao gore, zar nece u oba slucaja da se popuni prvih 9 mesta niza a ostalo da ostane prazno strcpy() funckija je standardna C funkcija za rad sa stringovima i njena deklaracija se nalazi u string.h...njen oblik je ovakav -> extern char *strcpy(char *dst,const char *src); Kao sto vidis prihvata dva pointera i zatim posle prostim movl + cmp kopira bajtove iz jednog stringa u drugi dok u prvom stringu ne naidje na \0; a kompajler sam odradi da se i gg[1024] i "predator" predaju adrese od njihovog pocetka... Citat: ok a koja je razlika izmedju definisanja na staku i u memoriji (data segmentu), zar nije bolje to raditi u memoriji jer je stak ogranicen tj dosta manji od raspolozive memorije, i sta radi kompajler po defaultu, da li stavlja na stak ili ds Sve zavisi kako ti definises promenljive.Ako su lokalne one idu na stack ako su globalne idu u data semgent programa.Stack ti nije mnogo ogranicen...ja mislim da je oko 0x2000 byte po porgramu ne znam tacno...napravi prost program koji jede stack i kad padne dobio si kranju vrednost -> Code: int main(){ int gg; <------ neki blizi pocetak; void *addr; printf("%p\n",&gg); for (;;){ printf("%p\n",addr); _asm__("subl $0x1,%%esp \n" "movl %%esp,%0 \n":"=r"(addr)); } } i saces imati ceo stack koji se smanjuje dok ne naletis na SIGSEGV pa oduzmi od prve vrednosti poslednju i to je to:o) Inace stack je veoma dobar i koristan sa njim mozes mnoooogo stvari da uradis...recimo sa funkcijom alloca() alociras podatke na stacku(kao malloc za heap) i kad zavrsis sa funkcijom u kojoj je alloca pozvano nemoras da pozivas free() jel se meorija sama vraca stacku(zbog onog prolog i epilog(valjda se vako zove) :o)) Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|