Tablica 2-wymiarowa jako argument funkcji

0

Przydałaby mi się funkcja która jako argumenty przyjmowałaby : liczba wierszy / liczba kolumn / tablica do której ma to wpisać.
W pewnym tutorialu dowiedziałem się że jest to niemożliwe ?
wiem ze w takiej postaci kod zadziała:

void wczytaj(char tab[3][3])
{
    for (int i = 0; i<3; i++)
        for (int j = 0; j<3;j++)
            scanf("%c",tablica[i][j]);
}

int main()
{
    char tablica[3][3];
    wczytaj(tablica);
    ....

a ja chcialbym cos takiego:

void (int wiersz , int kolumna , char tablica[][])  // [] - jednowymiarowa przechodzi natomiast [][] - dwu juz nie
{
    for (int i = 0; i<wiersz; i++)
        for (int j = 0; j<kolumna;j++)
            scanf("%c",tablica[i][j]);
}
int main()
{
    char tablica[21][51]; // tutaj moge z gory zalozyc wielkosc ale procedura juz musi byc uniwersalna ;S
    wczytaj(tablica);
    ...

Czy istnieje jakaś możliwość by to obejść? i żeby ew. kod nie zajmował 50 linijek ? xD

1
void Fun(char **array, unsigned width, unsigned height);
0

Do tego już sam doszedłem ;S przy czym w taki wypadku muszę stworzyć tablice dynamicznie w mejnie :

char **tablica = new char *[51];
for ( int i = 0; i < 51; ++i )
   tablica[i] = new char [22];

Ale jak tak zrobię to cały program się wsypuje ;/ (w wielu miejscach). z czego pierwszy to :
error C2065: "new" : niezadeklarowany identyfikator

0
kocór napisał(a):

Do tego już sam doszedłem ;S przy czym w taki wypadku muszę stworzyć tablice dynamicznie w mejnie

no tak, a jak chciałbyś inaczej? Rozmiar tablicy statycznej jest znany w czasie kompilacji i w twoim przypadku wskaźnik na twoją tablicę jest typu char [][51], co różni go od wskaźnika typu char**. Chcesz uniknąć tablicy dynamicznej, to:

  • przekaż przez wskaźnik typu char [][51]
    *opakuj tą statyczną w jakąś klasę:
struct Bar {
    int t[21][51];
};

void foo(int w, int h, Bar & tablica)
{
   (...)
}

int main()
{
    Bar tablica;
    foo(2, 2, tablica);
  • używaj jednowymiarowej.
0

Źle mnie zrozumiałeś :) nie mam nic przeciwko tablicy dynamicznej. Chciałem pokazać przykład jak to robię gdyż kompilator wywala mi błąd i nie wiem co jest grane gdyż biorę praktycznie gotowe wzorce kopiuj/wklej a i tak mam błędy.

#up
Ten przykład jest bardzo ładny ale co w przypadku 2 tablic(inne wymiary)? musiałbym robić strukturę struktur.

0
#include <stdio.h>

void wczytaj(char *tab,unsigned Y,unsigned X)
  {
   for(unsigned y=0;y<Y;++y) for(unsigned x= 0;x<X;++x) scanf("%c",tab+y*X+x);
  }
 
int main()
  {
   char tablica[3][3],tb[7][2];
   wczytaj((char*)tablica,sizeof(tablica)/sizeof(*tablica),sizeof(*tablica)/sizeof(**tablica));
   wczytaj((char*)tb,sizeof(tb)/sizeof(*tb),sizeof(*tb)/sizeof(**tb));
   return 0;
  }
0
void wczytaj(char *tab,unsigned Y,unsigned X)
  {
   for(int y=0;y<Y;++y) //burzy sie ze y i Y nie sa tego samego typu - zmienilem w deklaracji unsinged na int ?
   for(int x= 0;x<X;++x) //burzy sie ze x i X nie sa tego samego typu
   scanf("%c",tablica[y*X+x]); // tablica niezadeklarowana zmieniłem na tab
  }
 
int main()
  {
   char tablica[3][3];  //błąd składniowy: brakuje ";" przed "typ"
   wczytaj((char*)tablica,sizeof(tablica)/sizeof(*tablica),sizeof(*tablica)/sizeof(**tablica)); //error C2065: "tablica" : niezadeklarowany identyfikator oraz error C2100: niedozwolony operator pośredni
   return 0;
  }

EDIT juz działa.

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