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

dekleracija niz i prosledjivanje funkciji

[es] :: C/C++ programiranje :: C/C++ za početnike :: dekleracija niz i prosledjivanje funkciji

[ Pregleda: 4071 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

cobragangsta

Član broj: 146928
Poruke: 84
212.200.70.*



+2 Profil

icon dekleracija niz i prosledjivanje funkciji13.07.2007. u 16:20 - pre 204 meseci
imam dva pitanja
1. moze li se deklarisati niz npr. ovako:

Code:

main()
      { 
       int n,a[n];
       scanf("%d",&n);
       ....
      }

umesto

main()
      { 
       int a[10];
       ....
      }

ili
#define n=10

main()
      { 
       int a[n];
       ....
      }


tj kako definisati niz cija duzina zavisi od potrebe korisnika?
dakle duzina bi trebala biti poznata "pre upotrebe" niza .
(nesto mi je u bledom secanju da to bas i nije moguce)
(znam da postoji resenje sa povezanim listama ali ovde govorimo o nizovima!!)
ovaj problem mi se pojavio kada mi je trebao program za "izracunavanje" matrice proizvoljne velicine, a da nemoram svaki put da menjam kod.

2. drugi problem je prosledjivanje visedimenzionalnih nizova kao parametara funkciji i njihova prethodna deklaracija:

Code:

#include <stdio.h>
void fcija(int zizoje[][][]);

main()
    {
     int u,nizoje[4][2][6];
     
     fcija(nizoje);
     scanf("%d",&u);
    }
    
void fcija(int zizoje[4][2][6])
     {
     int i,j;
     for (j=0;j<2;j++)
     for (i=0;i<4;i++) zizoje[i][j][1]=i+10;
     }


ovo npr sljaka ali kako proslediti pomocu pointera (kao kod jednodim. nizova)
bilo bi divno da ovde upisete sto vise razlicitih resenja na ovu temu (i prvu i drugu), mislim da ce mnogima koristiti.

ovo inace spada u pocetnicka pitanja i nisam nasao u ovom forumu nesto slicno

hvala unapred svima na trudu
pozdrav!
 
Odgovor na temu

Au197/79
Zlatan Kadragić
Minhen

Član broj: 3556
Poruke: 772
*.adsl.beotel.net.

Sajt: aurelije.blogspot.com


+47 Profil

icon Re: dekleracija niz i prosledjivanje funkciji13.07.2007. u 18:32 - pre 204 meseci
1. Možeš da imaš samo promenjivu tipa int niz (tj. pokazivač na int) pa posle, kad saznaš koliko dugačak niz ti treba, da pomoću malloc alociraš proračunatu količinu memorije: br_elementata_niza * sizeof(int)

2. Zar ne možeš u definiciji funkcije napisati da je parametar kako u prototipu funkcije jednostavno trodimenzionalni niz bez konkretnih dimenzija?

Davno se učio C pa se i zaboravilo :)
Bolje džaba ležat nego džaba radit.
 
Odgovor na temu

cobragangsta

Član broj: 146928
Poruke: 84
212.200.70.*



+2 Profil

icon Re: dekleracija niz i prosledjivanje funkciji13.07.2007. u 19:16 - pre 204 meseci
Citat:
Au197/79: 1. Možeš da imaš samo promenjivu tipa int niz (tj. pokazivač na int) pa posle, kad saznaš koliko dugačak niz ti treba, da pomoću malloc alociraš proračunatu količinu memorije: br_elementata_niza * sizeof(int)

2. Zar ne možeš u definiciji funkcije napisati da je parametar kako u prototipu funkcije jednostavno trodimenzionalni niz bez konkretnih dimenzija?

Davno se učio C pa se i zaboravilo :)


1. zar nije promenjiva tipa int *niz , gde je sad niz pokazivac. onako kako si ti definisao je obicna promenjiva (ako se nevaram)
pokusacu malo da prelistam deo literature o dinamickoj alokaciji memorije a ne bi bili lose ako bi mogao da ubacis ovde neki kratak kod mislim da bi bilo mnogo jasnije (kako bi ovo izgledalo za trodimenzionalni niz)
2. uf.. ovaj deo mi nije najjasniji (stavi neki kod ili prepravi moj, odozgo). a kao sto sam rekao radi bez greske (radim u dev-C++)...

