[C++]Przekazanie tablicy dwuwymiarowej do funkcji nie znając jej wymiarów

0

UWAGA
Wiem, że w internecie jest dużo pytań o to, jednak niewiele rozumiałem z podanych tam rozwiązań, ponieważ uczę się programować dopiero nieco poniżej roku. Proszę więc o DOKŁADNE, SZCZEGÓŁOWE I CZYTELNE OPISY.

Mój problem jest następujący. W funkcji main() deklaruję tablicę dwuwymiarową o rozmiarach podawanych przez użytkownika w czasie działania programu, oraz wypełniana jest ona także przez niego. Następnie ta tablica przekazywana jest do funkcji typu int razem z jej wymiarami. Niestety, kiedy uruchamiam kompilację programu, otrzymuję następujący błąd:
|29|error: cannot convert 'int (*)[(((unsigned int)(((int)b) + -0x000000001)) + 1)]' to 'int**' for argument '3' to 'int rysuj(int, int, int**)'|

Poniżej wklejam kod programu:

 #include <iostream>
using namespace std;

int rysuj(int w, int k, int **tab)
{
    for(int i = 0; i < w; ++i)
    {
        for(int j = 0; j < k; ++j)
        cout << tab[i][j] << " ";
        cout << endl;
    }
}

int main()
{
    int a, b;
    cin >> a >> b;

    int tablica[a][b];
    for(int i = 0; i < a; ++i)
    {
        for(int j = 0; j < b; ++j)
        cin >> tablica[i][j];
    }

    rysuj(a, b, tablica);
}

Prosiłbym o zweryfikowanie kodu i stwierdzenie jaki błąd popełniłem, oraz jak mam go naprawić.

0

Nie możesz tak przekazać tablicy dwuwymiarowej, tylko tak:

int rysuj(int w, int k, int *tab)
  {
   for(int i=0;i<w;++i,cout<<endl) for(int j=0;j<k;++j) cout<<tab[i+j*k]<<" ";
  }
0

Twoja funkcja nie zwraca liczby całkowitej tylko nic, więc powinna być typu void a nie int. Użyj tablicy dynamicznej Tablice

0

Przepraszam pomylilem sie w komentarzu, a wiec mozna to zrobic tak:

int func(int** tab) {
	return 0;
}

int func2(int tab[][10]) {
	return 0;
}

int main() {
	int tab[10][10];
	int (*ptr)[10];
	int** tab2 = new int*[10];
	for(int i = 0; i < 10; i++)
		tab2[i] = new int[10];

	func2(tab);
	func2(ptr);
	func(tab2);

//OCZYWISCIE TUTAJ DEALOKACJA!

	return 0;
}
0
_13th_Dragon napisał(a):

for(int i=0;i<w;++i,cout<<endl) for(int j=0;j<k;++j) cout<<tab[i+j*k]<<" ";

Dlaczego umieściłeś cout w nawiasie od pętli for?
I dlaczego tab[i+j*k], jeżeli jest to tablica dwuwymiarowa?

Poza tym, sprawdziłem twój sposób i nadal jest ten sam błąd, ponieważ według mojego kompilatora(Code:Blocks) błąd znajduje się tutaj:
rysuj(a, b, tablica);

0

Twoja funkcja nie zwraca liczby całkowitej tylko nic, więc powinna być typu void a nie int.

Poprawiłem typ funkcji rysuj na void, nic to nie dało, błąd jest nadal taki sam i w tym samym miejscu.

0

Gdybyś nie chciał zmieniać deklaracji funkcji to można zrobić tak:

 
int rysuj(int w, int k, int **tab)
{
    int * wsk = *tab;
    for(int i = 0; i < w; ++i)
    {
        for(int j = 0; j < k; ++j)
        cout << wsk[i + j * k] <<"\n"; //jak napisał _13th_Dragon
    }
}

a przesłać tablicę tak:

 
 int * wsk = tablica[0];
 rysuj(a, b, &wsk);
0

Cześć,

z tego co się uczyłem to statycznej tablicy dwuwymiarowej, nie przekażesz w taki sposób do funkcji, chyba że z góry wiesz jakiego będzie rozmiaru.
Jeżeli chcesz operować na tablicach, których rozmiar ustalany jest w trakcie działania programu, skorzystaj z tablic alokowanych dynamicznie.

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