Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 28 odgovora
  • 11.172 pregleda

Najnovija ↓

Re: Prosledjivanje reference (upucivaca) 19.09.2006. u 21:46 · pre 244 meseca #22
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.

Potpis
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ć
Re: Prosledjivanje reference (upucivaca) 19.09.2006. u 21:56 · pre 244 meseca #23
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
Potpis
IOCC
Re: Prosledjivanje reference (upucivaca) 20.09.2006. u 00:55 · pre 244 meseca #24
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?
Re: Prosledjivanje reference (upucivaca) 20.09.2006. u 15:39 · pre 244 meseca #25
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.
Re: Prosledjivanje reference (upucivaca) 20.09.2006. u 17:02 · pre 244 meseca #26
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).
Potpis
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ć
Re: Prosledjivanje reference (upucivaca) 22.09.2006. u 15:43 · pre 244 meseca #27
@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;
}
Re: Prosledjivanje reference (upucivaca) 22.09.2006. u 16:08 · pre 244 meseca #28
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.

Potpis
IOCC
Re: Prosledjivanje reference (upucivaca) 22.09.2006. u 16:55 · pre 244 meseca #29
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.
Potpis
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ć
Odgovori
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme