• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[C++] Wskaźnik do statycznej dwuwymiarowej tablicy

Object Storage Arubacloud
0 głosów
3,678 wizyt
pytanie zadane 9 maja 2015 w C i C++ przez tearius Nowicjusz (150 p.)

Witam wszystkich! Już piszę o co chodzi. 

Mamy następujący kod:

int tab[3] = { 1, 0, 2 };
int *wsk = tab;

I chcę przekazać taką tablicę do funkcji z parametrem (int *), to wszystko działa.

 

Ale co zrobić, jeśli mam przekazać dwuwymiarową tablicę statyczną do funkcji o nagłówku:

void fun(int **t);

 

Mając:

int tab[2][3]={
		{ 1, 0, 2 },
		{ 1, 0, 2 } 
	};

nie mogę zrobić:

int **wsk = tab;

Kompilator wyrzuca błąd

Error    1    error C2440: 'initializing' : cannot convert from 'int [2][3]' to 'int **'  

 

Więc pytanie brzmi: jak przekazać STATYCZNĄ, dwuwymiarową tablicę intów do funkcji, której parametrem jest (int **T) ?

Będę wdzięczny za podpowiedzi.

 

1 odpowiedź

+2 głosów
odpowiedź 9 maja 2015 przez MrWeb Stary wyjadacz (10,200 p.)
wybrane 9 maja 2015 przez tearius
 
Najlepsza

Przekazywanie C-Style tablic dwuwymiarowych jako argument funkcji jest dość uciążliwe (polecam std::vector / std::array) ale oczywiście wykonalne ;)
Dlaczego ? Ponieważ do stworzenia tablic na stosie

static int array[X][Y] = 
{  
  {1, 0, 2}, 
  {1, 0, 2} 
};

Kompilator musi znać jej rozmiar, i funkcje które będą z tej tablicy korzystać również muszą znać ten rozmiar (no chyba, że się napisze funkcję szablonową)

void doStuff(int (&ptr)[X][Y]);

Ta funkcja przyjmuje tablicę, ale jeśli z jej prototypu lub definicji zamienię 

int (&ptr)[X][Y] na
int (&ptr)[][]

To kompilator zgłosi mi błąd, twierdząc że nie może on przyjmować tablic tworzonych lokalnie bez znajomości jej rozmiaru. 

 

#include <iostream>
const std::size_t X = 2;
const std::size_t Y = 3;

void doStuff(int (&ptr)[X][Y]);

static int array[X][Y] = 
{  
  {1, 0, 2}, 
  {1, 0, 2} 
};

int main()
{
  doStuff(array);
}

void doStuff(int (&ptr)[X][Y])
{
  for(int y = 0; y < Y; y++)
  {
    for(int x = 0; x < X; x++)
    {
      std::cout << "array[" << x << "][" << y << "] = " << ptr[x][y] << std::endl;
    }
  }
}

 

Tutaj taka mała pokazówka tego zagadnienia.

I więcej informacji na ten temat - http://stackoverflow.com/questions/8767166/passing-a-2d-array-to-a-c-function

 

Edit:
Można też zrobić takie cuda :
 

#include <stdio.h>
// Same as "void print(int **arr, int m, int n)"
void print(int *arr[], int m, int n)
{
    int i, j;
    for (i = 0; i < m; i++)
      for (j = 0; j < n; j++)
        printf("%d ", *((arr+i*n) + j));
}
 
int main()
{
    int arr[][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
    int m = 3;
    int n = 3;
    print((int **)arr, m, n);
    return 0;
}

ale przy przekazywaniu argumentów, należy użyć rzutowania na typ int** dla tablicy... 

komentarz 27 grudnia 2015 przez gnx Dyskutant (7,720 p.)
Jest grudzień, a Twój post ratuje mi tyłek :) pozdrawiam

Podobne pytania

0 głosów
2 odpowiedzi 1,455 wizyt
pytanie zadane 15 maja 2018 w C i C++ przez Marte Nowicjusz (140 p.)
0 głosów
1 odpowiedź 2,814 wizyt
pytanie zadane 4 marca 2018 w C i C++ przez bartez86 Nowicjusz (220 p.)

92,584 zapytań

141,434 odpowiedzi

319,671 komentarzy

61,968 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...