Search
 
 
  Engleski
 
 
 
Open in this window (click to change)
Forum@DeGiorgi: Početna
Forum za podršku nastavi na PMF-MO
Login Registracija FAQ Smajlići Članstvo Pretražnik Forum@DeGiorgi: Početna

Prijenos po vrijednosti i prijenos po adresi
WWW:

Moja sarma
 
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji 1. godine, preddiplomski studij Matematika -> Programiranje 1 i 2
Prethodna tema :: Sljedeća tema  
Autor/ica Poruka
vsego
Site Admin
Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09)
Postovi: (3562)16
Spol: zombi
Sarma = la pohva - posuda
854 = 1068 - 214
Lokacija: /sbin/init

PostPostano: 20:23 ned, 12. 2. 2006    Naslov: Prijenos po vrijednosti i prijenos po adresi Citirajte i odgovorite

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... Confused

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. Sad 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. Shocked Provjerite u vjezbama zasto (previse pisanja i crtanja da to sada ovdje objasnjavam). Cool

Ovo mozete rijesiti na dva nacina:

  1. 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! Very Happy
    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. Cool

  2. 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. Cool 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". Cool
    Takodjer, pri pozivu funkcije treba paziti da posaljete adrese varijabli, a ne vrijednosti. Eh? 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. Very Happy

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. Very Happy Ta dva zapisa su sinonimi. Drzim prodike Bitno je jedino da je x pointer na neku strukturu koja sadrzi varijablu y. Smile

P.P.S. A sad brzo karma++ od svih kojima je ovo pomoglo. Mr Green being very Greeen indeed



_________________
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.
Drzim prodike
[Vrh]
Korisnički profil Pošaljite privatnu poruku
mdoko
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 30. 11. 2002. (22:17:12)
Postovi: (71A)16
Spol: muško
Sarma = la pohva - posuda
199 = 237 - 38
Lokacija: Heriot-Watt University, Edinburgh

PostPostano: 22:31 ned, 12. 2. 2006    Naslov: Re: Prijenos po vrijednosti i prijenos po adresi Citirajte i odgovorite

[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]
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...



_________________
Extraordinary claims require extraordinary evidence. – Carl Sagan
[Vrh]
Korisnički profil Pošaljite privatnu poruku Posjetite Web stranice
vsego
Site Admin
Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09)
Postovi: (3562)16
Spol: zombi
Sarma = la pohva - posuda
854 = 1068 - 214
Lokacija: /sbin/init

PostPostano: 22:49 ned, 12. 2. 2006    Naslov: Re: Prijenos po vrijednosti i prijenos po adresi Citirajte i odgovorite

[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)! Very Happy

Naglasio sam adresu, zato jer se to radi u ovom drugom nacinu, kad saljes pointer. Wink

Ali, imas pravo - treba oboje naglasiti. Cool

Hvala! Very Happy



_________________
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.
Drzim prodike
[Vrh]
Korisnički profil Pošaljite privatnu poruku
mdoko
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 30. 11. 2002. (22:17:12)
Postovi: (71A)16
Spol: muško
Sarma = la pohva - posuda
199 = 237 - 38
Lokacija: Heriot-Watt University, Edinburgh

PostPostano: 22:55 ned, 12. 2. 2006    Naslov: Re: Prijenos po vrijednosti i prijenos po adresi Citirajte i odgovorite

[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.
vsego (napisa):

Ma, ni vrijednost ni adresu, nego bas nju (varijablu)!

Kotacici rade 100 na sat e, sad si me malo zbunio, kako to ti mislis prenosit bas varijablu? Please daj primjer nekog jezika koji to radi.



_________________
Extraordinary claims require extraordinary evidence. – Carl Sagan
[Vrh]
Korisnički profil Pošaljite privatnu poruku Posjetite Web stranice
vsego
Site Admin
Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09)
Postovi: (3562)16
Spol: zombi
Sarma = la pohva - posuda
854 = 1068 - 214
Lokacija: /sbin/init

PostPostano: 0:06 pon, 13. 2. 2006    Naslov: Re: Prijenos po vrijednosti i prijenos po adresi Citirajte i odgovorite

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

Kotacici rade 100 na sat 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). Cool

Ovo sa "&" je sintaxa koja navodno radi u nekom C-ovskom compileru, ali nemam blage kojem. Confused



_________________
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.
Drzim prodike
[Vrh]
Korisnički profil Pošaljite privatnu poruku
mdoko
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 30. 11. 2002. (22:17:12)
Postovi: (71A)16
Spol: muško
Sarma = la pohva - posuda
199 = 237 - 38
Lokacija: Heriot-Watt University, Edinburgh

PostPostano: 0:29 pon, 13. 2. 2006    Naslov: Re: Prijenos po vrijednosti i prijenos po adresi Citirajte i odgovorite

[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). Cool

Nije pointer, zato se i zove referenca.

Citat:

Ovo sa "&" je sintaxa koja navodno radi u nekom C-ovskom compileru, ali nemam blage kojem. Confused

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]
Korisnički profil Pošaljite privatnu poruku Posjetite Web stranice
Prethodni postovi:   
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji 1. godine, preddiplomski studij Matematika -> Programiranje 1 i 2 Vremenska zona: GMT + 01:00.
Stranica 1 / 1.

 
Forum(o)Bir:  
Ne možete otvarati nove teme.
Ne možete odgovarati na postove.
Ne možete uređivati Vaše postove.
Ne možete izbrisati Vaše postove.
Ne možete glasovati u anketama.
You cannot attach files in this forum
You can download files in this forum


Powered by phpBB © 2001, 2002 phpBB Group
Theme created by Vjacheslav Trushkin
HR (Cro) by Ančica Sečan