Tablica 2-wymiarowa jako argument funkcji

Tablica 2-wymiarowa jako argument funkcji
kocór
  • Rejestracja:ponad 11 lat
  • Ostatnio:prawie 10 lat
  • Postów:27
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:

Kopiuj
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:

Kopiuj
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

edytowany 2x, ostatnio: kocór
spartanPAGE
  • Rejestracja:prawie 12 lat
  • Ostatnio:dzień
1
Kopiuj
void Fun(char **array, unsigned width, unsigned height);
edytowany 3x, ostatnio: spartanPAGE
kocór
  • Rejestracja:ponad 11 lat
  • Ostatnio:prawie 10 lat
  • Postów:27
0

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

Kopiuj
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

matek3005
  • Rejestracja:około 15 lat
  • Ostatnio:prawie 5 lat
  • Postów:358
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ę:
Kopiuj
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.
edytowany 4x, ostatnio: matek3005
kocór
  • Rejestracja:ponad 11 lat
  • Ostatnio:prawie 10 lat
  • Postów:27
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.

edytowany 2x, ostatnio: kocór
matek3005
Nie zauważyłem wcześniej, że chodzi o C. Wersję z referencją w takim razie w C powinno zastąpić się wskaźnikiem. Idea jednak pozostaje.
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 dni
0
Kopiuj
#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;
  }

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 3x, ostatnio: _13th_Dragon
kocór
  • Rejestracja:ponad 11 lat
  • Ostatnio:prawie 10 lat
  • Postów:27
0
Kopiuj
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.

edytowany 4x, ostatnio: kocór
_13th_Dragon
Dostałeś schemat zaś potrzebujesz gotowca, ale pech.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.