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

Pointer i funkcije - problem

[es] :: C/C++ programiranje :: C/C++ za početnike :: Pointer i funkcije - problem

[ Pregleda: 2263 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

sheff

Član broj: 125907
Poruke: 317
62.113.4.*



Profil

icon Pointer i funkcije - problem05.05.2009. u 17:11 - pre 181 meseci
Cilj mi je preusmjeriti pointer sa pocetka niza na neki odabrani clan niza, ali bez upotrebe povratnih vrijendosti funkcije getPok. dakle treba da baratam sa originalnim memorijskim lokacijama podataka iz funkcije main. Sta sad ovde ne valja:

Code:

#include<iostream>
using namespace std;

void unos(int* niz){
    for(int i=0; i<(5); i++){
        cout<<"unesite "<<i+1<<". clan niza: ";
        cin>>niz[i];
    }
}
void ispis(int* niz){
    for(int i=0; i<(5); i++){
        cout<<i+1<<". clan niza je: "<<niz[i]<<endl;
    }
}
void getPok(int* niz, int* pot, int* i){
    
        cout<<"unesite clan niza na koji zelite usmjeriti pokazivac";
        cin>>*i;
        cout<<*pot<<" --- "<<pot<<endl;
        cout<<niz[((*i)-1)]<<" a1 "<<&niz[((*i)-1)]<<endl;
        pot=&niz[((*i)-1)];
        cout<<*pot<<" a2 "<<pot<<endl;
}

void main(){
    int niz[5];
    int* poks=&niz[0];
    int* i=NULL;

    unos(niz);
    cout<<"=========="<<endl;
    ispis(niz);
    cout<<"=========="<<endl;
    void (*pok)(int*, int*, int* );
    pok=&getPok;
    cout<<*poks<<" b1 "<<poks<<endl;
    pok(niz, poks, i);//<<endl;
    cout<<*poks<<" b2 "<<poks<<endl;
}
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Pointer i funkcije - problem05.05.2009. u 17:32 - pre 181 meseci
Šta si hteo da postigneš s promenljivom "i"? Ovako kako je napisano izgleda da umesto int* i = NULL treba da stoji int* i = new int, ili samo int i, ali da se zatim koristi &i, ali pošto se ta promenljiva koristi samo u funkciji onda može da bude i lokalna promenljiva funkcije tipa int.
 
Odgovor na temu

sheff

Član broj: 125907
Poruke: 317
62.113.4.*



Profil

icon Re: Pointer i funkcije - problem05.05.2009. u 18:13 - pre 181 meseci
bez new i delete...
sa kojim i? Ako mislis na funkciju getPok, onda i sluzi kao varijabla za odabir clana niza na koji zelim usmjeriti pokazivac...
da mozda nije greska u:
Code:
cin>>*i;


U slucaju da ne predajem i kao pointer varijablu nego je definisem unutar funkcije getPok, program proradi, medjutim tada a2 iz getPok nije jednako b2 iz maina, nego je b2=b1... zasto?
 
Odgovor na temu

Eurora3D Team
Nebojsa - Programer & Vodja tima
Beograd

Član broj: 120376
Poruke: 900
*.dynamic.sbb.rs.



+7 Profil

icon Re: Pointer i funkcije - problem05.05.2009. u 18:47 - pre 181 meseci
Procitaj u literaturi opsirnije o pointerima ...
Code:

#include <iostream>
using namespace std;

void unos(int* niz)
{
    for(int i=0; i<(5); i++)
    {
        cout<<"unesite "<<i+1<<". clan niza: ";
        cin>>niz[i];
    }
}

void ispis(int* niz)
{
    for(int i=0; i<(5); i++)
    {
        cout<<i+1<<". clan niza je: "<<niz[i]<<endl;
    }
}

int main()
{
    int niz[5];
    int* pokazivac;
    unos(niz);
    cout<<"=========="<<endl;
    ispis(niz);
    cout<<"=========="<<endl;
    //
    pokazivac = &niz[2];
    cout<<"Treci clan niza je: "<< *pokazivac <<endl;
    //ili dinamicki
    int* niz2 = new int[5]; // rezervisemo memoriju za drugi niz
    if(!niz2)
        return 1;
    unos(niz2);
    cout<<"=========="<<endl;
    ispis(niz2);
    cout<<"=========="<<endl;
    //
    pokazivac = niz2 + 2; // vrednost pointera je sad adresa treceg clana drugog niza
    cout<<"Treci clan niza je: "<< *pokazivac <<endl; // *pokazivac ovim dobijamo vrednost sa adrese na koju pointer pokazuje
    delete[] niz2;
    return 0;
}

 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Pointer i funkcije - problem05.05.2009. u 19:28 - pre 181 meseci
Citat:
U slucaju da ne predajem i kao pointer varijablu nego je definisem unutar funkcije getPok, program proradi, medjutim tada a2 iz getPok nije jednako b2 iz maina, nego je b2=b1... zasto?

Zato što kad daješ funkciji pointer ti možeš da menjaš ono na šta pointer ukazuje, ali ne možeš iz funkcije da vratiš novu vrednost pointera. Da bi ovo proradilo potrebno je i da drugi parametar funkcije bude pointer na pointer, int** pot, svuda u funkciji gde imaš pot da dodaš * ispred pot, i pri pozivu funkcije da dodaš jedan &, pok(niz, &poks, i)

Kao što vidiš kod postaje nečitljiv. Eurorin primer je jednostavniji. Treba težiti jednostavnosti. Ako je potrebno da postoji funkcija onda ona može da se deklariše i ovako: int* getPok(int* niz), ovde je sama povratna vrednost funkcije ono što ti treba.

Uzgred zašto je bilo potrebno da postoji pok(), kad već imaš getPok()?
 
Odgovor na temu

Eurora3D Team
Nebojsa - Programer & Vodja tima
Beograd

Član broj: 120376
Poruke: 900
*.dynamic.sbb.rs.



+7 Profil

icon Re: Pointer i funkcije - problem05.05.2009. u 21:52 - pre 181 meseci
Tebe je usvari zanimalo kako da menjas argumente koji su prosledjeni funkciji ... i kao sto je @Mihajlo Cvetanović vec napisao to se radi tako sto se funkciji proslede ardumenti po adresi. U suprotnom na ulazu u funkciju se prave kopije vrednosti i kad se tok programa vrati u funkciju koja je pozvala vrednosti su iste.
Evo ti mali primer sa nekoliko mogucih nacina prosledjivanja argumenata ... imas komentare
Code:


#include <iostream>
using namespace std;

void NeMenjajInt(int i) // parametar je kopiran i ne menja se u funkciji koja je pozvala ovu
{
    i++;
}

void PromeniInt(int &i) // parametar je prenesen po referenci (adresi)  i moze da se menja u funkciji
{
    i++;
}

void PromeniIntPtr1(int* &i) // parametar (pokazivac) je prenesen po referenci i moze da se menja u funkciji
{
    i--;
}

int* PromeniIntPtr2(int* i) // vracamo vrednost inkrementiranog pointera
{
    return ++i;
}

int main()
{
    int a = 2;
    cout << "a = " << a << endl;
    PromeniInt(a);
    cout << "a = " << a << endl;
    NeMenjajInt(a);
    cout << "a = " << a << endl;
    //
    int niz[2] ={1,2};
    int* ptr = &niz[1]; // ptr pokazuje na drugi element niza
    cout << "vrednost pointera je " << *ptr << endl;
    PromeniIntPtr1(ptr); // posle ove funkcije ptr pokazuje na prvi element niza
    cout << "vrednost pointera je " << *ptr << endl;
    ptr = PromeniIntPtr2(ptr); // ova funkcija vraca pokazivac uvecan za 1 tako da pokazuje ponovo na drugi element niza
    cout << "vrednost pointera je " << *ptr << endl;
    return 0;
}

 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: Pointer i funkcije - problem

[ Pregleda: 2263 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

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