[ Predrag Damnjanovic @ 01.08.2001. 22:51 ] @
char *primer (char *parametar) {
parametar="aaaaaa";
return "nesto"; // nije bitno u ovom slucaju
}

int main () {
char *promenljiva1, *promenljiva2;
promenljiva1="bbbbb";
promenljiva2 = primer (promenljiva1);
}

----------------

...i sada promenljiva1 daje "aaaaaaa" !!!!!
Da li je ovo normalno???

Jednom recju, kada se u funkciji izmeni parametar, izmeni se i
promenljiva koja stoji dole u main proceduri.

Samo sto kod mene nije main nego
int WINAPI WinMain()
jer pisem Win32 aplikaciju.
[ kajla @ 01.08.2001. 23:15 ] @
Probaj da ides sa strcpy() umesto sa =.

poz.
[ Vojislav Milunovic @ 04.08.2001. 11:37 ] @
Citat:
zastita je napisao:
Code:

char *primer (char *parametar) {
parametar="aaaaaa";
return "nesto";            // nije bitno u ovom slucaju
}

int main () {
char *promenljiva1, *promenljiva2;
promenljiva1="bbbbb";
promenljiva2 = primer (promenljiva1);
}



Ako sam ja dobro razumeo tebi promenljiva1 posle funkcije primer() pokazuje na "aaaaaaa" ?
Ako je to onda je to GRESKA u kompajleru koji koristis.Zasto ?

POINTER se predaje funkciji da bi se neko mesto u memoriji menjalo,ali mi ne mozemo da promenimo adresu na koju ce pointer da pokazuje.U ovom slucaju se bas to radi.

Na adresi 0x12345678 se nalazi "bbbbbbb" i mi predajemo funkciji adresu da bi eventualno mogli da menjamo ili pristupimo sadrzaju te memorije.Ako se uradi :

pointer = "aaaaaaaaa" pointeru se daje nova vrednost (adresa 0x11223344) i samim tim se menja pointer. To je isto kao da imate int i promenite ga u funkciji ali se on ne menja van te funkcije.
Ispravno bi bilo koriscenje strcpy() koju uzima dve memorijske adrese i kopira sa druge na prvu do pojave "\0" znaka.
Nadam se da smo ovim resili sve probleme?
Tako da Peca-o menjaj taj kompiler koji koristis ;o)
[ Vojislav Milunovic @ 04.08.2001. 11:40 ] @
Ovo menjanje pointer moze samo da vazi dok ta funkcija radi a posle otpada.

Uvek se sadrzaj priomenljive gurne na stack pa se onda poziva funkcija tako da nikakve sanse nema da se promenjen argument u toku funkcije promeni i van nje.
[ Milan Aksic @ 04.08.2001. 12:38 ] @
Eh ja prevideo, da nisi koristio operator dereferenciranja, znaci kao sto kaze preda dodelio novu vrednost. Samo mi je malo cudno to dodeljivanje mesta u memoriji pokazivacu tipa:
char *ptr;
// i sada bez dereferenciranja
ptr = "aaaa"
Kada bi se npr. pravio string onda je ispravno *ptr = "aaaa", i onda ptr pokazuje na prvi karakter, a ovde se dodeljuje memorija ptr = "aaaa", da li tako nesto radi, zar prevodioc ne bi trebalo da prijavi gresku ???
Poz.
[ Vojislav Milunovic @ 04.08.2001. 21:33 ] @
Citat:
passanger je napisao:
Eh ja prevideo, da nisi koristio operator dereferenciranja, znaci kao sto kaze preda dodelio novu vrednost. Samo mi je malo cudno to dodeljivanje mesta u memoriji pokazivacu tipa:
char *ptr;
// i sada bez dereferenciranja
ptr = "aaaa"
Kada bi se npr. pravio string onda je ispravno *ptr = "aaaa", i onda ptr pokazuje na prvi karakter, a ovde se dodeljuje memorija ptr = "aaaa", da li tako nesto radi, zar prevodioc ne bi trebalo da prijavi gresku ???


