Funkcja void i przekazanie tablicy

0

Oto mój problem: Piszę program w C++ i mam tablice dwuwymiarowa tab[20][20] i teraz chce ja przekazać funkcji typu void, funkcja ta ma wykonać pewne operacje na elementach tablicy i oczywiście zapisać swoje zmiany w tej tablicy. Mógłby ktoś mi pomóc? dodam że tablica jest typu int... Gdy miałem do takiej funkcji wczytać zmienna typu int czy double dokonywałem tego poprzez referencje czyli np. void nazwaFunkcji( int &a) a z tablicą dwuwymiarową nie mogę sobie poradzić...

1

Z postu wynika, że tablica ma być statyczna i znasz jej rozmiar. Ułatw sobie trochę życie za pomocą typedef:

const size_t ARRAY_DIM = 20;
typedef int Array20x20[ARRAY_DIM][ARRAY_DIM];

I wtedy funkcja wygląda prosto:

void funkcja(Array20x20 &array);

Czy takie coś Cię satysfakcjonuje?

0

Coś słabo szukasz. Nazwa tablicy jest jednocześniej adresem jej pierwszego elementu (tj. o indeksach [0][0] w twoim przypadku). Musisz przekazać funkcji ten adres(nazwe tablicy) i rozmiary. W necie w kursach jest pełno informacji jak to zrobic.

0

Tablica dwuwymiarowa to wskaźnik na wskaźnik nie potrzebna jest referencja wystarczy że przekażesz adress


void Foo(int ** T)
{
    T [0][0] = 1;
}
//...
int Tab[20][20];
Foo(Tab);

 
0

Yann zrobiłem to tak jak napisałeś, jednak przy wywołaniu funkcji tam gdzie jest Foo(tab) podkreśla mi tab i wyskakuje błąd: error C2664: 'Foo' : cannot convert parameter 1 from 'int [20][20]' to 'int **' i nie wiem co zrobić... Endrju twojego rozwiązania nie sprawdzałem jednak wolałbym to zrobić w inny sposób bo typedef nigdy nie używałem i nie wiem jak się nim posługiwać...
Kod wygląda tak

void Foo(int ** tab)
{
tab[0][0]=1;
}
/..../
int tab[20][20];
Foo(tab);

0
Yann napisał(a):

Tablica dwuwymiarowa to wskaźnik na wskaźnik nie potrzebna jest referencja wystarczy że przekażesz adress

Antoś napisał(a):

Yann zrobiłem to tak jak napisałeś, jednak przy wywołaniu funkcji tam gdzie jest Foo(tab) podkreśla mi tab i wyskakuje błąd: error C2664: 'Foo' : cannot convert parameter 1 from 'int [20][20]' to 'int **' i nie wiem co zrobić...

Tutaj właśnie wychodzi popularny błąd, że tablica to wskaźnik. Tablica to nie jest wskaźnik, to zupełnie inne typy.

Antoś napisał(a):

Endrju twojego rozwiązania nie sprawdzałem jednak wolałbym to zrobić w inny sposób bo typedef nigdy nie używałem i nie wiem jak się nim posługiwać...

Może po prostu czas nauczyć się języka, z którego się korzysta?

0

No właśnie ciągle się uczę... A mógłbyś wyjaśnić jak wypełnia się tak zdefiniowaną tabele? albo gdzie mogę znaleźć takie wyjaśnienie?

1

Najprościej tak jak napisał Endrju:

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

const size_t ARRAY_DIM=3;
typedef int Array20x20[ARRAY_DIM][ARRAY_DIM];

void funkcja(Array20x20 &array)
  {
   for(size_t y=0;y<ARRAY_DIM;++y,cout<<endl)
     {
      for(size_t x=0;x<ARRAY_DIM;++x)
        {
         cout<<setw(3)<<array[y][x];
        }
     }
  }

int main()
  {
   Array20x20 Tb={{1,2,3},{4,5,6},{7,8,9}};
   funkcja(Tb);

   return 0;
  }
0

Wielkie dzięki _13th_Dragon na podstawie twojego kodu to zrozumiałem. Endrju dzięki za nakierowanie na typedef. Teraz wszystko mi działa ;)

0

Jeszcze jedno pytanie... A jak wciągnąć w taki sposób do funkcji dwie różne tablice? powiedzmy jedna 20 na 20 a druga 10 na 10?
void nazwaFunkcji (Array10x10 &array,Array20x20 &array)? ale później jak się do nich odwoływać? jak była jedna tablica to nie było problemu bo pisało się array[i][j] i było ok, a teraz?

0
void nazwaFunkcji (Array10x10 &a10,Array20x20 &a20)
  {
   a10[0][0]=10;
   a20[0][0]=20;
  }
1

A jak operujesz na wielu tablicach, które mają różne wymiary można sobie pomóc szablonami:

template<typename Type, int Width, int Height>
struct Array
{
	typedef Type Type[Width][Height];
};

void function(Array<int, 2, 2>::Type& array1, Array<int, 2, 2>::Type& array2)
{
	array1[0][0] = array2[1][1];
}
1

Dodam tylko, że w C++11 kod @Rev będzie jeszcze ładniejszy:

template<typename Type, int Width, int Height>
using Array2d = Type[Width][Height];

int function(Array2d<int, 3, 3> &a) {
  return a[0][0];
}

http://en.wikipedia.org/wiki/C%2B%2B11#Alias_templates

0

Rozmiary tablic będą z góry określone i znane podczas kompilacji, czy dopiero podczas uruchomienia programu będzie wyznaczony rozmiar? Różnica jest taka, że będziesz musiał użyć albo tablic statycznych (int tablica[wysokosc][szerokosc]) albo dynamicznych (int **tablica), obie propozycje były sugerowane.

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