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

problem sa dvodimenzionalnim nizovima

[es] :: C/C++ programiranje :: problem sa dvodimenzionalnim nizovima

Strane: 1 2

[ Pregleda: 11030 | Odgovora: 25 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Buffy
Stanko Culaja
Sipovo, BiH

Član broj: 45310
Poruke: 312
*.teol.net.



Profil

icon problem sa dvodimenzionalnim nizovima30.01.2005. u 15:00 - pre 233 meseci
imam problema sa dvodimenzionalnim matricama.
Naime sledeci kod ne radi:

Code:

void funk(int **a)
{
    //...
}

int main()
{
    int mat[10][10];
    funk(mat);
    return 0;
}

Zbog cega gornji kod nece da radi kad sam deklarisao parametar kao pokazivac koji pokazuje
na pokazivac.Compiler kaze:
"cannot convert parameter 1 from int[10][10] to int**."
Zar "mat" ne predstavlja konstantan pokazivac na pokazivac(int**)?
Kako da prenesem pokazivac na dvodimenzionalnu matricu(ili trodimnezionalnu) nekoj funkciji pravilno?
Unaprijed zahvalan!


 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
..31.216.81.gus.vf.siwnet.net.

Sajt: dejan.lekic.org


+2 Profil

icon Re: problem sa dvodimenzionalnim nizovima30.01.2005. u 16:26 - pre 233 meseci
Probaj umesto
Code:
void funk(int **a)
da stavis
Code:
void funk(int a[][10])
. Javi ako ne radi i usput posalji kompletan kod ako ikako moze...
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

Buffy
Stanko Culaja
Sipovo, BiH

Član broj: 45310
Poruke: 312
*.teol.net.



Profil

icon Re: problem sa dvodimenzionalnim nizovima30.01.2005. u 22:21 - pre 233 meseci
Radi,
ali mi se taj nacin uopste ne dopada.
Rad sa dvodimenzionalnim matricama je veoma tezak u c/c++ -u ako se jedino na ovaj nacin moze preneti argument.

 
Odgovor na temu

NastyBoy
Bojan Nastic
UK

Član broj: 12041
Poruke: 895
*.plus.com.



+4 Profil

icon Re: problem sa dvodimenzionalnim nizovima30.01.2005. u 23:49 - pre 233 meseci
Ako radish u C++, zashto ne napravish klasu kao wrapper oko dvodimenzionalne matrice i prenesesh objekat te klase u funkciju?
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
*.bos.east.verizon.net.



+6 Profil

icon Re: problem sa dvodimenzionalnim nizovima31.01.2005. u 01:52 - pre 233 meseci
Citat:
NastyBoy: Ako radish u C++, zashto ne napravish klasu kao wrapper oko dvodimenzionalne matrice i prenesesh objekat te klase u funkciju?


Ako radi u C++u nema nikakve potrebe da sam izmišlja toplu vodu - već postoji mali milion gotovih klasa za matricu.
 
Odgovor na temu

Pah-Wrait
Miroslav Kazanski
Beograd

Član broj: 4811
Poruke: 17
*.InfoSky.Net.



Profil

icon Re: problem sa dvodimenzionalnim nizovima31.01.2005. u 02:16 - pre 233 meseci
Code:

void funk(int **a)
{
//...
}

int main()
{
int mat[10][10];
funk(mat);
return 0;
}

Fora je u tome sto u C mozes da zanemaris samo poslednju uglastu zagradu (odnosno, ako stavis funk(mat[10]) trebalo bi da radi. Ali nemoj nikad koristiti brojeve za definiciju matrice, nego koristi konstante (M, N).
Onda ne moras da vodis racuna o tome kojeg je reda matrica.
 
Odgovor na temu

NastyBoy
Bojan Nastic
UK

Član broj: 12041
Poruke: 895
*.plus.com.



+4 Profil

icon Re: problem sa dvodimenzionalnim nizovima31.01.2005. u 02:27 - pre 233 meseci
Citat:
Dragi Tata: Ako radi u C++u nema nikakve potrebe da sam izmišlja toplu vodu - već postoji mali milion gotovih klasa za matricu.


Tachno, ali zar ne bi bilo dobro da pokusha da reshi problem samostalno?
Klasa matrice je jako zanimljiva za igranje/vezhbanje :)
 
Odgovor na temu

Marko Stankovic

Član broj: 11
Poruke: 306
212.200.23.*



Profil

icon Re: problem sa dvodimenzionalnim nizovima31.01.2005. u 14:27 - pre 233 meseci
Citat:
Buffy:
Rad sa dvodimenzionalnim matricama je veoma tezak u c/c++ -u ako se jedino na ovaj nacin moze preneti argument.


U C-u tvoj kod mora da radi, eventualno ce kompajler izbaciti warning da nisu kompatibilni pokazivaci, ali mora da napravi izvrsni fajl. Proveri da nisi isao na new c++ project u cemu god programiras.

Nego aj da ne otvaram novu temu posto se radi o slicnom problemu, kako se u c++ stvara dinamicka matrica, znaci kog tipa treba da je pokazivac da me kompajler ne bi zezao kao u ovom kodu? Ja sam probao sa
Code:

int **mat=new int[10][10];

i ovo naravno nece da radi. Nemojte samo odgovore tipa koristi gotove klase za matrice i slicno.

[Ovu poruku je menjao Marko Stankovic dana 31.01.2005. u 15:30 GMT+1]
I drink to make other people interesting.
 
Odgovor na temu

Buffy
Stanko Culaja
Sipovo, BiH

Član broj: 45310
Poruke: 312
*.teol.net.



Profil

icon Re: problem sa dvodimenzionalnim nizovima31.01.2005. u 14:29 - pre 233 meseci
Napravio sam na brzinu najjednostavniju i ne potpunu klasu za rad
sa dvodimenzionalnim matricama.Prvo kod:
Code:

template<class t> class DM
{
public:
    DM(int a,int b):duz(a)
    {
        mat=new t*[a];
        for (int i=0;i<=a-1;++i) mat[i]=new t[b];
    }
    ~DM()
    {
        for (int i=0;i<=duz-1;++i) delete [] mat[i];
        delete [] mat;
    }
    t & operator()(int a,int b)
    {
        return mat[a][b];
    }
    t * operator()(int a)
    {
        return mat[a];
    }
    operator t**()
    {
        return mat;
    }
private:
    t **mat;
    int duz;
};

Nisam siguran da nema bagova.
U konstruktoru se alocira memorija za dvostruki pokazivac koji je clan
DM klase.U destruktoru se dealocira ta memorija,a ostale funkcije sluze za pristup
clanovima niza po indeksu.Sada da vidimo klasu na djelu:
Code:

//program za testiranje DM klase
void funk(int **a)
{
    a[3][4]=157;
}
int main()
{
    DM<int> mat(10,10);
    funk(mat);
    cout<<mat(3,4)<<'\n';
    return 0;

}

Izlaz na ekran je "157" sto znaci da je u redu.
Ja samo znam za ovaj nacin prenosenja argumenata(alociranjem memorije sa slobodnog skladista).
Bolje rjesenje(za mene) je da se umjesto klase napravi funkcija koja alocira memoriju...
Code:

int **DM(int a,int b)
{
    int **pok;
    pok=new int*[a];
    for (int i=0;i<=a-1;++i) pok[i]=new int[b];
    return pok;
}

... i vraca pokazivac na dvodimenzionalni niz.
Imali boljih nacina?
 
Odgovor na temu

Buffy
Stanko Culaja
Sipovo, BiH

Član broj: 45310
Poruke: 312
*.teol.net.



Profil

icon Re: problem sa dvodimenzionalnim nizovima31.01.2005. u 14:33 - pre 233 meseci
Citat:
Marko Stankovic
Nego aj da ne otvaram novu temu posto se radi o slicnom problemu, kako se u c++ stvara dinamicka matrica, znaci kog tipa treba da je pokazivac da me kompajler ne bi zezao kao u ovom kodu? Ja sam probao sa
Code:

int **mat=new int[10][10];

i ovo naravno nece da radi. Nemojte samo odgovore tipa koristi gotove klase za matrice i slicno.

Odgovor se nalazi u konstruktoru moje DM klase!


 
Odgovor na temu

Marko Stankovic

Član broj: 11
Poruke: 306
212.200.23.*



Profil

icon Re: problem sa dvodimenzionalnim nizovima31.01.2005. u 15:10 - pre 233 meseci
Da, ok je taj nacin ali mi se cini da bi operatorom new trebali da mozemo alocirati visedimenzionalne nizove samo jednim pozivom, pa me interesuje kako je to moguce, ako uopste moze.
I drink to make other people interesting.
 
Odgovor na temu

BaCkSpAcE

Član broj: 10
Poruke: 518
*.vdial.verat.net.



Profil

icon Re: problem sa dvodimenzionalnim nizovima31.01.2005. u 16:31 - pre 233 meseci
Evo workaround ;) Fazon je sto ti matricu ispegla u jedan niz, i na tebi je posle da ga rekonstruises u func()...

