CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Tablice w klasach. Dziwny problem

Tablice w klasach. Dziwny problem

dział ogólny

Tablice w klasach. Dziwny problem

Postprzez Krzysiu555 » piątek, 27 sierpnia 2010, 16:45

Witam,
Tytuł tematu dziwny bo ciężko zdefiniować mój problem.
Generalnie piszę teraz program który będzie symulatorem gry w karty konkretnie w makao. To dopiero początek ale mam już rozpisany algorytm gry samej w sobie oraz odpowiedzi na rzuconą kartę, a także zrobioną klasę gracza i funkcję tasującą karty. Teraz planowałem się wziąć za rozdawanie kart. Miałem już gotowy pomysł na to i napisałem całość ale funkcja wyrzucała mnóstwo błędów więc okroiłem ją żeby znaleźć błąd - teraz rozdaje 5 pierwszych kart z tablicy KARTY do tablicy REKA pierwszego gracza. Z pozostałymi trzema graczami nic nie robię. Po czym po odpaleniu programu okazuje się że nie wiadomo czemu inni gracze (z którymi nic nie robiłem) też mają jakieś karty?!?

Trochę kodu...
Klasa gracz:
Kod: Zaznacz cały
class gracz
{
private:
 //int numer;     //przochowuje numer gracza
   int stop;      //ilosc kolejek ktore stoi
   bool human;    //jesli true to człowiek, default false komputer
public:
   String odpowiedz(String karta); //zwraca string z kartą wybraną na podstawie podanego stringa karta
   gracz(bool hum);  //konstruktor człowieczeństwa
   gracz(void);      //konstruktor domniemany  human=false stop=0
   String REKA[];    //karty ktore gracz ma w reku
}; 

fragment public klasy TForm1 (głównej programu):
Kod: Zaznacz cały
public:        // User declarations
        
__fastcall TForm1(TComponentOwner);
        
String TALIA[52];       //przechowuje wszystkie karty uporządkowane
        
String KARTY[52];       //potasowana talia
        
String STOL[];          //przechowuje karty na stole
        
void tasuj();           //losuje karty z TALIA i wstawia do KARTY
        
void rozdaj(int x);     //przenosi karty z KARTY do REKA graczy tak by mieli ich po x
        
int losujkolejke(int z);//losuje liczbe z przedziału 1-x
        
String kartastol;       //wierzchnia karta
        
gracz player1;               //tworzenie graczy
        
gracz player2;
        
gracz player3;
        
gracz player4

funkcja rozdaj():
Kod: Zaznacz cały
void TForm1::rozdaj(int x)
{
  
int i;
  for(
i=0;i<x;i++)
  {
   
player1.REKA[i] = KARTY[i];
   
KARTY[i]="";
  }

kliknięcie przycisku uruchamia funkcję rozdaj i listuje karty graczy (dla podglądu):
Kod: Zaznacz cały
void __fastcall TForm1::Button3Click(TObject *Sender)
{
  
rozdaj(5);
  
int i;
  for(
i=0;i<5;i++){
  
ListBox3->Items->Add(player1.REKA[i]);
  }
  for(
i=0;i<5;i++){
  
ListBox4->Items->Add(player2.REKA[i]);
  }
  for(
i=0;i<5;i++){
  
ListBox5->Items->Add(player3.REKA[i]);
  }
  for(
i=0;i<5;i++){
  
ListBox6->Items->Add(player4.REKA[i]);
  }

i teraz o dziwo rezultatem jest coś takiego:
Obrazek
widać zależność że trzy ostatnie karty jednego gracza są trzema pierwszymi kolejnego
ale skąd to się wzięło? czy mam coś z tymi klasami źle zrobione? czy może kompiluje się jeszcze ten stary kod który nie działał? ja nie mam pojęcia co jest nie tak no a nie znam się na tym dobrze
Avatar użytkownika
Krzysiu555
Intelektryk
Intelektryk
 
Posty: 161
Dołączył(a): sobota, 23 sierpnia 2008, 16:55
Podziękował : 2
Otrzymał podziękowań: 1
System operacyjny: Windows 7 Professional 64
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 0
    Windows 7Firefox

Re: Tablice w klasach. Dziwny problem

Postprzez Cyfrowy Baron » piątek, 27 sierpnia 2010, 17:25

KOD cpp:     UKRYJ  
   String REKA[];    //karty ktore gracz ma w reku


Nie możesz deklarować tablicy typu String o nieokreślonym rozmiarze. Jest to dopuszczalne tylko w sytuacji gdy taką tablicę wypełniasz:

KOD cpp:     UKRYJ  
String REKA[] = {"1", "2", "3", "4", "itd..."}

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
Krzysiu555
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Tablice w klasach. Dziwny problem

Postprzez Krzysiu555 » piątek, 27 sierpnia 2010, 17:46

dokładnie to było problemem. teraz wszystko działa jak powinno. dzięki

PS zmieniłem tę tablicę na REKA[52] ale tak teoretycznie to co w przypadku gdy programujący nie wie ile będzie elementów?
Avatar użytkownika
Krzysiu555
Intelektryk
Intelektryk
 
Posty: 161
Dołączył(a): sobota, 23 sierpnia 2008, 16:55
Podziękował : 2
Otrzymał podziękowań: 1
System operacyjny: Windows 7 Professional 64
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 0
    Windows 7Firefox

Re: Tablice w klasach. Dziwny problem

Postprzez Cyfrowy Baron » piątek, 27 sierpnia 2010, 17:54

PS zmieniłem tę tablicę na REKA[52] ale tak teoretycznie to co w przypadku gdy programujący nie wie ile będzie elementów?


Można posłużyć się wektorami, chociaż ja osobiście skorzystałbym z tablicy asocjacyjnej, gdyż wydaje mi się, że jest łatwiejsza w obsłudze, a tutaj w zupełności wystarczy.

KOD cpp:     UKRYJ  
// plik nagłówkowy klasy gracz *.h
#include <map>

std::map<int, String> REKA; // int - numer elementu typu int, String - zawartość REKA typu String


reszta kodu który podałeś w zasadzie się nie zmieni oczywiście o ile nie robisz czegoś z elementem REKA wewnątrz klasy gracz, ale tego nie widać w kodzie.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Tablice w klasach. Dziwny problem

Postprzez polymorphism » piątek, 27 sierpnia 2010, 18:51

Użycie mapy w tym przypadku jest pozbawione sensu, ponieważ masz tu do czynienia z asocjacją indeks -> element, a ten typ asocjacji masz z natury w vectorze. I nie wiem czy użycie mapy jest prostsze w obsłudze. Raczej nie...
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Tablice w klasach. Dziwny problem

Postprzez Cyfrowy Baron » piątek, 27 sierpnia 2010, 18:56

Jak zwykle wypowiadasz się w kwestii coś lepsze od czegoś, ale przykładu nie podajesz, więc pozostaje to tylko w sferze dyskusji i możemy się tak sprzeczać w nieskończoność. Ja twierdzę, że tablica asocjacyjna jest prostsza w użyciu i podaję przykład.



Użycie mapy w tym przypadku jest pozbawione sensu,


Tak? Czemuż to jest pozbawione sensu skoro działa, nie pociąga za sobą żadnych kosztów i nie wymaga wielkich modyfikacji w kodzie, gdyż wystarczy zmienić deklarację tablicy String REKA[52] na deklarację tablicy asocjacyjnej, bez konieczności wprowadzania dalszych modyfikacji w kodzie programu, czego nie można powiedzieć o vector'ach! :o



Co się tyczy vectora to można to zrobić tak:

KOD cpp:     UKRYJ  
// plik nagłówkowy klasy gracz *.h
#include <vector>

std::vector<String> REKA;

KOD cpp:     UKRYJ  
void TForm1::rozdaj(int x)
{
  int i;
  for(i=0;i<x;i++)
  {
   player1.REKA.push_back( KARTY[i] );
   KARTY[i]="";
  }
}
KOD cpp:     UKRYJ  
// ten kod można by zostawić jak był, ale tak jest bezpieczniej, w przypadku tablicy asocjacyjnej trzeba by postąpić podobnie
void __fastcall TForm1::Button3Click(TObject *Sender)
{
  rozdaj(5);

  for(int i = 0; i < player1.REKA.size(); i++)
  {
   ListBox3->Items->Add( player1.REKA[i] );
  }

  for(int i = 0; i < player2.REKA.size(); i++)
  {
   ListBox4->Items->Add( player2.REKA[i] );
  }

  for(int i = 0; i < player3.REKA.size(); i++)
  {
   ListBox5->Items->Add( player3.REKA[i] );
  }

  for(int i = 0; i < player4.REKA.size(); i++)
  {
   ListBox6->Items->Add( player4.REKA[i] );
  }
}


Jak widać liczba modyfikacji kodu programu, które trzeba było wykonać jest większa, więc nie jest to prostsze rozwiązanie, gdyż w przypadku tablicy asocjacyjnej wystarczyła modyfikacja deklaracji tablicy, a tutaj trzeba jeszcze zmienić sposób wypełniania tablicy elementami. Nie jest to oczywiście żadną przeszkodą, ale z mapą było jednak prościej.



Do Krzysiu55:

Funkcja rozdaj powinna chyba zostać wywołana dla każdego z graczy, a nie tylko dla player1. Jeżeli nie wypełnisz tabel pozostałych graczy to będą puste.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Tablice w klasach. Dziwny problem

Postprzez Krzysiu555 » piątek, 27 sierpnia 2010, 20:05

tak. tak zrobię.

kod podałem tylko dla jednego żeby łatwiej znaleźć i rozwiązać błąd. jak była jeszcze tablica REKA[] dla n graczy to wywalało taki bałagan że ciężko było się połapać o co chodzi.
Avatar użytkownika
Krzysiu555
Intelektryk
Intelektryk
 
Posty: 161
Dołączył(a): sobota, 23 sierpnia 2008, 16:55
Podziękował : 2
Otrzymał podziękowań: 1
System operacyjny: Windows 7 Professional 64
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 0
    Windows 7Firefox

Re: Tablice w klasach. Dziwny problem

Postprzez polymorphism » piątek, 27 sierpnia 2010, 20:20

Ja twierdzę, że tablica asocjacyjna jest prostsza w użyciu i podaję przykład.

A to przykład ma niby dowodzić poprawności wyboru kontenera?! Nie żartuj :) Ja podam Ci liczby. Każde odwołanie się do elementu w mapie poprzez operator [] ma złożoność logarytmiczną, vector - stałą.

Tak? Czemuż to jest pozbawione sensu skoro działa, nie pociąga za sobą żadnych kosztów i nie wymaga wielkich modyfikacji w kodzie (...)

Wiesz, sortowanie bąbelkowe też działa, a nie użyjesz go do sortowania dużych zbiorów, prawda? Argument "że działa" jest naiwny i często świadczy o ignorancji. Jeśli chcę mieć tablicę o zmiennej liczbie elementów i swobodnym dostępie, to nie realizuje jej przy pomocy drzewa czy listy - to oczywiste!

(...) czego nie można powiedzieć o vector'ach!

Oczywiście że można, tylko trzeba zajrzeć do dokumentacji. Wystarczy że dasz w konstruktorze:
KOD cpp:     UKRYJ  
REKA.resize(52);

i nic w kodzie przerabiać nie musisz. Nie wiem jakim cudem doszedłeś do wniosku, że vector, który jest obiektową wersją tablicy, będzie mniej przypominał w użyciu tablicę niż mapa... :)
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Tablice w klasach. Dziwny problem

