Warsztat » Forum

[C++] tablica w klasie

Feb 7, 2005 | Fiolek |
39 wypowiedzi na 3 stronach:
1 2 3
Fiolek
Feb 7, 2005

tablica w klasie

Witam!

Problem jest banalny: programuję obecnie mapę i:
- wczytuję jej wymiary z pliku np.: 20 x 20 (ale mogę też wczytać inną np.: 32x18)
- następnie z wykorzystaniem tych danych tworzę nowy obiekt klasy "c_mapa", w której chciałbym mieć tablicę przechowującą wartości każdego z pól (0 -wolne pole, 1 - pole zajęte). Jest mi to potrzebne do określenia później drogi.

No i niestety stoję w miejscu i głowię się jak wpakować tablicę do klasy, co więcej tablicę, która będzie miała różne wielkości w zależności od wczytanej wielkości mapy... Może ktoś ma jakiś prosty przykładzik lub link jeżeli jest to gdzieś opisane?

Pozdrawiam
Złośliwiec
Feb 7, 2005

Odp: tablica w klasie

A czym się różni tablica w klasie od tablicy poza klasą? Pod względem "wpakowywania" w sumie niczym, więc nie rozumiem problemu.
Fiolek
Feb 7, 2005

Odp: tablica w klasie

To może zapytam tak: jak w klasie zadeklarować tablicę o zmiennej liczbie elementów?
iiasiey
Feb 7, 2005

Odp: tablica w klasie

Używasz klasy std::vector z biblioteki standardowej c++.

http://pl.wikibooks.org/wiki/C%2B%2B/Vector
zerlo
Feb 7, 2005

Odp: tablica w klasie

pole:
Kod: cpp]char* Array;


konstruktor:
Kod: cpp]Array = new char[width * height];


pobranie z x i y:
Kod: cpp]return Array[x + y * width];


destruktor:
Kod: cpp]//delete Array; - ZLE! Moj blad.
delete [] Array;


Poczytaj o wskaznikach i dynamiczym zarzadzaniu pamiecia (jakos tak). Opakowac to w klase nie problem. Troche podpada pod szkolke.

EDIT: Albo tak jak wyzej wspominal iiasiey. Wtedy mozna sie pokusic o wektor wektorow i miec normalna tablice/wekor 2D. W moim przykladzie tez by sie dalo, ale po co sie motac?

@Fiołek: Dzieki. Zawsze sie motam.
Syriusz
Feb 7, 2005

Odp: tablica w klasie

W skrócie:

jako pole klasy dajesz wskaźnik na wskaźnik do typu(żeby mieć dwuwymiarową tablice), alokujesz najpierw tablice wskaźników na wiersze tablicy, a potem alokujesz same wiersze.
Kod: class foo
{
private:
    typ** pointer;
public:
    bool alloc(unsigned cols, unsigned rows)
    {
        pointer = new typ*[rows];
        if(pointer == NULL)
            return false;
        for(unsigned i = 0; i < rows; ++i)
        {
            pointer[i] = new typ[cols];
            if(pointer[i] == NULL)
                return false;
        }
        return true;
    }
};


Jak widzisz niczym się to nie różni od zwykłego alokowania dynamicznych tablic, jak powiedział złośliwiec...
Fiołek
Feb 7, 2005

Odp: tablica w klasie

Tablica jednowymiarowa jest szybsza w alokowaniu i zwalnianiu niż tablica wielowymiarowa(nie potrzeba pętli) więc jest tu wskazana. Jeśli rozmiar jest stały, wektor można sobie odpuścić, zbędna zabawa.

@zerlo: nie "delete Array" tylko "delete [] Array", na Windowsie będzie działać, na Linuksie nie bardzo(przynajmniej jak sprawdzałem w trakcie OIG, etap I, Debian najnowszy).
iiasiey
Feb 8, 2005

Odp: tablica w klasie

Cytat:
Jeśli rozmiar jest stały, wektor można sobie odpuścić, zbędna zabawa.

No ale jakbyś czytał cały wątek, to byś wiedział, że nie jest stały.
Cytat:
Tablica jednowymiarowa jest szybsza w alokowaniu i zwalnianiu niż tablica wielowymiarowa(nie potrzeba pętli) więc jest tu wskazana.

To samo. Żeby odwzorować mapę chyba bardziej wskazana jest jednak tablica dwuwymiarowa...

Nie wydaje mi się, żeby vector był zbędną zabawą, po co wyważać otwarte drzwi (lub wynajdywać koło na nowo) ;)
Syriusz
Feb 8, 2005

Odp: tablica w klasie

