[ peromalosutra @ 16.05.2006. 21:18 ] @
Sad napravih neki zadatak koji računa broj grupa jedinica u matrici i kad sam tu matricu stavio na slobodnu memoriju ... otad program ne radi. Dakle problem je 100% do matrice ali namjerno nisam htio da je napravim na steku, u inat! :-)

Code:
#include <iostream>
#include <fstream>
using namespace std;

void findObject(int i, int j, int k, int **mat);     

int main(void)
{
    int n;
    ifstream in("input\\MATRIX.txt");    
    in >> n;
    char tmp[n];
    //matrica na slobodnoj memoriji
    int **mat = new int*[n];
    for (int i=0; i<n; i++)
        mat[i] = new int[n];
    //učivanje matrice
    for (int i=0; i<n; i++)
    {
        in >> tmp;
        for (int j=0; j<n; j++) 
        {
            if (tmp[j]=='0')
               mat[i][j]=0;
            else
                mat[i][j]=-1;
        }
    }
    in.close();    
    //obrada
    int k=1;
    for (int i=0; i<n; i++)
        for (int j=0; j<n; j++)
            if (mat[i][j]==-1)
            {
              findObject(i,j,k,mat);
              k++;
            }          
    //ispis matrice
    for (int i=0; i<n; i++, cout << endl)
        for (int j=0; j<n; j++)
            if (mat[i][j]!=0)
               cout << mat[i][j];
            else
                cout << ".";
    cout << "\nBroj likova u matrici: " << k-1 << "\n";
    
    system ("pause");
    return 0;
}

/*
  funkcija rekurzivno pronalazi skup jedinica u matrici
  i,j - koordinate člana matrice koji pripada liku
  k - indeks trenutnog lika u matrici
*/
void findObject(int i, int j, int k, int **mat)
{
     if (mat[i][j+1]==-1)
     {
        mat[i][j+1]=k;
        findObject(i,j+1,k,mat);
     }
     if (mat[i][j-1]==-1)
     {
        mat[i][j-1]=k;
        findObject(i,j-1,k,mat);
     }
     if (mat[i+1][j]==-1)
     {
        mat[i+1][j]=k;
        findObject(i+1,j,k,mat);
     }
     if (mat[i-1][j]==-1)
     {
        mat[i-1][j]=k;
        findObject(i-1,j,k,mat);
     }
}
[ yooyo @ 17.05.2006. 17:05 ] @
U funkciji findObject nemas proveru da li si probio dimenzije matrice.
Ako malo bolje pogledas videces da program moze da se rekurzivno zavrti i da u liniji if (mat(i)(j+1)==-1) i ili j+1 predu N (dimenziju matrice).

Koji kompajler/okruzenje koristis. Mogao bi malo da naucis da debagujes program.

yooyo

[Ovu poruku je menjao yooyo dana 17.05.2006. u 18:05 GMT+1]
[ peromalosutra @ 18.05.2006. 21:47 ] @
U pravu si, ne znam kako to nisam primjetio. Što se tiče debugera, nisam ga koristio jer mi je program ranije perfektno radio dok se matrica učitavala sa steka (sada mi nije jasno zašto), pa sam odmah pomislio da sam zeznuo nešto u prikazu matrice... Evo novog i ispravnog koda:
Code:

#include <iostream>
#include <fstream>
using namespace std;

void findObject(int i,int j,int k,int n,int **mat);     

int main(void)
{
    int n,i,j;
    ifstream in("input\\MATRIX.txt");    
    in >> n;
    
    //matrica na slobodnoj memoriji
    int **mat = new int*[n];
    for (i=0; i<n; i++)
        mat[i] = new int[n];
        
    //učivanje matrice
    char tmp[n];    
    for (int i=0; i<n; i++)
    {
        in >> tmp;
        for (int j=0; j<n; j++) 
        {
            if (tmp[j]=='0')
               mat[i][j]=0;
            else
                mat[i][j]=-1;
        }
    }
    in.close();    
    
    //obrada
    int k=1;
    for (i=0; i<n; i++)
        for (j=0; j<n; j++)
            if (mat[i][j]==-1)
            {
              findObject(i,j,k,n,mat);
              k++;
            }         
             
    //ispis matrice
    for (i=0; i<n; i++, cout << endl)
        for (j=0; j<n; j++)
            if (mat[i][j]!=0)
               cout << mat[i][j];
            else
                cout << ".";
    cout << "\nBroj likova u matrici: " << k-1 << "\n";
    
    system ("pause");
    return 0;
}

/*
  funkcija rekurzivno pronalazi skup jedinica u matrici
  i,j - koordinate člana matrice koji pripada liku
  k - indeks trenutnog lika u matrici
  n - veličina matrice
  **mat - pokazivač na matricu
*/
void findObject(int i, int j, int k,int n, int **mat)
{
     if (j+1<n)
        if (mat[i][j+1]==-1)
        {
           mat[i][j+1]=k;
           findObject(i,j+1,k,n,mat);
        }
     if (!(j-1<0))
        if (mat[i][j-1]==-1)
        {
           mat[i][j-1]=k;
           findObject(i,j-1,k,n,mat);
        }
     if (i+1<n)
          if (mat[i+1][j]==-1)
          {
             mat[i+1][j]=k;
             findObject(i+1,j,k,n,mat);
          }
     if (!(i-1<0))
        if (mat[i-1][j]==-1)
        {
            mat[i-1][j]=k;
            findObject(i-1,j,k,n,mat);
        }
}