[ MaliBatica @ 19.02.2013. 14:36 ] @
Pozdrav svima,imam malu nedoumicu.Nesto proracunavam,pa zelim u c++ da napravim program,sada sam poceo nesto da eksperimentisem i imam nedoumicu.Imam promenljivu i referencu.Njihove adrese treba da su iste,i budu iste kada ih ispitam u int main ,ali kada sam napravio void funkciju za ispitivanje adresa,onda dobijam poruku da su adrese razlicite?Da li bi mi neko objasnio ovo malo poblize o cemu se radi,da li gresim ili ne.

Inace koristim Code::Blocks 10.05

Code (c):
#include <iostream>
#include <cmath>
using namespace std;
void Provera(float x,float y);
int main()
{
    float Q=10;//protok
    float d=0.05;//precnik cevi
    float v;//brzina strujanja fluida
    const float PI=3.14;
    float &refQ=Q;//referenca na metu Q
    v=4*Q*pow(10,-3)/(pow(d,2)*PI);
    cout<<"Protok:\nQ="<<Q<<"[l/s]\nBrzina strujanja fluida:\nv="<<v<<"[m/s]"<<endl;
    cout<<"Vrednost reference na promenljivu protoka Q:\nrefQ="<<refQ<<"[l/s]"<<endl;
    refQ=30;
    v=4*Q*pow(10,-3)/(pow(d,2)*PI);
    cout<<"Nova vrednost reference na promenljivu protoka Q:\nrefQ="<<refQ<<"[l/s]"<<endl;
    cout<<"Novi protok:\nQ="<<Q<<"[l/s]\nNova brzina strujanja fluida:\nv="<<v<<"[m/s]"<<endl;
    Provera(Q,refQ);
    cout<<"Adrese iz main:\n"<<"&Q:"<<&Q<<"\n&refQ:"<<&refQ<<endl;
    if(&Q==&refQ)
    {
        cout<<"Adrese u main iste."<<endl;
    }
    else
    {
        cout<<"Adrese u main razlicite."<<endl;
    }
    return 0;
}
void Provera(float x,float y)
{
    if(&x==&y)
    {
        cout<<"Iste adrese.\n"<<"&x:"<<&x<<"\n&y:"<<&y<<endl;
    }
    else
    {
        cout<<"Razlicite adrese.\n"<<"&x:"<<&x<<"\n&y:"<<&y<<endl;
    }
}


[Ovu poruku je menjao Mihajlo Cvetanović dana 19.02.2013. u 16:00 GMT+1]
[ djoka_l @ 19.02.2013. 14:55 ] @
Grešiš jer ne razumeš mehanizam prenosa parametara.

Deklarisao si promenljivu Q i dodelio si joj vrednost 10. Adresa na kojoj je smeštena vrednost Q je, na primer 64.
Deklarisao si &refQ. Njena adresa je, na primer 68, a sadržaj je 64. Dakle, adresa koja pokazuje na memoriju je na adresi 68, a vrednost je 64.


Kada u main testiraš, taad proveravaš da li 64=64 i dobiješ da je to tačno.

Međutim, kada pozoveš funkciju proveri, uradiš sledeće:

Na stek na adresi 20 staviš vrednost 30
Na stek na adresi 24 staviš vrednost 64

Na kraju porediš adresu 20 i adresu 24 kao BROJEVE, a oni nisu isti, tj 20<>24. Da si poredio verdnosti, dobio bi poređenje 30=30 ili da si poredio adrese onda bi dopio 64=64

Code:

$ ./reftest\
>
Protok:
Q=10[l/s]
Brzina strujanja fluida:
v=5.09554[m/s]
Vrednost reference na promenljivu protoka Q:
refQ=10[l/s]
Nova vrednost reference na promenljivu protoka Q:
refQ=30[l/s]
Novi protok:
Q=30[l/s]
Nova brzina strujanja fluida:
v=15.2866[m/s]
Razlicite adrese.
&x:0x28ac20
&y:0x28ac24
Adrese iz main:
&Q:0x28ac64
&refQ:0x28ac64
Adrese u main iste.
$
[ MaliBatica @ 19.02.2013. 16:41 ] @
Citat:
djoka_l: Grešiš jer ne razumeš mehanizam prenosa parametara.

Deklarisao si promenljivu Q i dodelio si joj vrednost 10. Adresa na kojoj je smeštena vrednost Q je, na primer 64.
Deklarisao si &refQ. Njena adresa je, na primer 68, a sadržaj je 64
. Dakle, adresa koja pokazuje na memoriju je na adresi 68, a vrednost je 64.


Kada u main testiraš, taad proveravaš da li 64=64 i dobiješ da je to tačno.

Međutim, kada pozoveš funkciju proveri, uradiš sledeće:

Na stek na adresi 20 staviš vrednost 30
Na stek na adresi 24 staviš vrednost 64

Na kraju porediš adresu 20 i adresu 24 kao BROJEVE, a oni nisu isti, tj 20<>24. Da si poredio verdnosti, dobio bi poređenje 30=30 ili da si poredio adrese onda bi dopio 64=64


Razumem da su Q i refQ dve promenljive,refQ mi je referenca cija je meta Q,i kad npr izmenim vrednost refQ izmenice se i vrednost Q,ja sam to skontao kao vudu lutkica.A znam da je pokazivac promenljiva,koja cuva adresu neke druge promenljive,ali ja ih ovde nisam koristio.Q i refQ su na razlicitim adresama to sam razumeo.

Ovo sam crveno podvuceno odmah skontao cim sam procitao poruku i shvatio deo greske.

Ovo plavo podvuceno ne razumem zasto ne poredjenje 30 sa 64 pa da mi javi da gresim?

Hvala ti na ovako brzim odgovorom.