Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
vsego Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3562)16
Spol: 
Lokacija: /sbin/init
|
Postano: 20:23 ned, 12. 2. 2006 Naslov: Prijenos po vrijednosti i prijenos po adresi |
|
|
Dobih par pitanja u mail i u PM, pa da razjasnim i ovdje... :?
Kad zelite da vam funkcija vrati neku vrijednost u glavni program, to lako izvedete preko [tt]return[/tt], npr.
[code:1]funkcija povecaj_vrijednost_broja_za_17(int i) {
return i + 17;
}
x = 1;
x = povecaj_vrijednost_broja_za_17(x);
printf(x); // ispisuje 18[/code:1]
No, kad zelite to napraviti s dvije varijable, onda ne ide preko [tt]return[/tt]. :( Konkretno, [b]ovo NECE RADITI:[/b]
[code:1]funkcija povecaj_vrijednosti_dva_broja_za_17(int a, int b) {
return a + 17, b + 17;
}[/code:1]
Takodjer, [b]NE MOZE ni ovo[/b]:
[code:1]funkcija povecaj_vrijednosti_dva_broja_za_17(int a, int b) {
a = a + 17;
b = b + 17;
printf(a, b);
}
x = 1; y = 2;
povecaj_vrijednost_broja_za_17(x, y);
printf(x, y);[/code:1]
Prvi [tt]printf()[/tt] (u funkciji) ce ispisati [tt]18 19[/tt], ali drugi (onaj u glavnom programu) ce ispisati [tt]1 2[/tt]. :shock: Provjerite u vjezbama zasto (previse pisanja i crtanja da to sada ovdje objasnjavam). 8)
Ovo mozete rijesiti na dva nacina:[list=1]
[*][color=green][b]Prvi nacin:[/b][/color]
[code:1]funkcija povecaj_vrijednosti_dva_broja_za_17(int &a, int &b) {
a = a + 17;
b = b + 17;
printf(a, b);
}
x = 1; y = 2;
povecaj_vrijednost_broja_za_17(x, y);
printf(x, y);[/code:1]
Pazite na deklaraciju:
[tt]funkcija povecaj_vrijednosti_dva_broja_za_17(int [color=red]&[/color]a, int [color=red]&[/color]b)[/tt]
Ovo "[color=red]&[/color]a" znaci "prenesi mi tu varijablu po adresi"; ne njenu adresu, nego bas nju! :D
Na primjer:
[code:1]funkcija ime(int &a) { ... }
b = ...;
ime(b)[/code:1]
Unutar funkcije [tt]ime[/tt], varijabla [tt]a[/tt] je ista varijabla (ista "kucica u memoriji") kao i varijabla [tt]b[/tt] iz glavnog programa. 8)
[*][color=green][b]Drugi nacin:[/b][/color]
[code:1]funkcija povecaj_vrijednosti_dva_broja_za_17(int *a, int *b) {
*a = *a + 17;
*b = *b + 17;
printf(*a, *b);
}
x = 1; y = 2;
povecaj_vrijednost_broja_za_17(&x, &y);
printf(x, y);[/code:1]
Dakle, radi se tako da sami prenosite adrese (pointere, pokazivace; sve je to manje-vise isto) u funkciju. 8) Pri tome pazite da ona zvjezdica mora ici [b]svuda[/b] u funkciji, jer [tt]a[/tt] vise nije broj nego "pointer (pokazivac) na mjesto u memoriji gdje se nalazi broj". 8)
Takodjer, pri pozivu funkcije treba paziti da posaljete adrese varijabli, a ne vrijednosti. :-s Dakle:
[tt]povecaj_vrijednost_broja_za_17([color=red]&[/color]x, [color=red]&[/color]y);[/tt]
a [b]NE[/b]
[tt]povecaj_vrijednost_broja_za_17(x, y);[/tt][/list:o]
Nadam se da je sada ovo donekle jasnije. :D
P.S. Ako imate pointer [tt]x[/tt] na neku strukturu koja sadrzi varijablu [tt]y[/tt], onda umjesto
[tt](*x).y[/tt]
mozete slobodno pisati
[tt]x->y[/tt]
bez obzira je l' to lista ili ne. :D Ta dva zapisa su [b]sinonimi[/b]. :prodike: Bitno je jedino da [color=red]je [tt]x[/tt] pointer na neku strukturu koja sadrzi varijablu [tt]y[/tt][/color]. :)
P.P.S. A sad brzo [tt]karma++[/tt] od svih kojima je ovo pomoglo. :gg:
Dobih par pitanja u mail i u PM, pa da razjasnim i ovdje...
Kad zelite da vam funkcija vrati neku vrijednost u glavni program, to lako izvedete preko return, npr.
Kod: | funkcija povecaj_vrijednost_broja_za_17(int i) {
return i + 17;
}
x = 1;
x = povecaj_vrijednost_broja_za_17(x);
printf(x); // ispisuje 18 |
No, kad zelite to napraviti s dvije varijable, onda ne ide preko return. Konkretno, ovo NECE RADITI:
Kod: | funkcija povecaj_vrijednosti_dva_broja_za_17(int a, int b) {
return a + 17, b + 17;
} |
Takodjer, NE MOZE ni ovo:
Kod: | funkcija povecaj_vrijednosti_dva_broja_za_17(int a, int b) {
a = a + 17;
b = b + 17;
printf(a, b);
}
x = 1; y = 2;
povecaj_vrijednost_broja_za_17(x, y);
printf(x, y); |
Prvi printf() (u funkciji) ce ispisati 18 19, ali drugi (onaj u glavnom programu) ce ispisati 1 2. Provjerite u vjezbama zasto (previse pisanja i crtanja da to sada ovdje objasnjavam).
Ovo mozete rijesiti na dva nacina:
- Prvi nacin:
Kod: | funkcija povecaj_vrijednosti_dva_broja_za_17(int &a, int &b) {
a = a + 17;
b = b + 17;
printf(a, b);
}
x = 1; y = 2;
povecaj_vrijednost_broja_za_17(x, y);
printf(x, y); |
Pazite na deklaraciju:
funkcija povecaj_vrijednosti_dva_broja_za_17(int &a, int &b)
Ovo "&a" znaci "prenesi mi tu varijablu po adresi"; ne njenu adresu, nego bas nju!
Na primjer:
Kod: | funkcija ime(int &a) { ... }
b = ...;
ime(b) |
Unutar funkcije ime, varijabla a je ista varijabla (ista "kucica u memoriji") kao i varijabla b iz glavnog programa.
Drugi nacin:
Kod: | funkcija povecaj_vrijednosti_dva_broja_za_17(int *a, int *b) {
*a = *a + 17;
*b = *b + 17;
printf(*a, *b);
}
x = 1; y = 2;
povecaj_vrijednost_broja_za_17(&x, &y);
printf(x, y); |
Dakle, radi se tako da sami prenosite adrese (pointere, pokazivace; sve je to manje-vise isto) u funkciju. Pri tome pazite da ona zvjezdica mora ici svuda u funkciji, jer a vise nije broj nego "pointer (pokazivac) na mjesto u memoriji gdje se nalazi broj".
Takodjer, pri pozivu funkcije treba paziti da posaljete adrese varijabli, a ne vrijednosti. Dakle:
povecaj_vrijednost_broja_za_17(&x, &y);
a NE
povecaj_vrijednost_broja_za_17(x, y);
Nadam se da je sada ovo donekle jasnije.
P.S. Ako imate pointer x na neku strukturu koja sadrzi varijablu y, onda umjesto
(*x).y
mozete slobodno pisati
x→y
bez obzira je l' to lista ili ne. Ta dva zapisa su sinonimi. Bitno je jedino da je x pointer na neku strukturu koja sadrzi varijablu y.
P.P.S. A sad brzo karma++ od svih kojima je ovo pomoglo.
_________________ U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju. 
|
|
[Vrh] |
|
mdoko Forumaš(ica)


