Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Prosledjivanje reference (upucivaca)

[es] :: .NET :: Prosledjivanje reference (upucivaca)

Strane: 1 2

[ Pregleda: 8376 | Odgovora: 28 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

NrmMyth
Ivan Maček
Split

Član broj: 63456
Poruke: 849
*.cmu.carnet.hr.

Sajt: www.dump.hr


Profil

icon Re: Prosledjivanje reference (upucivaca)19.09.2006. u 15:34 - pre 214 meseci
Bitno je naglasiti da pass-by-reference ustvari ne postoji.
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Prosledjivanje reference (upucivaca)19.09.2006. u 20:46 - pre 214 meseci
Citat:
NrmMyth: Bitno je naglasiti da pass-by-reference ustvari ne postoji.


Sad te ja nisam razumeo, kako mislis ne postoji?
Itekako postoji samo je implicitno, tu je glavni problem, moras da znas koje je vrste tip da bi znao da li je byref ili byval. Sintaksni oblik je identican, ali kompajler "vara" i na osnovu tipa odredjuje default pozivanje.
Ono sto ne postoji u .NET-u je u stvari pass-by-value referentnih tipova.

Code:


// pass-by-value za value type
C/C++ : void F1(int p)
C#    : void F1(int p)

// pass-by-value za reference type
C/C++ : void F1(Klasa p)
C#    : ne postoji

// pass-by-reference za value type
C/C++ : void F1(int* p)
C#    : void F1(ref int p)

// pass-by-reference za reference type
C/C++ : void F1(Klasa* p)
C#    : void F1(Klasa p)

// ovo ne znam ni kako bih nazvao tacno sem pointer na pointer :) :)
C/C++ : void F1(Klasa** p)
C#    : void F1(ref Klasa p)

// jos jedna stvar koja ne postoji u .NETu
C/C++ : void F1(Klasa*** p)




kao sto se vidi, c/c++ kompajler pravi razliku izmedju byref i byval po sintaksi, .NET po tipu koji je koristi.


Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
*.lionbridge.com.



+6 Profil

icon Re: Prosledjivanje reference (upucivaca)19.09.2006. u 20:56 - pre 214 meseci
Ovo što je NrmMyth rekao važi za Javu: http://javadude.com/articles/passbyvalue.htm
Poenta je da kad pozivaš metod u Javi, ne prosleđuješ objekat po referenci, već referencu po vrednosti :)

Ali kod .NET-a možeš da proslediš parametre i po vrednosti i po referenci (ref keyword) http://www.yoda.arachsys.com/csharp/parameters.html
 
Odgovor na temu

Zevs85
Zeljko Todorovic
Novi Sad, Sabac

Član broj: 24612
Poruke: 325
213.244.197.*



+21 Profil

icon Re: Prosledjivanje reference (upucivaca)19.09.2006. u 23:55 - pre 214 meseci
Citat:
mmix:
Code:


// pass-by-value za value type
C/C++ : void F1(int p)
C#    : void F1(int p)

// pass-by-value za reference type
C/C++ : void F1(Klasa p)
C#    : ne postoji

// pass-by-reference za value type
C/C++ : void F1(int* p)
C#    : void F1(ref int p)

// pass-by-reference za reference type
C/C++ : void F1(Klasa* p)
C#    : void F1(Klasa p)

// ovo ne znam ni kako bih nazvao tacno sem pointer na pointer :) :)
C/C++ : void F1(Klasa** p)
C#    : void F1(ref Klasa p)

// jos jedna stvar koja ne postoji u .NETu
C/C++ : void F1(Klasa*** p)




kao sto se vidi, c/c++ kompajler pravi razliku izmedju byref i byval po sintaksi, .NET po tipu koji je koristi.


U c/c++
Code:

C/C++ : void F1(int* p)

pored prenosa objekta po referenci postoji i
Code:

C/C++ : void F1(int& p)

prenos reference objekta.
@Dragi Tata Na ovo si mislio?
 
Odgovor na temu

NrmMyth
Ivan Maček
Split

Član broj: 63456
Poruke: 849
*.cmu.carnet.hr.

Sajt: www.dump.hr


Profil

icon Re: Prosledjivanje reference (upucivaca)20.09.2006. u 14:39 - pre 214 meseci
Izvinjavam se na konfuziji. :)

Mislio sam reci da kod pass-by-ref se dogodi pass-by-val pokazivaca, odnosno da se svaki pass-by-ref svodi na pass-by-val (njegovog pokazivaca).

Citat:
mmix:
// pass-by-value za reference type
C/C++ : void F1(Klasa p)
C# : ne postoji[/code]

