Zapewnienie niezmienności przekazywanych tablic w funkcji

0

Tak jak w temacie, dokładnie chodzi o tablice dwuwymiarowe.

W pliku foo.h mam tylko deklaracje funkcji pokaz:

extern bool pokaz_tablice(const int**,unsigned int, unsigned int); 

W pliku foo.cpp deklaracja:

bool pokaz_tablice(const int** tab, unsigned int szer, unsigned int wys)
    {
        if(tab==NULL) return 0;
        int *wsk;
        //tab[1]=wsk;
        //tab[3][3]=124;
        for(int i=0; i<wys; i++)
        {
            for(int j=0; j<szer; j++)
            cout<<tab[i][j]<<" ";
            cout<<endl;
        }
        return 1;
    } 

Odwołanie z main:

 int **duza=NULL;
    tworz_tablice(duza,10,10);
    pokaz_tablice(const_cast<const int**>(duza),10,10);
    niszcz_tablice(duza,10,10);

Z tym żeby jawnie zapobiec zmianie wartości sobie poradziłem, ale zawsze da się podstawić jakiś wskaźnik pod dowolną komórkę tablicy.
Próbowałem dodać do funkcji const* i rzutować jako const int** const* ale to nie wypaliło. Dodam, że z niezmienności tablicy korzysta nie tylko funkcja pokaz_tablice.

0

Nie uda Ci się to, jak ktoś będzie chciał to zmieni wartość każdej zmiennej const przez odpowiednie rzutowanie i ustawienie wskaźnika.
Ten const_cast tu też nie ma sensu - on służy raczej do zdejmowania ograniczenia w postaci const.

0

spróbuj tak:

#include <iostream>
using namespace std;

void tworz_tablice(int**& tab, unsigned int szer, unsigned int wys)
{
  tab = new int*[wys];
  for (int i=0; i<wys; ++i)
    {
      tab[i] = new int[szer];
      for (int j=0; j<szer; ++j)
        tab[i][j] = 5;
    }
}

void niszcz_tablice(int**& tab, unsigned int szer, unsigned int wys)
{
  for (int i=0; i<wys; ++i)
    delete [] tab[i];
  delete [] tab;
  tab = NULL;
}

bool pokaz_tablice(int const * const * const tab, unsigned int szer, unsigned int wys)
{
  if(!tab)
    return 0;
  int *wsk;
  //tab[1]=wsk;
  //tab[3][3]=124;
  for(int i=0; i<wys; i++)
  {
      for(int j=0; j<szer; j++)
      cout<<tab[i][j]<<" ";
      cout<<endl;
  }
  return 1;
}

int main()
{
  int **duza=NULL;
  tworz_tablice(duza,10,10);
  pokaz_tablice(duza,10,10);
  niszcz_tablice(duza,10,10);
  return 0;
}

ale tak jak napisał @byku_guzio, const_castem można sprawić że będzie to edytowalne

0

Programujesz w C++, to może użyj vectora, lub nawet specjalnej klasy, w której odwoływanie do elementów będzie np. przez tab(a,b) (równoznaczne z poprzednim tab[a][b]), co przełoży się na wewnętrzna_struktura_danych[ilość_kolumn*a+b], co jest zdecydowanie szybsze (szczególnie jeżeli ilość kolumn jest potęgą dwójki). Nie wypowiem się co do dokładnej notacji dla stałych tablic wskaźników do stałych tablic wskaźników itd., bo dla własnego zdrowia psychicznego staram się być one-star programmer. Zdarza mi się z kolei w takich przypadkach nadużywać typedefów, ale to mi nigdy nie utrudniło życia, a wręcz często ułatwia, szczególnie przy używaniu bibliotek opartych na programowaniu generycznym (praktycznie nie da się programować w CGALu bez używania typedefów)

0

a jeśli nie chcesz skorzystać z gotowych pojemników z stl albo np z boost multiarray, opakuj tablicę 2D w klasę dla własnej wygody i bezpieczeństwa

0

Z tym żeby jawnie zapobiec zmianie wartości sobie poradziłem, ale zawsze da się podstawić jakiś wskaźnik pod dowolną komórkę tablicy.
No już bez przesady, walczysz z wrednym programistą?
Olej to.

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