Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Houp
Založen: 28. 07. 2007 Příspěvky: 672
|
Zaslal: 28. srpen 2008, 14:41:56 Předmět: vector nový problém |
|
|
Doposud jsem používal pole, měl jsem v hlavičce :
kód: |
C_Door * door[MAX_DOOR];
int n_door; // aktualni pocet dveri
|
a pak v kódu jsem vytvářel nové "dveře" pomocí
kód: |
n_door = 0;
door[n_door++] = new C_MapDoor(256, 0, 576, 576, "Map");
door[n_door++] = new C_TileDoor(0,52, 256, 128, "Tiles");
door[n_door++] = new C_AttributeDoor(0,200, 256, 128, "Object", 0);
door[n_door++] = new C_AttributeDoor(0,348, 256, 64, "Monster", 10);
...
|
nyní bych to chtěl udělat pomocí vectoru, bohužel následující kód nefunguje :
hlavička :
kód: |
vector<C_Door> door;
|
a cpp soubor :
kód: |
door.push_back(C_MapDoor(256, 0, 576, 576, "Map"));
door.push_back(C_TileDoor(0,52, 256, 128, "Tiles"));
door.push_back(C_AttributeDoor(0,200, 256, 128, "Object", 0));
door.push_back(C_AttributeDoor(0,348, 256, 64, "Monster", 10));
|
Při vykreslování mi to vždy používá fci, která je v C_Door, nikoli tu, která je ve zděděných třídách jako C_MapDoor, C_TileDoor apod..
Když jsem zkusil udělat
kód: |
vector<C_Door> * door; |
tak mi to u řádků typu(u těch, kde používám hranaté závorky s indexem) :
kód: |
door[minIndex]->Draw(); |
hází chybu :
kód: |
C:\Documents and Settings\Houp\Dokumenty\Programy\Level Editor\actual\DoorSystem.cpp|41|error: base operand of `->' has non-pointer type `std::vector<C_Door, std::allocator<C_Door> >'| |
_________________

Naposledy upravil Houp dne 17. září 2008, 22:23:54, celkově upraveno 1 krát |
|
Návrat nahoru |
|
 |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 28. srpen 2008, 14:44:53 Předmět: |
|
|
kód: |
vector<C_Door*> door;
door.push_back(new C_Door()); |
tohle jsi chtel napsat ze? |
|
Návrat nahoru |
|
 |
Houp
Založen: 28. 07. 2007 Příspěvky: 672
|
Zaslal: 28. srpen 2008, 16:45:47 Předmět: |
|
|
to rezna : ano to je přesně ono , děkuji.. asi by mě nikdy nenapadlo psát vector<C_Door*>, zkoušel jsem vector<*C_Door> a teď když to píši tak mi dochází, jak ta správná verze je logičtější..
už to funguje _________________
 |
|
Návrat nahoru |
|
 |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 28. srpen 2008, 16:52:03 Předmět: |
|
|
Houp napsal: |
to rezna : ano to je přesně ono , děkuji.. asi by mě nikdy nenapadlo psát vector<C_Door*>, zkoušel jsem vector<*C_Door> |
hmm a co takhle zkusit si nekdy o C/C++ precist knizku nez v nem zacnu delat? |
|
Návrat nahoru |
|
 |
Ladis

Založen: 18. 09. 2007 Příspěvky: 1537 Bydliště: u Prahy
|
Zaslal: 29. srpen 2008, 09:14:11 Předmět: |
|
|
Taky sem si rikal, proc to pro ten vector nenapsal podle puvodniho kodu, ale pak uz sem videl, ze na to Rezna upozornil predemnou . Tez doporucuju si nejprv neco o C++ precist. _________________ Award-winning game developer |
|
Návrat nahoru |
|
 |
Houp
Založen: 28. 07. 2007 Příspěvky: 672
|
Zaslal: 17. září 2008, 22:34:51 Předmět: |
|
|
nový problém a přestože do knihy o C++ jsem "nahlédl"(Mistrovství v C++), tak řešení tam nevidím (bohužel se obávám, že i přesto se tam nalézá.., jen nevidím)
Chci ukazovat na nějakou konkrétní položku ve vectoru a to tak, že při smazání té konkrétní položky mi ten "ukazatel" bude ukazovat na NULL a při smazání dat, které se nacházejí před tou konkrétní položkou, aby ukazoval pořád na ní
lze toho nějak docílit? pamatovat si index neřeší ani jeden z problémů, totéž obyčejné ukazatele a jestli jsem správně pochopil fci iterátorů, tak ty mi taky nepomůžou.
Určitě to někdo už řešil a snad i vyřešil. _________________
 |
|
Návrat nahoru |
|
 |
