[ cobragangsta @ 13.07.2007. 16:20 ] @
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!
[ Au197/79 @ 13.07.2007. 18:32 ] @
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 :)
[ cobragangsta @ 13.07.2007. 19:16 ] @
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
[ cobragangsta @ 14.07.2007. 20:03 ] @
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.. :)))
[ Au197/79 @ 15.07.2007. 09:22 ] @
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]
[ cobragangsta @ 15.07.2007. 17:10 ] @
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 ?
[ markic @ 16.07.2007. 12:20 ] @
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;
}
[ cobragangsta @ 18.07.2007. 12:32 ] @
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]
[ perun_ @ 13.08.2007. 13:42 ] @
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!!!
[ cobragangsta @ 19.08.2007. 09:51 ] @
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.
[ cobragangsta @ 20.08.2007. 23:17 ] @
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.....