Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 10 odgovora
  • 5.164 pregleda

Najnovija ↓

dekleracija niz i prosledjivanje funkciji 13.07.2007. u 17:20 · pre 235 meseci #1
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!
Re: dekleracija niz i prosledjivanje funkciji 13.07.2007. u 19:32 · pre 235 meseci #2
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 :)
Potpis
Bolje džaba ležat nego džaba radit.
Re: dekleracija niz i prosledjivanje funkciji 13.07.2007. u 20:16 · pre 235 meseci #3
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
Re: dekleracija niz i prosledjivanje funkciji 14.07.2007. u 21:03 · pre 235 meseci #4
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.. :)))
Re: dekleracija niz i prosledjivanje funkciji 15.07.2007. u 10:22 · pre 235 meseci
izmenjeno 1 put, poslednji put Au197/79 15.07.2007. u 10:45
  1. Au197/7915.07.2007. u 10:45zapis iz teksta poruke
#5
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.
Potpis
Bolje džaba ležat nego džaba radit.
Re: dekleracija niz i prosledjivanje funkciji 15.07.2007. u 18:10 · pre 235 meseci #6
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 ?
Re: dekleracija niz i prosledjivanje funkciji 16.07.2007. u 13:20 · pre 234 meseca #7
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;
}
Re: dekleracija niza i prosledjivanje funkciji 18.07.2007. u 13:32 · pre 234 meseca
izmenjeno 1 put, poslednji put cobragangsta 24.07.2007. u 02:26
  1. cobragangsta24.07.2007. u 02:26zapis iz teksta poruke
#8
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!!! :)
Re: dekleracija niz i prosledjivanje funkciji 13.08.2007. u 14:42 · pre 234 meseca #9
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!!!
Potpis
Ne treba ciljati u metu vec metati u cilj
Re: dekleracija niz i prosledjivanje funkciji 19.08.2007. u 10:51 · pre 233 meseca #10
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.
Re: dekleracija niz i prosledjivanje funkciji 21.08.2007. u 00:17 · pre 233 meseca #11
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.....
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme