[ RooTeR @ 16.03.2006. 22:20 ] @
ako imam sledeci deo koda :

void funk(vectr<int> t){ ... }

void main(){
vector<int> tmp;
...
funk(tmp);
...
}


Da li ce se ceo vektor prenositi kao argument (znachi po vrednosti), ili samo referenca na njega?
[ Mali Misha @ 16.03.2006. 22:35 ] @
Mislim da ce ovo napraviti kopiju celog vektora (ukljucujuci sve vrednosti u njemu) u f-ji funk.

Ako hoces prenos po referenci:
void funk(vector<int>&t){ ... }

A ako zelis da se osiguras da elementi nece biti menjani:
void funk(const vector<int>&t){ ... }
[ IvanBeograd @ 02.04.2006. 22:56 ] @
Ja sam mislio da se u C-u argumenti prenose samo po vrednosti,i nikako vise ???
Moze neki mali kratki gotov primer ako je drugacije,ako se ne prenose samo po vrednosti !!!
Hvala puno,poz!
[ idb @ 03.04.2006. 09:39 ] @
Evo pogledaj ovaj primer
Code:

// Dev-Cpp 4.9.9.2 with Mingw/GCC 3.4.2
#include <stdio.h>
#include <string.h>

/* swap(int *a, int *b) : prosledjene adrese argumenata 
   doci ce do promene vrednosti (i,j) van funkcije */
void swap(int *a, int *b){
    int c = *a;
    *a = *b;
    *b = c;
};

/* swap(int a, int b) :  prave se lokalne kopije argumeta,
   pa vrednosti (i,j) van funkcije ostaju nepromenjeni */
void nije_swap(int a, int b){
    int c = a;
    a = b;
    b = c;
};

int main (){
    int i = 2, j = 5;
    printf("Pre poziva: i = %d,  j = %d\n", i,j);
    swap(&i,&j);
    printf("\nPosle poziva swap(): i = %d,  j = %d\n", i,j);
    nije_swap(i,j);
    printf("\nPosle poziva nije_swap(): i = %d,  j = %d\n", i,j);
    system("pause");
    return 0;
}

idb
[ IvanBeograd @ 03.04.2006. 11:29 ] @
Ma to znam i ja,to nije promena vrednosti,to je samo maska!
Ipak se u c argumenti prosledjuju samo po vrednosti!
Hvala sve jedno na odgovoru!Pozzz
[ [email protected] @ 04.04.2006. 13:59 ] @
Ne, nije to nikakava maska, nego u funkciju prosljedjujes gotovu vrijednost ili pointer.

Ako imas int a = 5 i pozoves funkciju kojoj je ulazni argument varijabla a, sve operacije koje ti radis sa tom varijablom a unutar funkcije su vidljive samo unutar scopea te funkcije, zato sta pri pozivu se kopira vrijednost varijable iz maina, pa se radi samo sa tom vrijednosti. Nakon izlaza iz funkcije, varijabla a je netaknuta u mainu, makar ti radio cuda s njom.

Ako prosljedis pointer u funkciju, baratas sa memorijskom adresom na koju taj pointer pokazuje. Tako ako prosljedis pointer koji gleda na memorijsku adresu varijable a iz maina, ti radis sa memorijskim mjestom na kojem stoji varijabla a, tako da svaka promjena koju napravis u funkciji je vidljiva i u drugim scopeovima.

Simple as that...
[ Mali Misha @ 27.04.2006. 00:38 ] @
A meni sad nije ni jasno zasto je ovo smesteno pod C za pocetnike.
Offtopic je mogao 'ladno da ide kao zasebna tema.
[ NrmMyth @ 27.04.2006. 17:36 ] @
doci ce moderatori pa ce obrisati ovaj moj post, taj tvoj i prebaciti temu u "C++ za pocetnike"
[ n1tr0 @ 29.04.2006. 03:52 ] @
Citat:
[email protected]:
Ne, nije to nikakava maska, nego u funkciju prosljedjujes gotovu vrijednost ili pointer.


1) Kada se f-ja poziva ne prosledjuje se pointer vec adresa promenljive.
2) Ne prosledjuje se f-ji, vec na stek, a f-ja to preuzme sa steka i smesti u odgovarajucu promenljivu(u ovom slucaju pokazivac).

Verovatno si mislio na ovo: u f-ju se parametri prenose po vrednosti(od kojih se prave kopije na steku i kada ih menjamo u f-ji to ne utice na one originalne promenljive) ili po referenci(na stek se prosledjuju adrese promenljivih i zbog toga kada ih preko pokazivaca obradjujemo ustvari radimo sa originalima, i svaka promena parametara unutar f-je izaziva promenu originala).

[Ovu poruku je menjao n1tr0 dana 29.04.2006. u 04:57 GMT+1]