Code:

#include <stdio.h>

#define ROWS 10
#define COLUMNS 10

void func(int *mat) {
  int i, j;

  for (i=0; i<10; i++) {
    printf ("\n");
    for (j=0; j<10; j++) {
      printf ("%d ", mat[i*ROWS+j]);
    }
  }
}  


int main() {
  int matrica[ROWS][COLUMNS];
  int i, j;
  
  for (i=0; i<10; i++) 
    for (j=0; j<10; j++)
      matrica[i][j]=i+j;  // popunjavam matricu sa i+j, cisto da ima nesto

  func((int *)matrica);

  return 0;
}
 
Odgovor na temu

Marko Stankovic

Član broj: 11
Poruke: 306
212.200.23.*



Profil

icon Re: problem sa dvodimenzionalnim nizovima31.01.2005. u 19:17 - pre 233 meseci
Da, problem se moze resiti koriscenjem operatora cast, samo ne vidim razlog zasto "peglas" matricu u niz, sve ce to isto raditi ako u zagradi stavis (int**) odnosno ako funkciju pozivas na sledeci nacin:
Code:


void func(int **mat);

...


int main(){

...
func((int**)matrica);
...
}


mada nekako mi nije bas elegantno :)
I drink to make other people interesting.
 
Odgovor na temu

