Forum Sveta kompjutera

Nazad   Forum Sveta kompjutera > Test Run > Programiranje

Programiranje Programski jezici, tehnike, alatke...

Odgovor
 
Alatke vezane za temu Vrste prikaza
Stara 16.3.2013, 15:45   #181
Belphegor
V.I.P. Programiranje
 
Član od: 29.8.2007.
Lokacija: Valjevo
Poruke: 1.349
Zahvalnice: 983
Zahvaljeno 371 puta na 280 poruka
Određen forumom 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;
}
EDIT: Nice article Dependant-Name-Hell

Poslednja ispravka: Belphegor (16.3.2013 u 16:04)
Belphegor je offline   Odgovor sa citatom ove poruke
Stara 16.3.2013, 17:05   #182
Andross
Kekule Mekule
 
Avatar korisnika Andross
 
Član od: 8.12.2005.
Lokacija: Beograd
Poruke: 3.751
Zahvalnice: 566
Zahvaljeno 1.065 puta na 560 poruka
Slanje poruke preko Skypea korisniku Andross
Određen forumom 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
Andross je offline   Odgovor sa citatom ove poruke
Stara 23.3.2013, 0:58   #183
Andross
Kekule Mekule
 
Avatar korisnika Andross
 
Član od: 8.12.2005.
Lokacija: Beograd
Poruke: 3.751
Zahvalnice: 566
Zahvaljeno 1.065 puta na 560 poruka
Slanje poruke preko Skypea korisniku Andross
Određen forumom 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
Andross je offline   Odgovor sa citatom ove poruke
Stara 23.3.2013, 15:57   #184
Belphegor
V.I.P. Programiranje
 
Član od: 29.8.2007.
Lokacija: Valjevo
Poruke: 1.349
Zahvalnice: 983
Zahvaljeno 371 puta na 280 poruka
Određen forumom 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:
vector:
  • Contiguous memory.
  • Pre-allocates space for future elements, so extra space required beyond what's necessary for the elements themselves.
  • Each element only requires the space for the element type itself (no extra pointers).
  • Can re-allocate memory for the entire vector any time that you add an element.
  • Insertions at the end are constant, amortized time, but insertions elsewhere are a costly O(n).
  • Erasures at the end of the vector are constant time, but for the rest it's O(n).
  • You can randomly access its elements.
  • Iterators are invalidated if you add or remove elements to or from the vector.
  • You can easily get at the underlying array if you need an array of the elements.
list:
  • Non-contiguous memory.
  • No pre-allocated memory. The memory overhead for the list itself is constant.
  • Each element requires extra space for the node which holds the element, including pointers to the next and previous elements in the list.
  • Never has to re-allocate memory for the whole list just because you add an element.
  • Insertions and erasures are cheap no matter where in the list they occur.
  • It's cheap to combine lists with splicing.
  • You cannot randomly access elements, so getting at a particular element in the list can be expensive.
  • Iterators remain valid even when you add or remove elements from the list.
  • If you need an array of the elements, you'll have to create a new one and add them all to it, since there is no underlying array.
Belphegor je offline   Odgovor sa citatom ove poruke
Sledeći korisnik se zahvaljuje korisniku Belphegor na korisnoj poruci:
Andross (24.3.2013)
Stara 24.3.2013, 3:17   #185
Andross
Kekule Mekule
 
Avatar korisnika Andross
 
Član od: 8.12.2005.
Lokacija: Beograd
Poruke: 3.751
Zahvalnice: 566
Zahvaljeno 1.065 puta na 560 poruka
Slanje poruke preko Skypea korisniku Andross
Određen forumom 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

// ...
IKN bi bila izvedena klasa n, iliti tip klase trenutnog iterovanog elementa.

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?
Andross je offline   Odgovor sa citatom ove poruke
Stara 24.3.2013, 9:57   #186
M.Silenus
Veteran
 
Član od: 27.12.2005.
Lokacija: Vremenske Grobnice, Hiperion
Poruke: 680
Zahvalnice: 99
Zahvaljeno 124 puta na 82 poruka
Određen forumom 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 ...
Ili, sa dynamic_cast-om:

Kod:
if(dynamic_cast<HealthComponent*>(*iter) != nullptr)
{
    objekat->dodajKomponentu(new HealthComponent(objekat));
}
else if ...
Za sve ovo je neophodno da hijerarhija klasa bude polimorfna (čitaj, neki metod u BaseComponent treba da bude virtual - hint: destruktor uvek mora da bude virtuelan u polimorfnim klasama, kviz pitanje: zašto? ).

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...
M.Silenus je offline   Odgovor sa citatom ove poruke
Sledeći korisnik se zahvaljuje korisniku M.Silenus na korisnoj poruci:
Andross (24.3.2013)
Stara 24.3.2013, 13:03   #187
Andross
Kekule Mekule
 
Avatar korisnika Andross
 
Član od: 8.12.2005.
Lokacija: Beograd
Poruke: 3.751
Zahvalnice: 566
Zahvaljeno 1.065 puta na 560 poruka
Slanje poruke preko Skypea korisniku Andross
Određen forumom 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
Andross je offline   Odgovor sa citatom ove poruke
Stara 24.3.2013, 13:09   #188
Geomaster
V.I.P. Programiranje
 
Član od: 28.6.2007.
Lokacija: Beograd
Poruke: 2.342
Zahvalnice: 2.836
Zahvaljeno 1.047 puta na 507 poruka
Slanje poruke preko MSN-a korisniku Geomaster Slanje poruke preko Skypea korisniku Geomaster
Određen forumom 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.
Geomaster je offline   Odgovor sa citatom ove poruke
Stara 24.3.2013, 13:28   #189
pivonroll
Član
 
Član od: 26.5.2007.
Poruke: 278
Zahvalnice: 16
Zahvaljeno 102 puta na 66 poruka
Određen forumom Re: How to... C++

Moja preporuka bi samo bila da ga preimenujes iz
Kod:
makeNewSameType
u
Kod:
clone
jer je ovako mnogo lakse i recimo jasnije.
pivonroll je offline   Odgovor sa citatom ove poruke
Stara 29.3.2013, 15:21   #190
Belphegor
V.I.P. Programiranje
 
Član od: 29.8.2007.
Lokacija: Valjevo
Poruke: 1.349
Zahvalnice: 983
Zahvaljeno 371 puta na 280 poruka
Određen forumom Re: How to... C++

Andross, mozda ce te ova biblioteka interesovati entityx , ako nisi do sad video?
Belphegor je offline   Odgovor sa citatom ove poruke
Sledeći korisnik se zahvaljuje korisniku Belphegor na korisnoj poruci:
Andross (29.3.2013)
Stara 29.3.2013, 16:07   #191
Andross
Kekule Mekule
 
Avatar korisnika Andross
 
Član od: 8.12.2005.
Lokacija: Beograd
Poruke: 3.751
Zahvalnice: 566
Zahvaljeno 1.065 puta na 560 poruka
Slanje poruke preko Skypea korisniku Andross
Određen forumom 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.
Andross je offline   Odgovor sa citatom ove poruke
Stara 29.3.2013, 23:18   #192
stepanov
Veteran
 
Član od: 10.8.2008.
Lokacija: Novi Sad
Poruke: 1.043
Zahvalnice: 425
Zahvaljeno 64 puta na 48 poruka
Slanje poruke preko MSN-a korisniku stepanov
Određen forumom Re: How to... C++

koji IDE bi bio najbolji za programiranje striktno u c-u, u windows-u? kompajler na faxu je gcc...
stepanov je offline   Odgovor sa citatom ove poruke
Stara 29.3.2013, 23:31   #193
voodoo_
V.I.P. GNU/Linux
 
Avatar korisnika voodoo_
 
Član od: 1.11.2005.
Poruke: 10.471
Zahvalnice: 1.712
Zahvaljeno 4.505 puta na 2.551 poruka
Određen forumom Re: How to... C++

http://orwelldevcpp.blogspot.com/

Mogu da se prave čisto C projekti.
voodoo_ je offline   Odgovor sa citatom ove poruke
Sledeći korisnik se zahvaljuje korisniku voodoo_ na korisnoj poruci:
stepanov (30.3.2013)
Stara 30.3.2013, 13:51   #194
stepanov
Veteran
 