takodje davno...i samo za ocenu... :)

ljudi trudite se da, koliko je moguce, objasnite visedimenzione nizove.
u svakom slucaju, Au197/79, hvala ti puno na odgovoru
 
Odgovor na temu

cobragangsta

Član broj: 146928
Poruke: 84
212.200.70.*



+2 Profil

icon Re: dekleracija niz i prosledjivanje funkciji14.07.2007. u 20:03 - pre 204 meseci
Code:

#include <stdio.h>
void fcija(int zizoje[][][]);

main()
    {
     int u,nizoje[4][2][6];
     
     fcija(nizoje);
     scanf("%d",&u);
    }
    
void fcija(int (*zizoje)[2][6])
     {
     int i,j;
     for (j=0;j<2;j++)
     for (i=0;i<4;i++) zizoje[i][j][1]=i+10;
     }



moze i ovako....
izgleda da sam sebi odgovaram! al kad sam vec postavio pitanje...
... a mozda i niko drugi nezna.. :)))
 
Odgovor na temu

Au197/79
Zlatan Kadragić
Minhen

Član broj: 3556
Poruke: 772
*.adsl.beotel.net.

Sajt: aurelije.blogspot.com


+47 Profil

icon Re: dekleracija niz i prosledjivanje funkciji15.07.2007. u 09:22 - pre 204 meseci
Kada sam rekao da je promenljiva tipa int niz, nisam mislio da je naziv promenljive "niz" već da je tip: int[] (mada ovo može u javi nisam siguran da može u C-u pa probaj, ako ne ide ostaje: int nazivPromenljive[])

A ovo drugo sam mislio da napišeš:
Code:
void fcija(int zizoje[][][])
     {
     int i,j;
     for (j=0;j<2;j++)
     for (i=0;i<4;i++) zizoje[i][j][1]=i+10;
     }


Ono se verovatno može zameniti sa int ***. Ali tu moraš proslediti i dužine dimenzija, jer nema smisla prosleđivati višedimenzioni niz sa neograničenim dimenzijama a u kodu da su dimenzije ipak zakovane. Osim toga kad malo bolje pogledam kod tebi izgleda da 3. dimenzija ni ne treba samo u poslednjem redu ovo
Code:
zizoje[i][j][1]=i+10;
promeni u ovo:
Code:
zizoje[i][j]=i+10;
jer mi se čini da od te treće dimenzije koristiš samo jedan element.

[Ovu poruku je menjao Au197/79 dana 15.07.2007. u 10:45 GMT+1]
Bolje džaba ležat nego džaba radit.
 
Odgovor na temu

cobragangsta

Član broj: 146928
Poruke: 84
212.200.70.*



+2 Profil

icon Re: dekleracija niz i prosledjivanje funkciji15.07.2007. u 17:10 - pre 204 meseci
Citat:
Au197/79: Kada sam rekao da je promenljiva tipa int niz, nisam mislio da je naziv promenljive "niz" već da je tip: int[] (mada ovo može u javi nisam siguran da može u C-u pa probaj, ako ne ide ostaje: int nazivPromenljive[])


jasno. ali ne ide.
definicija niza nije moguca sa n[]; niz mora imati parametar

Citat:

A ovo drugo sam mislio da napišeš:
Code:
void fcija(int zizoje[][][])
     {
     int i,j;
     for (j=0;j<2;j++)
     for (i=0;i<4;i++) zizoje[i][j][1]=i+10;
     }




Code:

#include <stdio.h>
void f_ja(int drugi3d_niz[][][]);

main()
    {
     int u,a=99, jedan3d_niz[4][2][6];
              
     f_ja(jedan3d_niz);

     scanf("%d",&u);// bez \n radi dobro
     // sa \n trazi da upisem dva broja
    }
    
void f_ja(int drugi3d_niz[][][])
     {
     int i,j;
     for (j=0;j<2;j++)
     for (i=0;i<4;i++) drugi3d_niz[i][j][1]=i+10;
     }


ovo neradi. jer u funkciji f_ja nije definisana velicina niza
"invalid use of array with unspecified bounds" i pokazuje na ovaj deo "drugi3d_niz[j][1]=i+10;"