Buffy
Stanko Culaja
Sipovo, BiH

Član broj: 45310
Poruke: 312
*.teol.net.



Profil

icon Re: problem sa dvodimenzionalnim nizovima31.01.2005. u 21:05 - pre 233 meseci
Ja sam pokusao staviti:
Code:

func((int**)matrica);

i sve se lijepo kompajlira,ali dodje do greske prilikom izvodjenja.
Ako "ispeglamo" matricu onda sve savrseno radi.
Zbog cega je to tako izgleda niko ne moze da odgovori!!!

 
Odgovor na temu

Pah-Wrait
Miroslav Kazanski
Beograd

Član broj: 4811
Poruke: 17
*.InfoSky.Net.



Profil

icon Re: problem sa dvodimenzionalnim nizovima01.02.2005. u 00:25 - pre 233 meseci
Da pokusam da vam pomognem: postoji nekoliko nacina za rad sa matricama.
Ako hoces u cistom C-u: mogu biti staticke i dinamicke (ovo sto si ti hteo da uradis). Kada radis sa dinamickim imas dinamicki dodeljeno parce memorije koje pokazuje dinamicki dodeljenu memoriju. Tu se koristi operator malloc pa sad sta sve ide, zaboravio sam, radim sada sasvim druge stvari, ali ima u Laslovoj knjizi za C finih primera. Nasao sam jedan:
/..
int **a;
int m,n,i,j;
scanf("%d%d", &m, &n);//broj vrsta i kolona
a=malloc (m*sizeof(int*));

for(i=0;i<m;i++)*(a+i)=malloc (n*sizeof(int));// *(a+i) je isto sto i *a, ali sam ih namerno odvojio
I to ti je dinamicka matrica. Ukoliko hoces da koristis matricu u funkcijama, moraju se navesti sve velicine osim poslednje: ako je obican niz, kao argument mozes da stavis samo (a[]); ukoliko je rec o matrici 3*6, onda kao argument mozes da stavis (a[3][])...


Sto se tice matrica u standardnom C++ ima jos vise ali primer koji je Buffy objavila izgleda OK. A ako hoces stvarno da naucis C++ NE KORISTI VEC GOTOVE KLASE!!! TO MOZE KASNIJE KADA NAUCIS DOVOLJNO, PA DA NE GUBIS VREME, ALI AKO HOCES DA ZNAS C++, radi sve sam. Ako hoces da koristis vec gotove stvari i samo da ih ubacuje i rasporedjujes, onda uci VB.
Pozdrav
 
Odgovor na temu

glorius
Damir Nikolic
C++ developer
SR

Član broj: 4366
Poruke: 428
213.244.208.*

ICQ: 208550327


+14 Profil

icon Re: problem sa dvodimenzionalnim nizovima01.02.2005. u 01:07 - pre 233 meseci
Hmm... Zanimljivo je i ovo:

// NAPOMENA: u daljem tekstu koristim } umesto ] zbog text-editora ovog foruma

Funkcija(int * pMat)
{
// ......
}

main()
{

int mat{10}{10};

// popunjavanje matrice, bla, bla...

for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
int * pokazivacNaElement = &mat{i}{j};

Funkcija(pokazivacNaElement);
}
}

Ovo sam slucajno otkrio i svidja mi se fora ali sluzi samo za predavanje f-ji element po element. Zatreba nekada...



EOF
 
Odgovor na temu

Marko Stankovic