Ne naime C stringove tipa "aaaaaa" tretira kao memorijsku adresu.Zapravo oni se nalaze negde u DATA segmentu.Kao sto svi znamo string je skup znakova terminiran sa \0.Znaci u ovom slucaje se taj skup znakova(string) smesta u memoriju a pokazivacu se dodeljuje adresa od prvog znaka.

prema tome char *gg="string"; je ispravno za razliku od
char *gg;
*gg = "aaaaaa"; to je greska jel ti sa ovim kazes sledece smesti string "aaaaa" u DATA segment i adresu prebaci na memorijsku lokaciju na koju pokazuje gg (ovde bi trebalo da se prebaci samo poslednji byte adrese posto je intel little endian system ;o)
Sad ne znam koliko je jasno ovo sto sam reko,ali ako ima nekih nejasnoca recite da odma to rascistimo ;o)
[ kajla @ 04.08.2001. 22:42 ] @
pa da treba ici sa strcpy(gg,"string") umesto sa gg="string", jer kao sto rece ti u varijablu stavljas adresu stringa.

poz.


[Ovu poruku je menjao kajla dana 08-04-2001 u 10:44 PM GMT]
[ Vojislav Milunovic @ 06.08.2001. 16:55 ] @
Pa da strcpy sa jedne adrese kopira na drugu do pojave 0x00 znaka tj. \0. A ovo gg="aaaaaa" dodeljuje adres i to je VELIKA RAZLIKA !!!!!!!! Nadam se da smo resili sve probleme sa ovim?
[ Predrag Damnjanovic @ 07.08.2001. 00:11 ] @
Ja koristim Borlandov c/c++ kompaljer 5.5.1, ali onaj free, sto kompajlira se iz komandne linije.
Adresa je ftp://ftpd.borland.com/downloa...ilder/freecommandLinetools.exe - 8mb.

Jel' znas da mi to radi i sa char [], uopste ne mora da bude pointer
[ tOwk @ 07.08.2001. 00:55 ] @
Citat:
zastita je napisao:
Ja koristim Borlandov c/c++ kompaljer 5.5.1, ali onaj free, sto kompajlira se iz komandne linije.
Adresa je ftp://ftpd.borland.com/downloa...ilder/freecommandLinetools.exe - 8mb.

Jel' znas da mi to radi i sa char [], uopste ne mora da bude pointer :)


char[] je u stvari char*, tj. sam niz je tada definisan kao char*, prema tome i tada je pointer.

npr.
Code:

char pera[]="ubiti ga";
char *sima;

sima=pera;


Ovde ce i sima pokazivati na isti string, nikakvih gresaka nema, potpuno ispravan kod. Medjutim, pera[5] je ponekad lepse od *(sima+5), pa se zato i koriste takve oznake.

Toliko.
[ Milan Aksic @ 07.08.2001. 07:30 ] @
Samo bih dodao, mada se mozda podrazumeva, ali radi detaljnog objasnjenja. Ime niza je i sam, konstantni pokazivac na prvi element u njegovom nizu. Jedina razlika izmedju obicnog char* pokazivaca i imena niza je sto, se ime niza ne moze promeniti da pokazuje na nesto drugo osim na prvi element.
Pozdrav.
[ Predrag Damnjanovic @ 07.08.2001. 14:53 ] @
Ne kazem za
char nesto[]
nego za
char nesto[10]

Hoces da kazes da je i to pointer?
Hmmm, postoji li onda tip kao str ili string?
[ tOwk @ 07.08.2001. 15:25 ] @
Da i to je pointer.

A taj tip i jeste tip kao string, a ukoliko ti to ne odgovara, onda ti definisi tvoj tip.

Mozes cak i da napravis Pascal style string, samo u str[0] smesti duzinu, medjutim, onda ces imati problema sa ispisivanjem ovog stringa i slicno. U C-u se neke stvari ne skrivaju od programera (kao sto je to slucaj u Pascalu gde je string u stvari isto niz znakova koji pocinje sa duzinom stringa, a ovakav string moze imati najvecu duzinu od 255 znakova).

Ukoliko ti ne lezi sintaksa C-a, uvek su tu programski jezici viseg nivoa: Perl, Python, Java, ObjectPascal...

Toliko.