funkcja tworzaca tablice const

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?

spartanPAGE
weź oddech i napisz to jeszcze raz, tym razem abstrahując od swoich prób implementacji.
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?

spartanPAGE
  • Rejestracja:prawie 12 lat
  • Ostatnio:20 dni
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?

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)