|
Programiranje Programski jezici, tehnike, alatke... |
|
Alatke vezane za temu | Vrste prikaza |
16.3.2013, 15:45 | #181 |
V.I.P. Programiranje
Član od: 29.8.2007.
Lokacija: Valjevo
Poruke: 1.349
Zahvalnice: 983
Zahvaljeno 371 puta na 280 poruka
|
Re: How to... C++
Koji kompajler koristis?
Mislim da se to zove "Name resolution for dependant types" i koliko vidim kod mene je to automatski "disambiguated" ( kako da prevedem ovo ) kod VS-a 2010 kao i sa g++4.7. Ako kod tebe prijavljuje gresku stavi ovako: Kod:
//cpp template <typename T> T* Cache<T>::loadFromFile(std::string filename) { T* resource = new T(); typename resource->loadFromFile(filename); return resource; } Poslednja ispravka: Belphegor (16.3.2013 u 16:04) |
16.3.2013, 17:05 | #182 |
Kekule Mekule
|
Re: How to... C++
Mogu samo reci "gremlini". Nista nisam dirao sada radi. Moving on...
EDIT: g++ 4.7.1 mislim da je. Poslednja ispravka: Andross (16.3.2013 u 17:19) Razlog: kompajler |
23.3.2013, 0:58 | #183 |
Kekule Mekule
|
Re: How to... C++
Koji je najbolji tip kontejnera za skladistenje game objecta, gledajuci sa strane performansi naravno. Na netu nalazim mnogo oprecnih misljenja, pa rekoh ovde da se konsultujem
|
23.3.2013, 15:57 | #184 | |
V.I.P. Programiranje
Član od: 29.8.2007.
Lokacija: Valjevo
Poruke: 1.349
Zahvalnice: 983
Zahvaljeno 371 puta na 280 poruka
|
Re: How to... C++
Ne moze se bas reci koji je najbolji jer zavisi od tipova podataka koje zelis da sadrzi, broja elemenata, nacina pristupa, koliko cesto se dodaju/oduzimaju elementi...
Ukratko, ja sam za std::vector jer je cache-friendly, osim ako recimo drzis pokazivace bez koriscenja nekog memorijskog pool-a za njihovu alokaciju, posto zelimo da podaci budu "contiguous" u memoriji. U svakom slucaju veoma je tesko tako organizovati podatke a da se ne izgubi neka fleksibilnost i lakoca odrzavanja koda, mozes samo malo da minimizujes problem. Moj ti je savet da se ne opterecujes mnogo sa ovim sve dok ne uvidis da li ti je to u stvari "bottleneck". vector vs. list, neki kljucne tacke izmedju ova dva kontenera, iseceno sa StackOverflow foruma: Citat:
|
|
Sledeći korisnik se zahvaljuje korisniku Belphegor na korisnoj poruci: | ||
Andross (24.3.2013) |
24.3.2013, 3:17 | #185 |
Kekule Mekule
|
Re: How to... C++
Sredio sam sve to, jos jedno pitanje - jel ima neka fora da npr:
Kod:
std::vector<OsnovnaKlasa*> komponente; komponente.push_back(new IzvedenaKlasa1()); komponente.push_back(new IzvedenaKlasa2()); komponente.push_back(new IzvedenaKlasa3()); // ... std::vector<OsnovnaKlasa*>::const_iterator iter; for(iter = komponente.begin(); iter != komponente.end(); ++iter) if((*iter)->proveriAtribute(objekat)) objekat->dodajKomponentu(new IKN(objekat)); // Ovo me zanima // ... U principu imam klasu BaseComponent koja je abstraktna i onda bih izvodio ostale komponente iz nje (HealthComponent, MovementComponent, AIComponent itd.). Pri kreiranju GameObjecta se proveravaju atributi i kace odgovarajuce komponente na njega, pri tome svaka komponenta utice na samo jedan GameObject. Prvo sto mi je palo na pamet je da imam std::vector<BaseComponent*> koji ce da cuva sve komponente koje se mogu kaciti, pa preko njega da proveravam (otud kod i pitanje odozgore) mada nisam siguran da li se moze tako uradili i jel postoji neki bolji nacin za ovo? |
24.3.2013, 9:57 | #186 |
Veteran
Član od: 27.12.2005.
Lokacija: Vremenske Grobnice, Hiperion
Poruke: 680
Zahvalnice: 99
Zahvaljeno 124 puta na 82 poruka
|
Re: How to... C++
Verovatno možeš da uradiš nešto preko typeid operatora. Na primer:
Kod:
if(typeid(*iter) == typeid(HealthComponent)) { objekat->dodajKomponentu(new HealthComponent(objekat)); } else if ... Kod:
if(dynamic_cast<HealthComponent*>(*iter) != nullptr) { objekat->dodajKomponentu(new HealthComponent(objekat)); } else if ... U stvari pre nego što počneš da koristiš pomenute tehnike, dobro prouči kako one rade. Takođe, uzmi u obzir da znaju da budu spore. Još jedno rešenje je da napraviš svoju podršku za RTTI. Pogledaj, na primer, kako je to urađeno u idTech 4 engine-u. Takođe, pogledaj Open and Efficient Type Switch for C++. Ili, dodaj u hijerarhiju virtuelni metod koji pravi novi objekat istog tipa... npr: Kod:
struct Base { virtual Base* makeNewSameType(args...) { return new Base(args...); } }; struct Derived: public base { virtual Base* makeNewSameType(args...) { return new Derived(args...); } }; // sada možeš da uradiš ovako nešto objekat->dodajKomponentu((*iter)->makeNewSameType(objekat)); Poslednja ispravka: M.Silenus (24.3.2013 u 12:06) Razlog: Još nešto mi palo na pamet... |
Sledeći korisnik se zahvaljuje korisniku M.Silenus na korisnoj poruci: | ||
Andross (24.3.2013) |
24.3.2013, 13:03 | #187 |
Kekule Mekule
|
Re: How to... C++
E vidis to sa pomocnom metodom za pravljenje objekta istog tipa je super resenje. Znao sam da mogu da kastujem ko blesav, ali sam hteo da izbegnem gomilu if/else/case slucajeva sto bi bilo neizbezno kako broj komponenti raste
|
24.3.2013, 13:09 | #188 |
V.I.P. Programiranje
|
Re: How to... C++
Gledaj da izbegavaš korišćenje typeid, dynamic_cast i sličnih stvari jer ako si ispravno isprojektao ceo objektno-orijentisani sistem nećeš imati nikakve potrebe za njima.
|
24.3.2013, 13:28 | #189 |
Član
Član od: 26.5.2007.
Poruke: 278
Zahvalnice: 16
Zahvaljeno 102 puta na 66 poruka
|
Re: How to... C++
Moja preporuka bi samo bila da ga preimenujes iz
Kod:
makeNewSameType Kod:
clone |
29.3.2013, 15:21 | #190 |
V.I.P. Programiranje
Član od: 29.8.2007.
Lokacija: Valjevo
Poruke: 1.349
Zahvalnice: 983
Zahvaljeno 371 puta na 280 poruka
|
Re: How to... C++
Andross, mozda ce te ova biblioteka interesovati entityx , ako nisi do sad video?
|
Sledeći korisnik se zahvaljuje korisniku Belphegor na korisnoj poruci: | ||
Andross (29.3.2013) |
29.3.2013, 16:07 | #191 |
Kekule Mekule
|
Re: How to... C++
Ima nekih zanimljivih stvari koje bih mogao da iskoristim, u principu zavrsio sam osnovu moje implementacije (pravljenje i update objekata) i glavna razlika je sto je moj sistem "self-attached" - sistem na osnovu atributa sam dodeljuje komponente objektima.
|
29.3.2013, 23:18 | #192 |
Veteran
|
Re: How to... C++
koji IDE bi bio najbolji za programiranje striktno u c-u, u windows-u? kompajler na faxu je gcc...
|
30.3.2013, 13:51 | #194 |
Veteran
|
Re: How to... C++
juce mi je skroz ok radio i kompajlirao i sve, a sad izbacuje error 216, kao da kompajlirani program koji pokusavam da pokrenem nije kompatibilan sa verzijom windows-a koju koristim... :/
EDIT: sada sam namestio u raznim opcijama sve na 32 gde god je moglo, a bilo na 64, pratci uputstva sa dna sajta, asada pokrene program, ne izbaci error, ali nakon dva ili tri unosa podataka i entera, windows izbaci program stoped working inace skinuo sam TDM GCC... Poslednja ispravka: stepanov (30.3.2013 u 14:05) |
31.3.2013, 0:44 | #195 |
V.I.P. GNU/Linux
Član od: 1.11.2005.
Poruke: 11.162
Zahvalnice: 2.079
Zahvaljeno 4.921 puta na 2.857 poruka
|
Re: How to... C++
Skini MinGW verziju.
|
29.4.2013, 13:21 | #196 |
Kekule Mekule
|
Re: How to... C++
Cenim da svi vec znate, ali dobro je podsetiti se (pogotovo kada se opecete) - Ne raditi stvari ovog tipa nikako:
Kod:
for(int i = 0; i < nekaKlasa->getNekiDjavo().nekiParametar; ++i) // ili slicno // stuff |
29.4.2013, 14:04 | #197 |
V.I.P. Programiranje
Član od: 29.8.2007.
Lokacija: Valjevo
Poruke: 1.349
Zahvalnice: 983
Zahvaljeno 371 puta na 280 poruka
|
Re: How to... C++
Ja sam 3 dana ludeo, cupao kosu trazeci jednu gresku i to sve na pogresnim mestima.
Trebao sam da koristim index ugnezdene petlje, ovako nesto je bilo: Kod:
for( i = 0; i < xCnt; ++i) { ...// mnooogo linija for( j = 0; j < yCnt; ++j) { vYItems[i].doSomeWork(); // ovde, znaci izbi oci trazeci } ... } |
29.4.2013, 15:24 | #198 |
V.I.P. Programiranje
|
Re: How to... C++
|
2.5.2013, 14:59 | #199 |
Kekule Mekule
|
Re: How to... C++
Jel moze neko da mi objasni zasto je ovo (paznja na bold):
Kod:
for(int y = drawBegin; y < drawEnd; ++y) { int index = ((drawEnd - y + drawBegin - 1) * m_ScreenWidth + x) * 3; // Shift bits to factor out floats; shift only by 1 since we have one decimal precision (.5f) int d = (y << 1) - m_ScreenHeight + lineHeight; int texY = ((d * texHeight) / lineHeight) >> 1; int texIndex = (texY * texWidth + texX) * 3; int r = (*wallImg)[texIndex]; int g = (*wallImg)[texIndex + 1]; int b = (*wallImg)[texIndex + 2]; // Make y side darker if(side) { r /= 2; g /= 2; b /= 2; } m_ScreenBuffer[index] = r; m_ScreenBuffer[index + 1] = g; m_ScreenBuffer[index + 2] = b; } Kod:
for(int y = drawBegin; y < drawEnd; ++y) { // Shift bits to factor out floats; shift only by 1 since we have one decimal precision (.5f) int d = (y << 1) - m_ScreenHeight + lineHeight; int texY = ((d * texHeight) / lineHeight) >> 1; int texIndex = (texY * texWidth + texX) * 3; int index = ((drawEnd - y + drawBegin - 1) * m_ScreenWidth + x) * 3; int r = (*wallImg)[texIndex]; int g = (*wallImg)[texIndex + 1]; int b = (*wallImg)[texIndex + 2]; // Make y side darker if(side) { r /= 2; g /= 2; b /= 2; } m_ScreenBuffer[index] = r; m_ScreenBuffer[index + 1] = g; m_ScreenBuffer[index + 2] = b; } |
2.5.2013, 15:29 | #200 |
V.I.P. Programiranje
Član od: 29.8.2007.
Lokacija: Valjevo
Poruke: 1.349
Zahvalnice: 983
Zahvaljeno 371 puta na 280 poruka
|
Re: How to... C++
Kako si ustanovio da je sporije?
Profilisao si u "Release mod-u", odnosno iskljucene su sve debug opcije vezane za kompajler koji koristis? |
Bookmarks sajtovi |
Tagovi |
c++, how to, pomoc, programiranje |
Alatke vezane za temu | |
Vrste prikaza | |
|
|