Pridružen/a: 30. 11. 2002. (22:17:12) Postovi: (71A)16
Spol: 
Lokacija: Heriot-Watt University, Edinburgh
|
|
[Vrh] |
|
vsego Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3562)16
Spol: 
Lokacija: /sbin/init
|
Postano: 22:49 ned, 12. 2. 2006 Naslov: Re: Prijenos po vrijednosti i prijenos po adresi |
|
|
[quote="mdoko"][quote="vsego"]Ovo "[color=red]&[/color]a" znaci "prenesi mi tu varijablu po adresi"; ne njenu [b]adresu[/b], nego bas nju![/quote]
Cini mi se da bi trebalo pisati [i]...ne njenu [b]vrijednost[/b], nego bas nju...[/i][/quote]
Ma, [b]ni vrijednost ni adresu[/b], nego bas nju (varijablu)! :D
Naglasio sam adresu, zato jer se to radi u ovom drugom nacinu, kad saljes pointer. ;)
Ali, imas pravo - treba oboje naglasiti. 8)
Hvala! :D
mdoko (napisa): | vsego (napisa): | Ovo "&a" znaci "prenesi mi tu varijablu po adresi"; ne njenu adresu, nego bas nju! |
Cini mi se da bi trebalo pisati ...ne njenu vrijednost, nego bas nju... |
Ma, ni vrijednost ni adresu, nego bas nju (varijablu)!
Naglasio sam adresu, zato jer se to radi u ovom drugom nacinu, kad saljes pointer.
Ali, imas pravo - treba oboje naglasiti.
Hvala!
_________________ U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju. 
|
|
[Vrh] |
|
mdoko Forumaš(ica)