Član od: 10.8.2008.
Lokacija: Novi Sad
Poruke: 1.043
Zahvalnice: 425
Zahvaljeno 64 puta na 48 poruka
Slanje poruke preko MSN-a korisniku stepanov
Određen forumom 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)
stepanov je offline   Odgovor sa citatom ove poruke
Stara 31.3.2013, 0:44   #195
voodoo_
V.I.P. GNU/Linux
 
Avatar korisnika voodoo_
 
Član od: 1.11.2005.
Poruke: 10.471
Zahvalnice: 1.712
Zahvaljeno 4.505 puta na 2.551 poruka
Određen forumom Re: How to... C++

Skini MinGW verziju.
voodoo_ je offline   Odgovor sa citatom ove poruke
Stara 29.4.2013, 13:21   #196
Andross
Kekule Mekule
 
Avatar korisnika Andross
 
Član od: 8.12.2005.
Lokacija: Beograd
Poruke: 3.751
Zahvalnice: 566
Zahvaljeno 1.065 puta na 560 poruka
Slanje poruke preko Skypea korisniku Andross
Određen forumom 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
Normalno nekiParametar bi strpali u lokalnu promenljivu i zavrsili posao, ali uvek se nadje trenutak kad se napravimo pametni pa to iz nekog razloga ne uradimo. Na ovom primeru sam osetio koliko je samo pozivanje funkcija skupo kada sam uspeo da raycaster koji mi je radio na nekih ~850FPS skucam na konstantnih 15
Andross je offline   Odgovor sa citatom ove poruke
Stara 29.4.2013, 14:04   #197
Belphegor
V.I.P. Programiranje
 
Član od: 29.8.2007.
Lokacija: Valjevo
Poruke: 1.349
Zahvalnice: 983
Zahvaljeno 371 puta na 280 poruka
Određen forumom 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
     }
    ...
}
Sto je najgore broj Y objekata je veci od X tako da nije moglo ni da prsne zbog "index out of bounds" pa bih i otkrio ranije. Od sad nikad ne koristim 'i' i 'j' kao imena indexa osim u veoma malim ili non-nested petljama.
Belphegor je offline   Odgovor sa citatom ove poruke
Stara 29.4.2013, 15:24   #198
Geomaster
V.I.P. Programiranje
 
Član od: 28.6.2007.
Lokacija: Beograd
Poruke: 2.342
Zahvalnice: 2.836
Zahvaljeno 1.047 puta na 507 poruka
Slanje poruke preko MSN-a korisniku Geomaster Slanje poruke preko Skypea korisniku Geomaster
Određen forumom Re: How to... C++

Citat:
Andross kaže: Pregled poruke
Na ovom primeru sam osetio koliko je samo pozivanje funkcija skupo kada sam uspeo da raycaster koji mi je radio na nekih ~850FPS skucam na konstantnih 15
Sve je okej dok funkcija nije virtuelna, veruj mi
Geomaster je offline   Odgovor sa citatom ove poruke
Stara 2.5.2013, 14:59   #199
Andross
Kekule Mekule
 
Avatar korisnika Andross
 
Član od: 8.12.2005.
Lokacija: Beograd
Poruke: 3.751
Zahvalnice: 566
Zahvaljeno 1.065 puta na 560 poruka
Slanje poruke preko Skypea korisniku Andross
Određen forumom 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;
}
Sporije od ovog (paznja na bold):

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;
}
Andross je offline   Odgovor sa citatom ove poruke
Stara 2.5.2013, 15:29   #200
Belphegor
V.I.P. Programiranje
 
Član od: 29.8.2007.
Lokacija: Valjevo
Poruke: 1.349
Zahvalnice: 983
Zahvaljeno 371 puta na 280 poruka
Određen forumom 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?
Belphegor je offline   Odgovor sa citatom ove poruke
Odgovor

Bookmarks sajtovi

Tagovi
c++, how to, pomoc, programiranje

Alatke vezane za temu
Vrste prikaza

Vaš status
Ne možete postavljati teme
Ne možete odgovarati na poruke
Ne možete slati priloge uz poruke
Ne možete prepravljati svoje poruke

BB kod: uključeno
Smajliji: uključeno
[IMG] kod: uključeno
HTML kod: isključeno



Sva vremena su po Griniču +2 h. Sada je 11:01.


Powered by vBulletin® verzija 3.8.7
Copyright ©2000–2020, vBulletin Solutions, Inc.
Hosted by Beograd.com