Wskaznik na tablice 2wymiarowa;

0
#include <cstdlib>
#include <iostream>

using namespace std;
void mina(char **mine_field,int i,int j)
{
    for(int a=i-1;a<=i+1;a++)
    {
        for(int b=j-1;b<=j+1;b++)
        {
        if(  (int)mine_field[a][b]>(int)'0' && (int)mine_field[a][b]<=(int)'9')
            {
            mine_field[a][b]++;
            }
        
        }
    } 
} 


int main(int argc, char *argv[])
{
    int roz_x,roz_y;
    cin>>roz_y>>roz_x;
    char mine_field[roz_x+2][roz_y+2];
    for(int i=1;i<=roz_x;i++)
    {
            for(int j=1;j<roz_y+1;j++)
            {
             cin>>mine_field[i][j];
             if(mine_field[i][j]=='.')
             {
              mine_field[i][j]='0'; 
             }         
            }
    }
    
    for(int i=1;i<=roz_x+1;i++)
    {
            for(int j=1;j<roz_y+1;j++)
            {
             cout<<mine_field[i][j];
             if(mine_field[i][j]=='.')
             {
              mina(mine_field,i,j);
             }         
            }
            cout<<endl;
            
    }
    
    system("pause");
    
    
}

Sypie się na wywołaniu mina(mine_field,i,j);
mine_field to tablica 2 wymiarowa więc czemu nie mogę użyc w funckji **tablica?

cannot convert char (*)[(((unsigned int)(((int)roz_y) + 1)) + 1u)]' to char**' for argument 1' to void mina(char**, int, int)'

0
cin >> roz_y >> roz_x;

char mine_field[roz_x + 2][roz_y + 2];

W ten sposób tablic w C++ się nie definiuje. Ich rozmiar musi być znany w czasie kompilacji. Popraw to, a problem prawdopodobnie sam się rozwiąże.

0

W C można zgodnie z C99 deklarować tablice w taki sposób, jest to także wspierane przez wiele kompilatorów C++, więc nie uważałbym tego za błąd (dla purystów C++, czy kompilator używany przez ciebie spełnia standard w przypadku słowa kluczowego export).

Problemem tutaj jest to, że dwuwymiarowa tablica nie jest wskaźnikiem do wskaźnika. W zrozumieniu tego należy wiedzieć, że np. po deklaracji int z[6], z nie jest wskaźnikiem. Jest to nazwa, która określa 6 kolejno zarezerwowanych intów. Z drugiej strony int y=new int[6]; y jest wskażnikiem do miejsca zarezerwowanego na 6 intów. W C (i C++) można używać obydwu tych typów zamiennie, np. podając do funkcji z (będące nazwą danego miejsca) w rzeczywistości podawany jest wskaźnik odpowiadający początkowi tablicy. Kłopot pojawia się dopiero przy tablicach o większej liczbie wymiarów.

Przykładowo deklarując tablicę x[3][3], rzeczywiście x jest nazwą miejsca zarezerwowanego na 9 intów. C dodatkowo "ułatwia" w tym wypadku operace poprzez obsługę odwołań poprzez np. x[1][2]. Ale w tym wypadku nie da się przekonwertować x na wskaźnik do wskaźnika, jedyna możliwość to wskaźnik do tablicy o wielkości 3 elementów (int* b[3] lub int b[][3] w funkcji). Często jednak (choć nie wydajnie) tworzy się dynamicznie tablice wielowymiarowe w następujący sposób:

 int main(){
	int a;
	cin>>a;
	int* b=new int[a*a];
	int **wyn=new int*[a];
	for (int i=0; i<a; i++){
		wyn[i]=b+i*a;
	}
	return 0;
}

Tak utworzone tablice nie są kompatybilne z tablicami utworzonymi statycznie.

0

do tablic wielowymiarowych polecam boost::multi_array. jest to prawdziwa tablica dwuwymiarowa (jak, nie przymierzając, w Pascalu) a nie tablica tablic (a taką jest int** czy vector<vector<int>>).

#include <boost/multi_array.hpp> // no, boosta do tego trzeba mieć…
// tablica charów, 2-wymiarowa, rozmiary roz_x+2 × roz_y+2
boost::multi_array<char,2> mine_field(boost::extents[roz_x + 2][roz_y+2]);

1 użytkowników online, w tym zalogowanych: 0, gości: 1