Citat:

Ono se verovatno može zameniti sa int ***. Ali tu moraš proslediti i dužine dimenzija, jer nema smisla prosleđivati višedimenzioni niz sa neograničenim dimenzijama a u kodu da su dimenzije ipak zakovane. Osim toga kad malo bolje pogledam kod tebi izgleda da 3. dimenzija ni ne treba samo u poslednjem redu ovo
Code:
zizoje[i][j][1]=i+10;
promeni u ovo:
Code:
zizoje[i][j]=i+10;
jer mi se čini da od te treće dimenzije koristiš samo jedan element.


da, koristim samo prvi elem treceg dimenzije onako bezveze. ovde mi je u interesu samo kako proslediti niz od tri i vise dimenzija a ne sta konkretno raditi s njim.

probao sam ovo (int***), krenuo je sa radom ali: ...windows has encounter serious error...(otprilike)
nisam siguran da ovako uopste moze. mislim da moze samo jedan prokazivac, jer pokazivac sadrzi adresu prvog elementa niza, sledeci pokazivac bi sadrzao adresu pokazivaca koji pokazuje na prvi element niza (a ne na prvi element sledece kolone), treci pokazivac bi sadrzao adresu drugog...

===========================
eksperimentisao sam i sa malloc:

int *niz,n;
scanf("%d",&n);
niz=malloc(n*sizeof(int));

da pokusam da uopstim:

int *niz,n,m,r;
scanf("%d",&n);scanf("%d",&m);scanf("%d",&r);
niz=malloc(n*m*r*sizeof(int));

ali sad ima jednodimenzioni niz sa n*m*r elemenata a ne 3d niz.

uopstavanje neuspelo :)

=======================================================

vrlo je lako proslediti jednodim. niz u funkciju,
ali kako da napravim funkciju koja racuna npr sumu elementa bilo kog trodimenzionalnog niza. tj na koji nacin da prosledim 3d niz bilo koje velicine u jednu te istu funkciju a ond da izracuna zbir elemenata??????

hvala jos jednom na trudu Au 197/79.

ima li ko resenje ?
 
Odgovor na temu

markic
Marko Markovic
Novi Sad

Član broj: 10148
Poruke: 210
*.WLAN-BO9.NSD.panline.net.



+2 Profil

icon Re: dekleracija niz i prosledjivanje funkciji16.07.2007. u 12:20 - pre 204 meseci
Evo ti primer dvodimenzionalnog niza:

Ovako kreiras niz:
Code:

    int n = 5;  // br. kolona
    int m = 10; // br. redova
    int **niz;

    int i;

    niz = (int**) malloc(m * sizeof(int *));

    for(i=0; i<m; i++) {
        niz[i] = (int*) malloc(n * sizeof(int));
    }


Ovo bi bila f-ja za racunanje sume elemenata
Code:

int sumiraj(int **niz, int n, int m)
{
    int i,j;
    int suma=0;

    for (i=0; i<m; i++) {
        for (j=0; j<n; j++) {
            suma += niz[i][j];
        }
    }
    return suma;
}
 
Odgovor na temu

cobragangsta

Član broj: 146928
Poruke: 84
212.200.70.*



+2 Profil

icon Re: dekleracija niza i prosledjivanje funkciji18.07.2007. u 12:32 - pre 204 meseci
auuuu pa ovo postaje sve zanimljivije.
ovo funkcionise odlicno.

a kako bi ovo izgledalo za trodimenzionalni niz (ili dim>3)

konkretno ovaj deo
Code:

    niz = (int**) malloc(m * sizeof(int *));

    for(i=0; i<m; i++) {
        niz[i] = (int*) malloc(n * sizeof(int));
    }

sta knkretno znaci "(int**)" u ovom slucaju.

kako ovaj deo izgleda za 3d niz:
Code:

    for(i=0; i<m; i++) {
        niz[i] = (int*) malloc(n * sizeof(int));}


hvala Markic.

Konkurs i dalje otvoren za nove predloge!!! :)

[Ovu poruku je menjao cobragangsta dana 24.07.2007. u 02:26 GMT+1]
 
Odgovor na temu

