prosledjivanje adrese pointera drugoj funkciji?

  • 6 odgovora
  • 4.006 pregleda
prosledjivanje adrese pointera drugoj funkciji? 16.05.2008. u 14:33 · pre 224 meseci #1
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]
Re: prosledjivanje adrese pointera drugoj funkciji? 17.05.2008. u 14:18 · pre 224 meseci #3
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...
Re: prosledjivanje adrese pointera drugoj funkciji? 17.05.2008. u 16:12 · pre 224 meseci #4
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
Re: prosledjivanje adrese pointera drugoj funkciji? 22.05.2008. u 16:59 · pre 224 meseci #5
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
Re: prosledjivanje adrese pointera drugoj funkciji? 22.05.2008. u 20:56 · pre 224 meseci #7
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.
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme