Zapewnienie niezmienności przekazywanych tablic w funkcji

Odpowiedz Nowy wątek
2011-08-10 13:12
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.

Pozostało 580 znaków

2011-08-10 13:16
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.


edytowany 1x, ostatnio: byku_guzio, 2011-08-10 13:16

Pozostało 580 znaków

2011-08-10 15:56
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


░█░█░█░█░█░█░█░█░█░█░█░

Pozostało 580 znaków

2011-08-10 19:52
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)

Pozostało 580 znaków

2011-08-11 23:15
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

edytowany 1x, ostatnio: yet_another_bug, 2011-08-11 23:16

Pozostało 580 znaków

2011-08-12 08:35
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.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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