Przekazywanie tablicy wielowymiarowej do funkcji [C++]

0

Jak tablicę dwuwymiarową odebrać w funkcji jako wskaźnik ?


void fun(int **wsk); // deklaracja funkcji;
int tab[10][10];

//jak wywołać taką funkcję ? dla tablicy jednowymiarowej podawało się jej nazwę, czyli adres zerowego elementu 
0

Tak samo.

fun(tab);

Przydała by się jeszcze wiedza o wymiarach.</del>

E, nie. Sam sobie odpowiedziałeś niżej i masz rację. My bad.

0

Jeśli tak napisze to visual od razu podkreśla mi argument funkcji i daje wskazówkę - Error: argument of type "int (*)[10]" is incompatible with parameter of type "int **" Podczas próby kompilacji - error C2664: 'fun' : cannot convert parameter 1 from 'int [10][10]' to 'int **' Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

0

Przy takim wywołaniu jak

fun(tab); 

deklaracja powinna wyglądać chyba tak:

void fun(int (*t)[10]);

Deklaracja:

void fun (int **) 

jest chyba niepoprawna w tym wypadku na takiej samej zasadzie jak :

 
int** ptr = new int[value][10]; 
0
  1. Przekazujesz wskaźnik.
  2. Wskaźnik nie przenosi informacji o rozmiarze i ilości wymiarów.
  3. Tablice wielowymiarowe (macierze) są mapowane na jednowymiarową tablicę w pamięci.
  4. Funkcja nie wie co się kryje pod danym wskaźnikiem, prócz zadeklarowanego typu przechowywanych danych. Jak ma być interpretowany blok pamięci znajdujący się pod tym wskaźnikiem zależy od programisty. Jeśli masz macierz zaalokowaną statycznie, musisz jedynie powiedzieć kompilatorowi, że jesteś w pełni władz umysłowych i wiesz co robisz. Informujesz go o tym poprzez rzutowanie (pamiętaj, rzutowanie nie konwertuje automagicznie typu, a jedynie mówi kompilatorowi jak ma traktować dany blok pamięci w tym miejscu).
#include <stdio.h>


int  rowcol(int  *tab, unsigned int  rows, unsigned int  cols, unsigned int  idx_row, unsigned int  idx_col) {
    if ( (idx_row > rows) || (idx_col > cols) )
        return 0;
    return tab[(idx_row * cols) + idx_col];
}


int  main(int  argc, const char  *argv[])
{
    int     tab[2][10] = {
                            {1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
                            {11, 12, 13, 14, 15, 16, 17, 18, 19, 20}
                         };


    printf("%d, %d\n", tab[1][5], rowcol((int*)tab, 2, 10, 1, 5));
    return 0;
}

Odwoływanie się po indeksach w funkcji jest... powiedzmy trudne. Postaw się w sytuacji funkcji. Dostajesz namiary na blok pamięci i ktoś Cię pyta jaka jest wartość w drugim wierszu, kolumnie piątej. Musisz najpierw wiedzieć ile jest wierszy i kolumn, a takiej informacji nie posiadasz. Blok pamięci o rozmiarze 30 elementów może przechowywać macierz np. 3x10 czy 5x6. Wskaźnikiem możesz jedynie powiedzieć "hej, pod tym adresem pamięci znajduje się początek tablicy intów".

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