.[ ČeskéHry.cz ].
vector nový problém

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Houp



Založen: 28. 07. 2007
Příspěvky: 672

PříspěvekZaslal: 28. srpen 2008, 14:41:56    Předmět: vector nový problém Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
rezna



Založen: 27. 07. 2007
Příspěvky: 2156

PříspěvekZaslal: 28. srpen 2008, 14:44:53    Předmět: Odpovědět s citátem

kód:
vector<C_Door*> door;
door.push_back(new C_Door());


tohle jsi chtel napsat ze?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Houp



Založen: 28. 07. 2007
Příspěvky: 672

PříspěvekZaslal: 28. srpen 2008, 16:45:47    Předmět: Odpovědět s citátem

to rezna : ano to je přesně ono Smile, 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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
rezna



Založen: 27. 07. 2007
Příspěvky: 2156

PříspěvekZaslal: 28. srpen 2008, 16:52:03    Předmět: Odpovědět s citátem

Houp napsal:
to rezna : ano to je přesně ono Smile, 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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Ladis



Založen: 18. 09. 2007
Příspěvky: 1537
Bydliště: u Prahy

PříspěvekZaslal: 29. srpen 2008, 09:14:11    Předmět: Odpovědět s citátem

Taky sem si rikal, proc to pro ten vector nenapsal podle puvodniho kodu, ale pak uz sem videl, ze na to Rezna upozornil predemnou Smile. Tez doporucuju si nejprv neco o C++ precist.
_________________
Award-winning game developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Houp



Založen: 28. 07. 2007
Příspěvky: 672

PříspěvekZaslal: 17. září 2008, 22:34:51    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
quas4



Založen: 18. 10. 2007
Příspěvky: 199

PříspěvekZaslal: 18. září 2008, 00:24:23    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Weny Sky



Založen: 28. 07. 2007
Příspěvky: 241

PříspěvekZaslal: 18. září 2008, 19:29:37    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Houp



Založen: 28. 07. 2007
Příspěvky: 672

PříspěvekZaslal: 18. září 2008, 19:53:56    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Weny Sky



Založen: 28. 07. 2007
Příspěvky: 241

PříspěvekZaslal: 18. září 2008, 20:01:47    Předmět: Odpovědět s citátem

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 Wink
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Houp



Založen: 28. 07. 2007
Příspěvky: 672

PříspěvekZaslal: 18. září 2008, 20:18:17    Předmět: Odpovědět s citátem

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 Wink


neboj, to mě napadlo Smile, 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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Weny Sky



Založen: 28. 07. 2007
Příspěvky: 241

PříspěvekZaslal: 19. září 2008, 08:48:05    Předmět: Odpovědět s citátem

Tak to navrhni odznova, protoze takto to mas uplne spatne Wink
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Houp



Založen: 28. 07. 2007
Příspěvky: 672

PříspěvekZaslal: 19. září 2008, 09:57:46    Předmět: Odpovědět s citátem

Weny Sky napsal:
Tak to navrhni odznova, protoze takto to mas uplne spatne Wink


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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++ Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna