funkcja tworzaca tablice const

0

Witam,

Mam program gdzie caly interfejs jest w pliku main.c. Reszta danych jest przechowywana w klasach (az jednej ;p). Teraz potrzebuje zrobic cos takiego. Stworzyc dosc specyficzna tablice, ktora ma ok 10k elementow, ktorych wartosci sa w miare przypadkowe. Napisalem sobie 3 funkcje, ktora tworza ta tablice.

zmienna globalna: int tabela_wzorcowa[10k];

stworz_tabele(int dane[][]) tabele tymczasowe, jako zmienne automatyczne, ktore sa przekazane do polacz_tabele
polacz_tabele_w_jedna(int dane[][]); -> wrzuca element w tabel tymczasowych, do tabeli wzorcowej[10k] -> ktora jest globalna
sortuj_tabele(int tabela_wzorcowa[][]) -> porzadkuje tabele wzorcowa[10k]

Funkcje dzialaja, jest wszystko ok. Jednak mam jedno ale... Z poziomu aplikacje moge przypadkowo zmienic wartosci tabeli "tabela_wzorcowa[10k]". Nie moge wrzucic slowka "const" bo wtedy te funkcje nie beda dzialac.

Jak osiagnac taki efekt, ze stworze tabele_wzorcowa[10k] za pomoca kilku funkcji, a nastepnie bede mogl jej element porownywac w pliku main.c tylko do odczytu (bez mozliwosc jej edycji)? Mam te wszystkie funkcje wrzucic do klasy? Zrobic cos takiego:

klasa
{
private tabela_wzorcowa[10k]
private stworz_tabele(int dane[][])
polacz_tabele_w_jedna(int dane[][])
sortuj_tabele(int tabela_wzorcowa[][])

public przegladaj_wartosci_tabeli()

}

wtedy bede mial zabezpieczona tabele tak, ze w main.c nie bede mogl zmienic wartosci zapisanych w tabeli tabela_wzorcowa[10k]? Dobrze kombinuje?

0

Dobra, przepraszam, ze kolega niezrozumial, widocznie zle napisalem.

Mam plik: main.c, ktory wyglada mniej, a wiecej tak:

tabela_wzorcowa[10k] = {0}-> zmienna globalna
// funkcje, ktora tworza zawartosc tabeli globalnej
void stworz_tabele(int dane[][]) -funkcja,
void sortuj_tabele(int tabela_wzorcowa[][])
void tabela_wzorcowa[10k] // uporzadkowa tabela, posortowana od najmniejszego do najwiekszego elementu.

main.c
{
// obsluga calego interfejsu programu

//Tworze skomplikowana tabele wzorcowa
stworz_tabele(int dane[][])
sortuj_tabele(int tabela_wzorcowa[][])
gotowa_tabela_wzorcowa(tabela_wzorcowa[10k] )

// Aby program dzialal prawidlowo musze ciagle przeszukiwac tabele: tabela_wzorcowa[10k]. Tabela ta ma posortowane elementy, od najmniejszego do najwiekszego. Interesuje mnie jednak tylko nr indeksu tabeli. Nr indeksu odczytuje na podstawie przechowywanej wartosci w tabeli.

szukaj_w_tabeli_wzorcowej(tabela_wzorcowa[], int klucz_szukania)
{
for(i=0;i<max;i++)
if(klucz_szukania == tabela_wzorcowa[i]
return i;
}

//Znajac wartosc "i" indeksu z tabeli, program wykonuje reszte funkcji

}

Program dziala. Wszystko jest ok.. Po za jedna rzecza. W pliku main.c moge przypadowo zmienic zawartosc tabeli: tabela_wzorcowa[10k]. Tabela ta w zaden sposob nie jest zabezpieczona przed nieumyslna zmiana jej wartosci. Nie moge dodac slowa const, bo wtedy napisane funkcje nie beda dzialac. Ciagle operuje na wskaznikach i sie boje, ze w ktoryms momencie wpisze jakies bledne dane do tej tabeli i reszta programu bedzie zle dzialac. Po jednokrotnym wykonaniu funkcji:

void stworz_tabele(int dane[][]) -funkcja,
void sortuj_tabele(int tabela_wzorcowa[][])
void tabela_wzorcowa[10k]

chcialbym aby tabele_wzorcowa w reszcie programu byla tylko "tylko do odczytu". Aby nie mozna bylo modyfikowac jej zawartosci. W definicji globalnej nie moge tego zrobic, bo wtedy nie stworze danych wejsciowych do tej tabeli.

Lepiej czy nadal zachaotycznie?

0

Najłatwiej będzie, kiedy zostawisz w spokoju zmienne globalne.
Kolejnym łatwym sposobem będzie trzymanie tabela_wzorcowa w osobnym pliku .cpp/.c, w ten sposób dostęp do niej będziesz miał tylko z tego jednego pliku i tam właśnie powinieneś upchać kod operujący na tej tabelce.

0

No wlasnie, mysle o osobny pliku .h oraz .cpp. A jest sens chowac tablice tablica_wzorcowa[10k] do klasy? Ustawie ja jako private tablica_wzorcowa[10k], a funkcje szukaj_w_tabeli_wzorcowej(tabela_wzorcowa[], int klucz_szukania) ustawie jako publiczna? Reszte funkcje napisze w tym dodatkowym pliku juz po za klasa. Dobrze kombinuje?

Przy okazji zalezy mi na tym aby tablice pomocnicze, ktore zajmuja duzo pamieci Od razu zostaly usuniete gdy skoncze obliczenia. Rozumiem, ze tak sie stanie gdy je beda deklarowane wewnatrz funkcji, a nie jako zmienne globalne. Tylko tablica_wzorcowa[10k] powinna siedziec w pamieci komputera.

0

Nie wiem czy moje myslenie z wykorzystaniem klas jest poprawne. Tablica ma zostac obliczona tylko raz, a nie za kazdym razem gdy bede wywolywal funkcja: szukaj_w_tabeli_wzorcowej(tabela_wzorcowa[], int klucz_szukania) . Funkcja ta ma tylko odczytywac zawartosc z klasy, a nie inicjalizowac nowe obliczenia. Dobrze kombinuje?

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