Cytat:
Jeśli rozmiar jest stały, wektor można sobie odpuścić, zbędna zabawa.
Cytat:
No ale jakbyś czytał cały wątek, to byś wiedział, że nie jest stały.

Jak to nie stały, chyba fiolek nie przewiduje zmiany rozmiaru planszy w trakcie gry... I kto tu nie czyta do końca ;)...
skovron
Feb 8, 2005

Odp: tablica w klasie

Cytat:

Cytat:
Jeśli rozmiar jest stały, wektor można sobie odpuścić, zbędna zabawa.

No ale jakbyś czytał cały wątek, to byś wiedział, że nie jest stały.

No chyba jest właśnie stały. Różny dla każdego załadowania mapy ale w trakcie działania nie dodaje do niej nowych elementów.

Cytat:

Cytat:
Tablica jednowymiarowa jest szybsza w alokowaniu i zwalnianiu niż tablica wielowymiarowa(nie potrzeba pętli) więc jest tu wskazana.

To samo. Żeby odwzorować mapę chyba bardziej wskazana jest jednak tablica dwuwymiarowa...

Nie koniecznie. Ja zwykle robię tablicę jednowymiarową. Przeliczanie na konkretny indeks jest dziecinnie proste (y * size_x + x). Moim zdaniem dużo "trudniej" tworzyć i zwalniać dwuwymiarową dynamicznie alokowaną tablicę niż obliczać ten indeks.
Syriusz
Feb 8, 2005

Odp: tablica w klasie

Cytat:
Nie koniecznie. Ja zwykle robię tablicę jednowymiarową. Przeliczanie na konkretny indeks jest dziecinnie proste (y * size_x + x). Moim zdaniem dużo "trudniej" tworzyć i zwalniać dwuwymiarową dynamicznie alokowaną tablicę niż obliczać ten indeks.


Tworzysz i zwalniasz raz, a odwołujesz się do pól setki razy(zwykle)...
iiasiey
Feb 8, 2005

Odp: tablica w klasie

Cytat:
chyba fiolek nie przewiduje zmiany rozmiaru planszy w trakcie gry...

W sumie racja... ale czytałem cały wątek :P tylko nie pomyślałem ;)
Cytat:
Moim zdaniem dużo "trudniej" tworzyć i zwalniać dwuwymiarową dynamicznie alokowaną tablicę niż obliczać ten indeks.

W tym przypadku tak, ale z vectorem byłoby inaczej ;P
No i tak jak mówi Syriusz, to mogłoby być mniej wydajne...
yarpen
Feb 8, 2005

Odp: tablica w klasie

Cytat:

Cytat:
Nie koniecznie. Ja zwykle robię tablicę jednowymiarową. Przeliczanie na konkretny indeks jest dziecinnie proste (y * size_x + x). Moim zdaniem dużo "trudniej" tworzyć i zwalniać dwuwymiarową dynamicznie alokowaną tablicę niż obliczać ten indeks.


Tworzysz i zwalniasz raz, a odwołujesz się do pól setki razy(zwykle)...

Odwolanie i tak zresolve'uje sie do czegos podanego powyzej. A zamiast jednego spojnego bloku pamieci bedziesz mial sieczke.
Fiolek
Feb 8, 2005

Odp: tablica w klasie

Jestem pod wrażeniem Waszej prędkości :D

Powiem szczerze, że tak na wstępie najbardziej przemówił do mnie pomysł zerlo, jest prosty i logiczny. Mam do niego tylko jedno pytanie: gdy zaraz po utworzeniu tej tablicy odczytuję jej pole poprzez:

Kod: mapa->tablica[3]; //mapa to nazwa obiektu klasy c_mapa a tablica to to samo co Array zerlo


dostaję śmieci a konkretniej: -842150415. Dodam tylko, że dla każdego innego pola wartość ta wynosi tyle samo. Oczywiście nie ma problemu - zaraz i tak w całą tablicę powkładam swoje cyferki ale tak mnie to zastanawia czemu? :P
iiasiey
Feb 9, 2005

Odp: tablica w klasie

Mogę ci odpowiedzieć? ;) Nowo zaalokowane elementy twojej tablicy mają wartości takie, jakie wcześniej znajdowały się w tych miejscach pamięci, w których się teraz znajdują ;)
vashpan
Feb 9, 2005

Odp: tablica w klasie

Jezeli nie zainicjalizowales tablicy jakimis wartosciami jest to normalne w C i C++. Odwolujesz sie do pamieci ktora juz jest zaalokowona, ale nie zostay jej przypisane wartosci. To ze wartosci sa takie same to wlasciwie przypadek.

Dzieje sie tak ze wzgledu na wydajnosc.

// EDIT: eh za szybkie to forum ;p
Strony:
1 2 3