Postprzez Cyfrowy Baron » sobota, 28 sierpnia 2010, 09:02

Oczywiście że można, tylko trzeba zajrzeć do dokumentacji. Wystarczy że dasz w konstruktorze:


Nie chodziło o to, gdyż tablica mam mieć nieokreślony wymiar, lecz o to:

KOD cpp:     UKRYJ  
player1.REKA.push_back( KARTY<span style="font-style: italic"> );


Tak nieuważnie czytałeś, iż nie zrozumiałeś o czym piszę. Przytoczyłeś tylko fragment mojej wypowiedzi podczas gdy cała wypowiedź mówi o zupełnie czymś innym:

bez konieczności wprowadzania dalszych modyfikacji w kodzie programu, czego nie można powiedzieć o vector'ach!


a tyczy się to tego, że w przypadku map nie trzeba niczego modyfikować w istniejącym już kodzie, podczas gdy w przypadku vector'ów trzeba zmienić sposób wypełniania tablicy danymi (.push_back).
Poza tym to jest gra w karty, więc użycie tablicy asocjacyjnej ma większy sens niż użycie vector'ów, gdyż w dalszych pracach nad grą zajdzie konieczność połączenie konkretnych kart z konkretnymi indeksami niekoniecznie opartymi na kolejnych numerach tablicy, więc nie trzeba będzie przerabiać całego kodu, by zastąpić vector'y mapą. Każda kara ma jakąś wartość w [i]oczkach, więc zamiast tworzyć tablicę opartą na kolejnych indeksach można ją zbudować na wartości oczek w połączeniu z konkretną kartą. Wylosowanie np. pięciu kart nie wymaga tworzenia tablicy zapamiętującej tylko pięć kart z kolejnymi indeksami 0-4, gdyż to właśnie nie ma sensu. Zamiast tego można wylosować pięć kart i stworzyć tablicę zawierającą kartę + wartość w oczkach. Gracz również nie będzie wykładał karty o wybranym numerze indeksu, lecz kartę o konkretnej nazwie i konkretnej wartości w oczkach. Można i trzeba będzie stworzyć tablicę zawierającą nazwy kart i ich wartości w oczkach, ale już podczas rozdawania kart graczowi można przypisać mu kartę i jej wartość, zamiast późniejszego sprawdzania w tablicy przechowującej takie informacje ile dana karta ma oczek. Przechowywanie tablicy zawierającej tylko nazwę karty i jej numer indeksu w tablicy nie ma o tyle sensu, że ten indeks do niczego się nie przydaje, gdyż liczy się tylko nazwa karty, jej wartość i liczba kart, czyli tutaj rozmiar tablicy, który można sprawdzić z łatwością.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Tablice w klasach. Dziwny problem

