[ 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 ?
[ 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))