perun_
Nemanja Andjelkovic
Banglades

Član broj: 151779
Poruke: 115
*.ptt.yu.

Sajt: 127.0.0.1


Profil

icon Re: dekleracija niz i prosledjivanje funkciji13.08.2007. u 13:42 - pre 203 meseci
Vidim niko ne odgovara, pa pomislih da sam mogao i ja malo pametovati.
Elem, nesto ovako:
Code:

int main()
{
    int m=2,n=3,p=4;
    int i,j;
    int ***c;
    int k,l,q,t;
    c=(int***)malloc(m*sizeof(int**));
    for (i=0;i<n;i++)
    {
        *(c+i)=(int**)malloc(n*sizeof(int*));
        for (j=0;j<p;j++)
        {
            *(*(c+i)+j)=(int*)malloc(p*sizeof(int));
        }
    }
        return 0;
}


Dobro, ovaj 3d jos i moze da prodje, odnosno, nekada ga je nemoguce izbeci. Generalno, ne treba se petljati sa "dubokim" nizovima. Kada god ih mozes izbeci, do it. Rad sa njima je prilicno komplikovan, zamrsi se covek. Negde sam cak nasao podatak da niz sa preko sedam dimenzija ne mogu ispratiti ni vrhunski programeri (nije ni cudno ipak je to int******* niz ). Dakle, ovo sto sam napisao definitivno radi, ali sigurno postoji jednostavnije resenje, kao i uvek.
POZDRAV!!!
Ne treba ciljati u metu vec metati u cilj
 
Odgovor na temu

cobragangsta

Član broj: 146928
Poruke: 84
212.200.70.*



+2 Profil

icon Re: dekleracija niz i prosledjivanje funkciji19.08.2007. u 09:51 - pre 202 meseci
Sjajno!!! Ovo je jedini vid pametovanja koje zaista cenim.
Zahvaljujem se vrhovnom bozanstvu starih Slovena :)
Sada imamo sablon.
Mada se sada ispostavilo da nerazumem dobro pointere.

int *c - c je pointer na celobrojnu promenjivu
int **c - c je pointer na pointer ( dakle c sadrzi adresu pointera koji sadrzi adresu celobrojne promenjive)
int ***c - c je pointer na pointer na pointer, gde ovaj zadnji sadrzi adresu celobrojne promenjive.
itd..

ako sam dobro razumeo izraz:
c=(int***)malloc(m*sizeof(int**));
c je pointer koji pokazuje na prvi clan niza od m clanova (koji su takodje pointeri "nizeg ranga")

dalje:
for (i=0;i<n;i++)
{
*(c+i)=(int**)malloc(n*sizeof(int*));

ovim svaki clan od m pointera postaje pokazivac na prvi element niza od n clanova (koji su takodje pointeri "jos nizeg ranga")
znaci sad imamo m nizova sa n pointera.

tako da bi nam
for (j=0;j<p;j++)
{
*(*(c+i)+j)=(int*)malloc(p*sizeof(int));
}
svaki clan od tih m nizova sa n clanova (tj tako dobijene "matrice") ovim zadnjim kodom postaje POINTER na novi niz od p pointera od kojih svaki pokazuje na celobrojnu vrednost.

uh, nadam se da je donekle razumljivo.

Ako nisam dobro protumacio ocekujem ispravku od ISKUSNIH ZNAAAALACAAAA kako zbog sebe tako i zbog drugih da ih nebi ovo odvuklo u pogresnom pravcu!

jos jednom, Perun, odlican posao. Veliko hvala.
 
Odgovor na temu

cobragangsta

Član broj: 146928
Poruke: 84
212.200.70.*



+2 Profil

icon Re: dekleracija niz i prosledjivanje funkciji20.08.2007. u 23:17 - pre 202 meseci
ok, mislim da sam konacno ukapirao! ))))))))))))))
bunilo me je to sto svi pointeri (bez obzira na cast) imaju isti sadrzaj tj memorijsku adresu, pa sam ih na taj nacin poistovetio.
a cast je ono sto nedozvoljava da "pokazuju" ono za sta nisu definisani.

eh, ti pointeri.....
 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: dekleracija niz i prosledjivanje funkciji

[ Pregleda: 4071 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

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