Postprzez polymorphism » sobota, 28 sierpnia 2010, 09:59

Przytoczyłeś tylko fragment mojej wypowiedzi podczas gdy cała wypowiedź mówi o zupełnie czymś innym:

No nie wiem... Zacytujmy większy fragment:
(...) gdyż wystarczy zmienić deklarację tablicy String REKA[52] na deklarację tablicy asocjacyjnej, bez konieczności wprowadzania dalszych modyfikacji w kodzie programu, czego nie można powiedzieć o vector'ach!

Więc ów tablicę REKA[52] można spokojnie zamienić na:
KOD cpp:     UKRYJ  
vector<String> REKA;
...
REKA.resize(52);

Jedyna modyfikacja to wywołanie resize, cała reszta zostaje bez zmian. Krzysiu555 wspominał o tym, że nie chce mieć tablicy o określonym rozmiarze, zatem wywołanie resize jest zbędne, a do wstawiania nowych elementów trzeba użyć wspomnianej push_back lub insert. Tu także nie widzę problemu, bo funkcje są proste w obsłudze, a argument, że w kodzie nic nie trzeba zmieniać jest śmieszny, ponieważ zamiana tablicy statycznej na dynamiczną, gdzie dochodzi do zmiany jej rozmiaru, zawsze implikuje zmiany w kodzie. Taka już natura programowania...

Poza tym to jest gra w karty, więc użycie tablicy asocjacyjnej ma większy sens niż użycie vector'ów, gdyż w dalszych pracach nad grą może okazać się konieczne połączenie konkretnych kart z konkretnymi indeksami niekoniecznie opartymi na kolejnych numerach tablicy (...)

W ten sposób się nie programuje :shock: Najpierw trzeba przemyśleć sprawę, a dopiero później brać się za pisanie kodu, wtedy będzie mniej zaskoczeń i nagłych zwrotów akcji.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Tablice w klasach. Dziwny problem

Postprzez Cyfrowy Baron » sobota, 28 sierpnia 2010, 11:04

Więc ów tablicę REKA[52] można spokojnie zamienić na:


Tablica z założenia miała mieć rozmiar nieokreślony więc początkowo było to String REKA[]; co zostało zamienione na String REKA[52], jednak można to spokojnie zamienić na:

KOD cpp:     UKRYJ  
std::map<int, String> REKA;


W ten sposób się nie programuje :shock: Najpierw trzeba przemyśleć sprawę, a dopiero później brać się za pisanie kodu, wtedy będzie mniej zaskoczeń i nagłych zwrotów akcji.


Dlatego ja wychodzę naprzeciw oczekiwaniom Krzysiu555 gdyż widzę, że brak mu doświadczenia. Nie trudno przewidzieć, że jeszcze nie raz zada pytanie na tym forum odnośnie tego programu.



Do Krzysiu555:

Poza tym wogóle zrezygnowałbym z tablic i dla KARTY i REKA stworzyłbym listę typy TStringList zawierającą zarówno nazwy kart jako klucz i wartości tych kart jako wartość, np:

KOD cpp:     UKRYJ  
TStringList *KARTY;
TStringList *REKA;

KARTY = new TStringList();
REKA = new TStringList();

// wypełniam karty
KARTY->Add("As pik=11");
KARTY->Add("Król pik=4");
KARTY->Add("Dama pik=3");
KARTY->Add("Walet pik=2");
KARTY->Add("10 pik=10");
// itd...

// rozdawanie kart:
void TForm1::rozdaj(int x, int gracze) // gracze = liczba graczy, ponieważ karty rozdaje się na przemian
{
  int pula_kart = x * gracze;

  for(int i = 0; i < pula_kart; i += gracze)
  {
    for(int g = 0; g < gracze; g++)
    {
     switch(g)
     {     // maksymalna liczba graczy - tutaj 4
      case 0: player1.REKA->Add( KARTY->Strings[i + g] ); break;
      case 1: player2.REKA->Add( KARTY->Strings[i + g] ); break;
      case 2: player3.REKA->Add( KARTY->Strings[i + g] ); break;
      case 3: player4.REKA->Add( KARTY->Strings[i + g] ); break;
     }
    }
  }
}
 


Lista typu TStringList ma tą zaletę, że pozwoli przechować nazwę karty (właściwość Names), wartość oczek karty (właściwość Values i ValuesFromIndex) oraz numer indeksu karty (właściwość ItemIndex).

Kolejną zaletą klasy TStringList jest to, że nie musisz wypełniać jej kartami, możesz stworzyć plik tekstowy zawierający listę kart z wartościami oczek, umieścić go w zasobach programu i wczytywać do listy KARTY.

Więcej przeczytasz w serwisie Cyfrowy Baron w dziale: porady -> TStringList -> Tworzenie listy zawierającej nazwy i wartości przypisane do nazw.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Tablice w klasach. Dziwny problem

Postprzez polymorphism » sobota, 28 sierpnia 2010, 11:47

Dlatego ja wychodzę naprzeciw oczekiwaniom Krzysiu555 gdyż widzę, że brak mu doświadczenia.

No to tym bardziej powinieneś być ostrożny przy proponowaniu różnych rozwiązań. Proponowanie mapy, która będzie pełnić funkcję zwykłej tablicy, jest złą propozycją. I tu nie powinno być żadnej kwestii spornej. Nawet jeśli zakładając, że mapa jest potrzebna, ponieważ zachodzi jakaś specyficzna asocjacja, nie pokazałeś jak wyliczać elementy tej mapy, czy też jak (efektywnie) wyszukiwać wartości o danym kluczu (uprzedzam: operator [] nie sprawdzi się przypadku, gdy nie masz pewności, że dany klucz istnieje).
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Tablice w klasach. Dziwny problem

Postprzez Cyfrowy Baron » sobota, 28 sierpnia 2010, 11:53

nie pokazałeś jak wyliczać elementy tej mapy, czy też jak (efektywnie) wyszukiwać wartości o danym kluczu (uprzedzam: operator [] nie sprawdzi się przypadku, gdy nie masz pewności, że dany klucz istnieje).


Dostrzegłem swój błąd i w ostatnim poście zaproponowałem listę, która będzie najlepszym rozwiązaniem. Co się tyczy mapy to w pierwotnym założeniu działałaby tak jak vector, czyli przechowywałaby indeksy i nazwy kart przypisane do indeksów, późniejsze założenia, które przyjąłem okazały się trudne w realizacji, ale vector'y też się do tego celu nie nadają, stąd lista typu TStringList.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Tablice w klasach. Dziwny problem

Postprzez polymorphism » sobota, 28 sierpnia 2010, 12:22

(...) ale vector'y też się do tego celu nie nadają (...)

A dlaczego? Jeśli ma być tylko nieposortowanym zbiorem, to czemu nie? No chyba że wskaźniki do elementów gdzieś przypisujesz... Zresztą, czy TStringList nie jest przypadkiem tablicą? Bo iteracja po elementach listy poprzez indeks nie jest zbyt efektywna.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Tablice w klasach. Dziwny problem

Postprzez Cyfrowy Baron » sobota, 28 sierpnia 2010, 12:33

TStringList może być używana jako zwykła tablica z indeksami, oraz poprzez powiązanie elementu z jego wartością, tak jak ma to miejsce w plikach INI, o czym zresztą wcześniej napisałem i podałem przykład.


nazwa1=wartość1
nazwa2=wartosć2
nazwa3=wartość3
itd...



Jak widać są tutaj indeksy jak w przypadku vector'ów oraz nazwy powiązane z wartościami jak w przypadku map. Można by osiągnąć ten sam efekt poprzez zastosowanie kombinacji vector'ów z mapami, ale TStringList oferuje to wszystko razem i udostępnia prosty mechanizm obsługi.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Następna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 4 gości