quas4
Založen: 18. 10. 2007 Příspěvky: 199
|
Zaslal: 18. září 2008, 00:24:23 Předmět: |
|
|
Houp napsal: |
nový problém a přestože do knihy o C++ jsem "nahlédl"(Mistrovství v C++), tak řešení tam nevidím (bohužel se obávám, že i přesto se tam nalézá.., jen nevidím)
Chci ukazovat na nějakou konkrétní položku ve vectoru a to tak, že při smazání té konkrétní položky mi ten "ukazatel" bude ukazovat na NULL a při smazání dat, které se nacházejí před tou konkrétní položkou, aby ukazoval pořád na ní
lze toho nějak docílit? |
Lze toho docilit napr pouzitim smart pointers. Rozhodne ti ale ted nedoporucuju aby jsi neco takove zkousel a radeji se zamysli (nejlepe nekolikrat) nad jinym resenim problemu - jednoduse na to jdi jinak.
Proc si vubec "chces" pamatovat pozici nejake konkretni polozky - cim je specialni? Proc neni napr. zvlast nebo v jinem vectoru pro specialni polozky? je mozne (napr. kvuli rychlosti) nahradit ukazatel na konkretni polozku za funkci ktera ji vzdy dohleda a vrati ukazatel? Je vector opravdu nejvhodnejsi typ kontejneru ktery pouzivas? atd.. atd.. ... na nic z toho neumim odpovedet protoze neznam kontext problemu a z predchozich prispevku o std::vector<C_Door*> se to domyslet neda. |
|
Návrat nahoru |
|
 |
Weny Sky

Založen: 28. 07. 2007 Příspěvky: 241
|
Zaslal: 18. září 2008, 19:29:37 Předmět: |
|
|
Houpe, rekni spis co chces udelat. Protoze vytvaret ukazatel na polozky ve vectoru je prasarna. Dokud je pridavas, tak je vse OK, ale jakmile se zacne neco mazat a vector zacne spravovat ten uvolneny blok pameti, tak si koledujes o pekne problemy.
Jinak ten tvuj problem lehce vyresis dvojitym ukazatelem v pripade, ze ale dany prvek nesmazes z vectoru metodou erase(), ale jen tomu prvku nastavis hodnotu na NULL a samozrejme ten objekt na ktery ukazoval predtim smazes. Pak ti bude ukazatel ukazovat na ukazatel, ktery je NULL. Z toho vyplyva, ze tvuj problem obycejne ukazatele hrave vyresi
Ale lepsi bude, kdyz se od vectoru odprostis a navrhnes to uplne jinak. |
|
Návrat nahoru |
|
 |
Houp
Založen: 28. 07. 2007 Příspěvky: 672
|
Zaslal: 18. září 2008, 19:53:56 Předmět: |
|
|
no on by to hravě vyřešil asi list místo vectoru.. ale předěláním do něm mi přestalo fungovat něco, na co by nemělo mít vůbec vliv to, jeslti to byl list a vector..
tak já zkusím popsat problém, třeba i s tím listem na to nejdu nejlíp
Dělám jednoduché "skriptování" do svého level editoru
Na obrázku v okně Set script kinds vytvářím druhy skriptů. Když kliknu na E(dit) nějaké toho druhu skriptů, tak se mi otevře okno třeba právě to Tutorial, kde ho můžu upravit.
A problém je, že když mám otevřené okno Tutorial a já smažu druh skriptu Tutorial v okně Set script kinds, tak okno Tutorial ukazuje na špatná data a to data skriptu "To je jedno", tak to funguje při použití vectoru
Jak jsem napsal na začátku, tak kontejner list by můj problém vyřešil.. ale vznikl problém na záhadném místě, které bývalo funkční _________________
 |
|
Návrat nahoru |
|
 |
Weny Sky

Založen: 28. 07. 2007 Příspěvky: 241
|
Zaslal: 18. září 2008, 20:01:47 Předmět: |
|
|
a co tak v okne "Set script kinds" zakazat odebrani skriptu jehoz editacni okno je zrovna otevrene popripade pred smazanim toho skriptu zavrit okno toho skriptu  |
|
Návrat nahoru |
|
 |
Houp
Založen: 28. 07. 2007 Příspěvky: 672
|
Zaslal: 18. září 2008, 20:18:17 Předmět: |
|
|
Weny Sky napsal: |
a co tak v okne "Set script kinds" zakazat odebrani skriptu jehoz editacni okno je zrovna otevrene popripade pred smazanim toho skriptu zavrit okno toho skriptu  |
neboj, to mě napadlo , případně by ještě byla jednodušší vylepšená verze tvé myšlenky a prostě jen to tlačítko delete přesunout z Set script kinds do samotných editací druhů skriptů, které by se automaticky po smazání daného druhu skriptu zavřeli..
má to háček, že když budu mít otevřených těch oken s editací víc, tak ty ostatní okna budou ukazovat špatně...
ale asi nakonec bude nejschůdnější řešení zakázat otevření víc jak jedné editace skriptu a bude po problému.. svým způsobem není potřeba mít víc takových oken najednou otevřených _________________
 |
|
Návrat nahoru |
|
 |
Weny Sky

Založen: 28. 07. 2007 Příspěvky: 241
|
Zaslal: 19. září 2008, 08:48:05 Předmět: |
|
|
Tak to navrhni odznova, protoze takto to mas uplne spatne  |
|
Návrat nahoru |
|
 |
Houp
Založen: 28. 07. 2007 Příspěvky: 672
|
Zaslal: 19. září 2008, 09:57:46 Předmět: |
|
|
Weny Sky napsal: |
Tak to navrhni odznova, protoze takto to mas uplne spatne  |
To víš ty, že to mám špatně.. a netvrdím, že to není pravda, ale když nevím, jak to má být dobře, tak nemá smysl se pokoušet to předělávat.
Krom toho je to level editor, který nehodlám uveřejňovat, když bude sloužit dobře i se špatným návrhem, tak proč bych ho měl předělávat.. _________________
 |
|
Návrat nahoru |
|
 |
|