Dali to znaci da gornji izraz nece biti vidljiv van C++/CLI assemblya? Pretpostavljam da da.
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Prosledjivanje reference (upucivaca)20.09.2006. u 16:02 - pre 214 meseci
Citat:
NrmMyth
Dali to znaci da gornji izraz nece biti vidljiv van C++/CLI assemblya? Pretpostavljam da da.


Nece se videti, bice prisutan u metadata, u npr. ovakvoj formi:

Code:

public int Test2(Class1 modreq(IsByValue) test)


C# i VB.NET kompajleri ne znaju kako da consume ovaj parametar i jednostavno ignorisu metod. Najgore je sto ni sam C++ ne moze da generise ovaj poziv, ne mozes cak ni da ga prevaris na jeftinu foru :

Code:

    public ref class Class1
    {
    public:
        int Test2(Class1 test)
        {
            return 0;
        }

        int TestXXX()
        {
            return Test2(*this);
        }
    }


Dobijes bizarnu gresku (stvarno bi mogli da stave neku smisleniju):
cannot convert parameter 1 from 'Libcpp::Class1' to 'Libcpp::Class1'

Stari C++ (2003) mislim da cak nije ni dozvoljavao da bilo gde deklarises managed (__gc) klasu kao pass-by-value (requires toplevel *), cak iako si planirao da je zoves iz C++-a. Sad bar mozes da deklarises, ali ne vidim nacin kako bi mogao da je pozoves

Sve to ima smisla (inace bi to znacilo da CLR kreira shallow copy objekta na steku, i ode GC )




Citat:
Zevs85: U c/c++
Code:

C/C++ : void F1(int* p)

pored prenosa objekta po referenci postoji i
Code:

C/C++ : void F1(int& p)

prenos reference objekta.


F1(int* p) i F1(int& p) su gotovo identicni po pozadinskom funkcionisanju. Razlika je samo sto int& stiti prenesenu referencu (pointer) od promene (const int* p).
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

Zevs85
Zeljko Todorovic
Novi Sad, Sabac

Član broj: 24612
Poruke: 325
*.vdial.verat.net.



+21 Profil

icon Re: Prosledjivanje reference (upucivaca)22.09.2006. u 14:43 - pre 214 meseci
@mmix
Citat:
F1(int* p) i F1(int& p) su gotovo identicni po pozadinskom funkcionisanju. Razlika je samo sto int& stiti prenesenu referencu (pointer) od promene (const int* p).


Hoces da kazes da je isto (const int *p) i (int &p)? Nadam se da ne, posto to nije tacno...

Code:
void f(int &p){              //ovo je ok
  p=6;
}

void f(const int *p){     //ovo nece da valja, kompajler prijavljuje gresku
  *p=6;
}
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
*.lionbridge.com.



+6 Profil

icon Re: Prosledjivanje reference (upucivaca)22.09.2006. u 15:08 - pre 214 meseci
Citat:
Zevs85: @mmix


Hoces da kazes da je isto (const int *p) i (int &p)? Nadam se da ne, posto to nije tacno...



Ne (const int* p), nego (int* const p) - lepote C-a, hehehe...

Inače, evo šta sam hteo da kažem. Uzimam C++ jer jedino on podržava sve varijante o kojima pričam:

Code:


void f(string a, string& b, string* c, string*& d);



Ovde je a string objekat i prenosi se po vrednosti, tj funkcija dobija kopiju objekta.
b je referenca na objekat i funkcija dobija kopiju reference koja pokazuje na isti objekat.
c je pointer na objekat i funkcija dobija kopiju pointera koja pokazuje na isti objekat. Ako unutar funkcije uradiš nešto blesavo kao što je c--, to će da se odrazi samo na kopiju pointera unutar funkcije.
d je referenca na pointer na objekat :) U ovom slučaju prosleđujemo funkciji pointer po referenci i ako napravimo d-- to će da izmeni i originalni pointer iz poziva.

E sad, pošto je ovo ipak .NET forum, u C#u bi to bilo nekako ovako:

Code:


struct NekiValueType {...}
class  NekiRefType {...}

public void f(NekiValueType a, ref NekiValueType b, NekiRefType c, ref NekiRefType d){...}



Ovde je bitno istaći da d može da se promeni da pokazuje na drugi objekat i da to bude vidljivo iz koda koji je pozvao metod f, dok ako to uradiš sa c, promena je vidljiva samo lokalno u metodu f.


 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Prosledjivanje reference (upucivaca)22.09.2006. u 15:55 - pre 214 meseci
Citat:
Zevs85: Hoces da kazes da je isto (const int *p) i (int &p)? Nadam se da ne, posto to nije tacno...


iskucano u brzini, sorry. Vidim da je dragi tata vec okacio ispravku, pa da ne ponavljam.
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

[es] :: .NET :: Prosledjivanje reference (upucivaca)

Strane: 1 2

[ Pregleda: 8376 | Odgovora: 28 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.