Pridružen/a: 30. 11. 2002. (22:17:12) Postovi: (71A)16
Spol: 
Lokacija: Heriot-Watt University, Edinburgh
|
|
[Vrh] |
|
vsego Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3562)16
Spol: 
Lokacija: /sbin/init
|
Postano: 0:06 pon, 13. 2. 2006 Naslov: Re: Prijenos po vrijednosti i prijenos po adresi |
|
|
[quote="mdoko"][quote="vsego"]Ma, [b]ni vrijednost ni adresu[/b], nego bas nju (varijablu)![/quote]
:grebgreb: e, sad si me malo zbunio, kako to ti mislis prenosit bas varijablu? Please daj primjer nekog jezika koji to radi.[/quote]
[b]Pascal[/b] (varijabla [tt]y[/tt]):
[code:1]function Ime(x: Integer; var y: Integer);
begin
...
end;[/code:1]
Misli se bas na prijenos po adresi, ali ako kazem da prenosim adresu (a ne "bas varijablu"), onda ce ispasti da je to pointer (sto nije). 8)
Ovo sa "[tt]&[/tt]" je sintaxa koja navodno radi u [i]nekom[/i] C-ovskom compileru, ali nemam blage kojem. :?
mdoko (napisa): | vsego (napisa): | Ma, ni vrijednost ni adresu, nego bas nju (varijablu)! |
e, sad si me malo zbunio, kako to ti mislis prenosit bas varijablu? Please daj primjer nekog jezika koji to radi. |
Pascal (varijabla y):
Kod: | function Ime(x: Integer; var y: Integer);
begin
...
end; |
Misli se bas na prijenos po adresi, ali ako kazem da prenosim adresu (a ne "bas varijablu"), onda ce ispasti da je to pointer (sto nije).
Ovo sa "&" je sintaxa koja navodno radi u nekom C-ovskom compileru, ali nemam blage kojem.
_________________ U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju. 
|
|
[Vrh] |
|
mdoko Forumaš(ica)


Pridružen/a: 30. 11. 2002. (22:17:12) Postovi: (71A)16
Spol: 
Lokacija: Heriot-Watt University, Edinburgh
|
Postano: 0:29 pon, 13. 2. 2006 Naslov: Re: Prijenos po vrijednosti i prijenos po adresi |
|
|
[quote="vsego"][quote="mdoko"]kako to ti mislis prenosit bas varijablu? Please daj primjer nekog jezika koji to radi.[/quote]
[b]Pascal[/b] (varijabla [tt]y[/tt]):
[code:1]function Ime(x: Integer; var y: Integer);
begin
...
end;[/code:1]
[/quote]
AFAIK to sto se u Pascalu desava je prenosenje po referenci. Ako se na to misli pod "bas varijabla", onda OK.
[quote]
Misli se bas na prijenos po adresi, ali ako kazem da prenosim adresu (a ne "bas varijablu"), onda ce ispasti da je to pointer (sto nije). 8)[/quote]
Nije pointer, zato se i zove [i]referenca[/i].
[quote]
Ovo sa "[tt]&[/tt]" je sintaxa koja navodno radi u [i]nekom[/i] C-ovskom compileru, ali nemam blage kojem. :?[/quote]
Cisto sumnjam da se radi o C compileru, ali za C++ compilere naravno da radi, jer C++ ima reference
[code:1]
int a = 5; // varijabla tipa int
int *pa = &a; // pointer na int
int &ra = a; // referenca na int
[/code:1]
Funkcija [tt]swap[/tt] (za npr. tip [tt]int[/tt]) bi u C++u izgledala ovako
[code:1]
void swap(int &a, int &b){
int t = a;
a = b;
b = t;
}
[/code:1]
Ova izjava da stvar radi u nekom C compileru, vjerovatno potjece od nekoga tko misli da je MSVC++ C compiler.
vsego (napisa): | mdoko (napisa): | kako to ti mislis prenosit bas varijablu? Please daj primjer nekog jezika koji to radi. |
Pascal (varijabla y):
Kod: | function Ime(x: Integer; var y: Integer);
begin
...
end; |
|
AFAIK to sto se u Pascalu desava je prenosenje po referenci. Ako se na to misli pod "bas varijabla", onda OK.
Citat: |
Misli se bas na prijenos po adresi, ali ako kazem da prenosim adresu (a ne "bas varijablu"), onda ce ispasti da je to pointer (sto nije).  |
Nije pointer, zato se i zove referenca.
Citat: |
Ovo sa "&" je sintaxa koja navodno radi u nekom C-ovskom compileru, ali nemam blage kojem.  |
Cisto sumnjam da se radi o C compileru, ali za C++ compilere naravno da radi, jer C++ ima reference
Kod: |
int a = 5; // varijabla tipa int
int *pa = &a; // pointer na int
int &ra = a; // referenca na int
|
Funkcija swap (za npr. tip int) bi u C++u izgledala ovako
Kod: |
void swap(int &a, int &b){
int t = a;
a = b;
b = t;
}
|
Ova izjava da stvar radi u nekom C compileru, vjerovatno potjece od nekoga tko misli da je MSVC++ C compiler.
_________________ Extraordinary claims require extraordinary evidence. – Carl Sagan
|
|
[Vrh] |
|
|