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

prosledjivanje adrese pointera drugoj funkciji?

[es] :: C/C++ programiranje :: prosledjivanje adrese pointera drugoj funkciji?

[ Pregleda: 2936 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

La_Mar
Marko Lazovic

Član broj: 140826
Poruke: 123
*.dynamic.sbb.rs.



Profil

icon prosledjivanje adrese pointera drugoj funkciji?16.05.2008. u 14:33 - pre 193 meseci
Treba mi mala pomoc u C jeziku oko zadatka ali mislim da ce svima biti lakse ako napravim prost primer pa da me neko ispravi gde gresim
Naime, trebam da prosledim drugoj funkciji adresu pokazivaca koji je deklarisan u main-u i da ova (druga funkcija) popunjava i sredjuje matricu. naime, ja to napravim da "radi" ali su ti podaci ispravni sve dok sam u toj drugoj funkciji a cim se vrati u main podaci se vrate na postavke kakvi su bili pre poziva funkcije. Evo primera pa ako neko moze da mi pomgne bio bih mu veoma zahvalan

Code:

#include <stdio.h>

void upisiPodatke(double **podaci, int m, int n);
void ispisiPodatke(double **podaci, int m, int n);

int main()
{
    double **podaci;
    int m,n;

    printf("Unesite dimenzije matrice:\nBroj redova: ");
    scanf("%d",&m);
    printf("Broj kolona: ");
    scanf("%d",&n);

    upisiPodatke(&podaci,m,n);
    ispisiPodatke(&podaci,m,n);


    return 0;
}

void upisiPodatke(double **podaci, int m, int n)

{
    int i,j;
    podaci = malloc (m * sizeof(double));
    for (i=0;i<m;i++)
    {
        *(podaci+i)= malloc (n * sizeof(double));
    }
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            printf("Element [%d,%d]= ",i,j);
            scanf("%lf",&*(*(podaci+i)+j));
        }
    }
}

void ispisiPodatke(double **podaci, int m, int n)
{
    int i,j;
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            printf("%4.2f", *(*(podaci+i)+j));
        }
        printf("\n");
    }
}


EDIT: X Files : Molim Vas da zbog preglednosti, kod upisujete između tag-ova predviđenih za to:

[code]
int main ( int argc, char *argv[] )
{
// ...
return 0;
}
[/code]

[Ovu poruku je menjao X Files dana 16.05.2008. u 19:50 GMT+1]
 
Odgovor na temu

La_Mar
Marko Lazovic

Član broj: 140826
Poruke: 123
*.dynamic.sbb.rs.



Profil

icon Re: prosledjivanje adrese pointera drugoj funkciji?17.05.2008. u 12:09 - pre 193 meseci
Hajde ljudi molim Vas, barem neki predlog, blizi mi se rok a profa ne daje da imam globalne pokazivace pa mi je nastao ovaj problem :-(
 
Odgovor na temu

POW R TOC H
Dark Side of The Moon

Član broj: 174541
Poruke: 31
*.cpe.vektor.net.



Profil

icon Re: prosledjivanje adrese pointera drugoj funkciji?17.05.2008. u 14:18 - pre 193 meseci
Ovako, kada prosledjujes pointer funkciji ne treba ti operator &. Drugo, da se ne bi petljao sa *(*pointer) i slicnim stvarima, mozes slobodno da koristis [].
Znaci, ako imas :

Code:

char **pointer = nesto; //Recimo da vec pokazuje na nesto

//Mozes da mu pristupas ovako :
*(*pointer)

//Ali posto to izgleda zbunjujuce, a i lako se potkrade neki bug, trudi se da pozivas ovako : 
pointer[m][n] //da, to moze da se radi :)




Jos nesto :
scanf("%lf",&*(*(podaci+i)+j));
ovo je jaaako tesko za citanje, jos teze da debagovanje. Predlazem da vrednost prvo snimis u neku privremenu promenljivu a posle je prosto das matrici :)
Ovako

Code:

int temp;
scanf("%lf", &temp);

podaci[i][j] = temp;


Javi sta si uradio...
 
Odgovor na temu

La_Mar
Marko Lazovic

Član broj: 140826
Poruke: 123
*.dynamic.sbb.rs.



Profil

icon Re: prosledjivanje adrese pointera drugoj funkciji?17.05.2008. u 16:12 - pre 193 meseci
profa ne daje da koristimo direktan pristup memoriji kao sa nizovima! Zato ne smem da koristim [] , ali nije meni to problem vec mi je problem da vratim vrednosti koje provremeno primi neka funkcija u main.
Znaci primenio sam to sto ti kazes i dugujem ti i pice i klopu RADI na prostom primeru ali ce sigurno i na mom(pravim kod za razliku proizvoda matrica):

Code:

int popuni1(int *matrica)
{matrica[0]=1;matrica[1]=5;
return matrica;}
int popuni2(int *matrica)
{matrica[0]=10;matrica[1]=55;
return matrica;}

main()
{int *matrica;
matrica=malloc(2 * sizeof(int));
matrica=popuni1(matrica);
printf("%d %d",matrica[0],matrica[1]);
matrica=popuni2(matrica);
printf("%d %d",matrica[0],matrica[1]);}


Code:

int popuni1(int *matrica)
{*(matrica+0)=1;*(matrica+1)=5;
return matrica;}
int popuni2(int *matrica)
{*(matrica+0)=10;*(matrica+1)=522;
return matrica;}

main()
{int *matrica;
matrica=malloc(2 * sizeof(int));
matrica=popuni1(matrica);
printf("%d %d",*(matrica+0),*(matrica+1));
matrica=popuni2(matrica);
printf("\n%d %d",*(matrica+0),*(matrica+1));}


Ako bude nekome kasnije trebalo da ne pati kao ja
 
Odgovor na temu

IgorDX
Zagreb

Član broj: 175337
Poruke: 7
*.xnet.hr.



Profil

icon Re: prosledjivanje adrese pointera drugoj funkciji?22.05.2008. u 16:59 - pre 193 meseci
Koja je to skola/fakultet? Ovo su jedne od zapetljanijih stvari u C-u, barem se meni sa mojih 20 godina iskustva tako cini.

Ovaj red je opak: scanf("%lf",&*(*(podaci+i)+j)); Ja ne koristim scanf skoro pa nikad, a i matrice nikad ne pisem ovako. Istina, kad netko opisuje kako matrica funkcionira interno, onda *(*(podaci+i)+j) prikazuje kako kompajler prevodi formu podaci[ i ][ j ].

Ako mozes nabavi "Expert C Programming" - Peter van der Linden, ovaj tvoj primjer kao da je uzet iz te knjige.

Da se vratim na temu - kad zelis da neka funkcija mijenja parametar, moras poslati adresu. U tvom slucaju...
Code:
void upisiPodatke(double ***param, int m, int n)
{
    int      i,j;
    double **podaci;

    podaci = malloc (m * sizeof(double));
    for (i=0;i<m;i++)
    {
        *(podaci+i)= malloc (n * sizeof(double));
    }
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            printf("Element [%d,%d]= ",i,j);
            scanf("%lf",&*(*(podaci+i)+j));
        }
    }
    *param = podaci;
}


Ja sam to rijesio sa extra varijablom da ne kompliciram sa jos jednom zvijezdicom u svakom redu - ovako je lakse za citanje.

Igor
 
Odgovor na temu

La_Mar
Marko Lazovic

Član broj: 140826
Poruke: 123
*.com
Via: [es] mailing liste



Profil

icon Re: prosledjivanje adrese pointera drugoj funkciji?22.05.2008. u 18:51 - pre 193 meseci
 
Odgovor na temu

La_Mar
Marko Lazovic

Član broj: 140826
Poruke: 123
*.com
Via: [es] mailing liste



Profil

icon Re: prosledjivanje adrese pointera drugoj funkciji?22.05.2008. u 20:56 - pre 193 meseci
Hvala na odgovoru ali ja sam zavrsio kod, sve sto me je bunilo je zapravo moja greska jer sam ja prosledjivao adresu na kojoj se pointer nalazi a ne na koju pokazuje (sitnica :-) ). Inace u pitanju je Visoka Skola za Informacione Tehnologije u Zemunu (nekada BARN) I ucimo C na prvoj godini studija. Vec od sledeceg semestra cemo poceti C++ a potom i C# tako da je ovo samo uvod u programiranje. Iako sam ja jos i fino shvatio C (u odnosu na druge) nije mi jasno zasto se petljamo sa direktnim pristupom adresama kada cemo posle to sve da zaboravimo. Predaju nam dva profesora sa ETF-a pa predaju po njihovom planu. U svakom slucaju hvala na odgovoru.
 
Odgovor na temu

[es] :: C/C++ programiranje :: prosledjivanje adrese pointera drugoj funkciji?

[ Pregleda: 2936 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

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