Član broj: 11
Poruke: 306
212.200.23.*



Profil

icon Re: problem sa dvodimenzionalnim nizovima01.02.2005. u 01:35 - pre 233 meseci
Citat:
Buffy:
i sve se lijepo kompajlira,ali dodje do greske prilikom izvodjenja.
Ako "ispeglamo" matricu onda sve savrseno radi.
Zbog cega je to tako izgleda niko ne moze da odgovori!!!


U pravu si dolazi do greske, nisam to primetio jer nisam startovao program samo sam ga iskompajlirao. U pocetku sam se zbunio gde je problem medjutim posle kraceg razmisljanja video sam da ima sasvim logicno objasnjenje.
Ovaj kod koji je ostavio backspace je dobar u slucaju staticki alociranih matrica, a ovaj moj primer jedino u slucaju dinamickih matrica. Jer staticka matrica u memoriji izgleda kao niz duzine n*m (ako je n broj kolona a m broj vrsta) dok je dinamicka pokazivac na niz pokazivaca od kojih svaki pokazuje na po jedan niz koji mogu biti bilo gde u memoriji. Znaci iz adresne aritmetike imamo:

matrica[x][j]=*(*(matrica+x)+j)

e sada kada je staticka matrica mi vec sa *(matrica+x) uzimamo int (jer je staticka matrica ustvari samo niz u memoriji odnosno matrica ce biti tipa int*) pa se ovo +j i * izvrsavaju nad podatkom tipa int i zbog toga program puca sa primerom koji sam ja naveo. Tako da je u tom slucaju ispravno da pisemo matrica[i*ROWS+j] i da ime matrice prenesemo kao int*.
Naravno backspaceov kod nece da radi sa dinamickom matricom jer imamo:

matrica[i*ROWS+j]=*(matrica+i*ROWS+j)

sto ce naravno da izleti iz niza pokazivaca na koji pokazuje matrica a i kada bi cak bilo u opsegu uzelo bi samo pokazivac na niz integera a ne broj iz tog niza. Nacrtao sam cak i malu slicicu koja prikazuje razliku izmedju statickih i dinamickih matrica i zbog cega je cela ova prica.

p.s. samo nemojte da se smejete crtezu :) i naravno levo je staticka a desno dinamicka matrica.


I drink to make other people interesting.
Prikačeni fajlovi
 
Odgovor na temu

Buffy
Stanko Culaja
Sipovo, BiH

Član broj: 45310
Poruke: 312
*.teol.net.



Profil

icon Re: problem sa dvodimenzionalnim nizovima01.02.2005. u 12:07 - pre 233 meseci
Svaka cast Marko,izgleda da si rijesio problem.
Sad nam jedino preostaje da koristimo dinamicke matrice!!!
Citat:
Pah-Wrait:...primer koji je Buffy objavila...

Primjer koji je Buffy objavio!!!
 
Odgovor na temu

BaCkSpAcE

Član broj: 10
Poruke: 518
*.vdial.verat.net.



Profil

icon Re: problem sa dvodimenzionalnim nizovima01.02.2005. u 14:35 - pre 233 meseci
Ja sam onaj primer napisao za Buffy-jev kod koji je dao u prvom postu
Code:

void funk(int **a)
{
    //...
}

int main()
{
    int mat[10][10];
    funk(mat);
    return 0;
}


I za njegove potrebe, tj. ono sto je on trazio, ovaj primer radi savrseno jer on koristi staticku matricu (int mat[10][10]), svaki element ove matrice se nalazi u memoriji jedan iza drugog, zato moze onako da se "ispegla"...
 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
..31.216.81.gus.vf.siwnet.net.

Sajt: dejan.lekic.org


+2 Profil

icon Re: problem sa dvodimenzionalnim nizovima03.02.2005. u 14:02 - pre 233 meseci
Buffy, ako ti se ne svidja da imas
Code:

void funk(int a[][10])

onda mozes malo promeniti svoj kod da izgleda ovako:
Code:

void funk(int **a)
{
  //...
}

int main()
{
  // Umesto: int mat[10][10];
  // imas ovo:
  int **mat = new int*[10]; 
  funk(mat);
  return 0;
}

Ovaj kod je skoro isti kao onaj koji si dao na pocetku s malom razlikom koja je oznacena u kodu. Meni se vise svidja void funk(int a[][10]) ... ali to je izgleda pitanje ukusa...
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

[es] :: C/C++ programiranje :: problem sa dvodimenzionalnim nizovima

Strane: 1 2

[ Pregleda: 11030 | Odgovora: 25 ] > FB > Twit

Postavi temu Odgovori

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