Page 48 of 50

Re: C++ -kysymykset

Posted: Fri Dec 09, 2011 11:43 pm
by Aavesoturi
esa94 wrote:Cg tosin toimii vain nVIDIAn raudalla kunnolla kun se on niille kehitetty
Cg on tavallaan meta shader kieli. Se konvertoidaan sopivaksi GLSL versioiksi tai Direct3D HLSL:ksi tai jopa muinaisiksi GL ARB assembly shadereiksi. Tämän voi tehdä offlinenä etukäteen Cg kääntäjällä (joka ei tarvi NVidian näyttistä) tai lennosta valiten sopivan profiilin raudalle ajon aikana. Koska Cg on apaut 99% sama kuin D3D HLSL (ja muidenkin konversio optioiden takia) se toimii kivasti ATInkin näyttiksillä.

EDIT: Hups, oli quoten lähde menny sekasin ylemmän tason lainausta poistaessa.

Re: C++ -kysymykset

Posted: Sat Dec 10, 2011 4:39 am
by esa94
Aavesoturi wrote:
JATothrim wrote:Cg tosin toimii vain nVIDIAn raudalla kunnolla kun se on niille kehitetty
Cg on tavallaan meta shader kieli. Se konvertoidaan sopivaksi GLSL versioiksi tai Direct3D HLSL:ksi tai jopa muinaisiksi GL ARB assembly shadereiksi. Tämän voi tehdä offlinenä etukäteen Cg kääntäjällä (joka ei tarvi NVidian näyttistä) tai lennosta valiten sopivan profiilin raudalle ajon aikana. Koska Cg on apaut 99% sama kuin D3D HLSL (ja muidenkin konversio optioiden takia) se toimii kivasti ATInkin näyttiksillä.
Äläpä attribuuttaa JATothrimille vahingossa

Re: C++ -kysymykset

Posted: Sun Dec 11, 2011 8:12 pm
by Sami345
Minulla olisi tällä kertaa tällaista ongelmaa. Kääntäjä antaa virheen:

Code: Select all

c:\mingw\bin\..\lib\gcc\mingw32\4.6.1\include\c++\bits\stl_tree.h:133|12|instantiated from 'std::_Rb_tree_node<std::pair<const std::basic_string<char>, ResourceManager<sf::Texture>::Resource> >'|
c:\mingw\bin\..\lib\gcc\mingw32\4.6.1\include\c++\bits\stl_tree.h:1064|4|instantiated from 'void std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_erase(std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_Link_type) [with _Key = std::basic_string<char>, _Val = std::pair<const std::basic_string<char>, ResourceManager<sf::Texture>::Resource>, _KeyOfValue = std::_Select1st<std::pair<const std::basic_string<char>, ResourceManager<sf::Texture>::Resource> >, _Compare = std::less<std::basic_string<char> >, _Alloc = std::allocator<std::pair<const std::basic_string<cha|
c:\mingw\bin\..\lib\gcc\mingw32\4.6.1\include\c++\bits\stl_tree.h:639|9|instantiated from 'std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::~_Rb_tree() [with _Key = std::basic_string<char>, _Val = std::pair<const std::basic_string<char>, ResourceManager<sf::Texture>::Resource>, _KeyOfValue = std::_Select1st<std::pair<const std::basic_string<char>, ResourceManager<sf::Texture>::Resource> >, _Compare = std::less<std::basic_string<char> >, _Alloc = std::allocator<std::pair<const std::basic_string<char>, ResourceManager<sf::Texture>::Resource> >]'|
c:\mingw\bin\..\lib\gcc\mingw32\4.6.1\include\c++\bits\stl_map.h:88|11|instantiated from here|
c:\mingw\bin\..\lib\gcc\mingw32\4.6.1\include\c++\bits\stl_pair.h|112|error: 'constexpr std::pair<_T1, _T2>::pair(const std::pair<_T1, _T2>&) [with _T1 = const std::basic_string<char>, _T2 = ResourceManager<sf::Texture>::Resource, std::pair<_T1, _T2> = std::pair<const std::basic_string<char>, ResourceManager<sf::Texture>::Resource>]' declared to take const reference, but implicit declaration would take non-const|
||=== Build finished: 1 errors, 0 warnings ===|
Tässä on koodi luokasta, jonka arvelen virheen aiheuttavan.

Code: Select all

// ResourceManager.hpp

#ifndef RESOURCEMANAGER_HPP_INCLUDED
#define RESOURCEMANAGER_HPP_INCLUDED

#include <map>
#include <boost\thread.hpp>

template <typename T>
class ResourceManager
{
    private:
        class Resource
        {
            private:
                T* resource;
                unsigned int uses;
                boost::thread loader;

            public:
                Resource(T* resource = NULL, unsigned int uses = 0);

                T* getResource();
                void setResource(T* resource);

                void use();
                void disuse();

                unsigned int getUses();
                void setUses(unsigned int uses);

                bool isUsed();
        };

        boost::mutex resources_mutex;
        std::map<std::string, Resource> resources;

    protected:
        virtual T* loadResource(std::string file) = 0;

    public:
        void use(std::string file);
        T* get(std::string file);
        void disuse(std::string file);

        ~ResourceManager();
};

#endif // RESOURCEMANAGER_HPP_INCLUDED

Code: Select all

// ResourceManager.cpp

#include "ResourceManager.hpp"

template <typename T>
ResourceManager<T>::Resource::Resource(T* resource, unsigned int uses)
    : resource(resource), uses(uses)
{

}

template <typename T>
T* ResourceManager<T>::Resource::getResource()
{
    return resource;
}

template <typename T>
void ResourceManager<T>::Resource::setResource(T* resource)
{
    this->resource = resource;
}

template <typename T>
void ResourceManager<T>::Resource::use()
{
    uses++;
}

template <typename T>
void ResourceManager<T>::Resource::disuse()
{
    if(uses == 0) throw std::runtime_error("Trying to disuse unused resource!");

    uses--;
}

template <typename T>
unsigned int ResourceManager<T>::Resource::getUses()
{
    return uses;
}

template <typename T>
void ResourceManager<T>::Resource::setUses(unsigned int uses)
{
    this->uses = uses;
}

template <typename T>
bool ResourceManager<T>::Resource::isUsed()
{
    return uses > 0;
}

template <typename T>
void ResourceManager<T>::use(std::string file)
{
    boost::lock_guard<boost::mutex> resources_lock(resources_mutex);

    if(resources.count(file) == 0)
    {
        T* resource = loadResource(file);

        resources[file] = Resource(resource);
    }

    resources[file].use();
}

template <typename T>
T* ResourceManager<T>::get(std::string file)
{
    boost::lock_guard<boost::mutex> resources_lock(resources_mutex);

    if(resources.count(file) == 0)
        throw std::runtime_error("The resource you are searching for isn't loaded!");

    Resource resource = resources[file];

    if(!resource.isUsed())
        throw std::runtime_error("There are no uses left on this resource!");

    return resource.resource;
}

template <typename T>
void ResourceManager<T>::disuse(std::string file)
{
    boost::lock_guard<boost::mutex> resources_lock(resources_mutex);

    if(resources.count(file) == 0)
        throw std::runtime_error("The resource you are searching for isn't loaded!");

    Resource resource = resources[file];

    resource.disuse();

    if(!resource.isUsed())
    {
        delete resource.resource;
        resources.remove(file);
    }
}

template <typename T>
ResourceManager<T>::~ResourceManager()
{
    boost::lock_guard<boost::mutex> resources_lock(resources_mutex);

    for(typename std::map<std::string, Resource>::iterator it = resources.begin(); it != resources.end(); it++)
    {
        if((*it).second.isUsed())
        {
            throw std::runtime_error((*it).first + " was still in use when ResourceManager was destroyed!");
        }

        delete (*it).second.resource;
    }
}
EDIT:

Resourcessa sijaitseva boost::thread aiheutti virheen.


Re: C++ -kysymykset

Posted: Mon Dec 12, 2011 4:10 pm
by JATothrim
Et anna boost::threadille parametreja Resource:n konstruktorissa. Tästä syystä boost::thread pitää usein varata dynaamisesti:

Code: Select all

boost::thread * m_thread = new boost:thread(funktio, parametrit);
Ajaa funktion uudessa säikeessä. Ts. ei ole olemassa validia boost::thread instanssia, mikäli thread ei ole käynnissä. m_thread->join() käytännössä tuhoaa thread-olion, etkä voi käynnistää säijettä uudestaan samalla instanssilla.

Jos dynaaminen thread olio ei käy päinsä, pitää jäsenoliolle antaa parametrit kuten muillekkin Resource:n konstruktorissa:

Code: Select all

template <typename T>
ResourceManager<T>::Resource::Resource(T* resource, unsigned int uses)
    : resource(resource), uses(uses), loader(loader_thread_main, parametri)
{

}
Koodivinkkinä sanoisin, että ota Resource-luokka ulos ResourceManager-luokasta. Käytä mieluummin namespace + friend yhdistelmää, jolloin Resource-luokka on ulkona ResourceManagerista ja näiden ylläpito helpottuu. (erityisesti implementaatio) Määritä siis Resource-malli ResourceManager-mallin kaveriksi, ja siirrä Resource-malli tarvittaessa detail-namespaceen, jos sen ei haluta näkyvän suoraan käyttäjälle. "luokan määritys luokan sisälle" on yleesä hyödyllinen silloin, kun tarvitaan POD tietotyyppi tyyliin "struct data { void * pdata; };" ja sen ei tarvitse näkyä luokan käyttäjille.

Templateista muistuttasin, että niitä ei voida implementoida kuten tavallisia luokkia, koska ne eivät ole luokkia, vaan malleja! Paras tuntemani tapa on esitellä malliluokka templateheader.hpp tiedostossa (kuten olet jo tehnytkin) ja sisällyttää sitten templateimpl.inl-tiedosto templateheader.h:n lopussa. (templateheader.h headerguardien sisällä, templateimpl.inl ei tarvitse guardeja, samaan tapaan kuin .cpp. Kannattaa lisätä @note templateimpl.inl:een, että ko. tiedosto on jo sisällytetty toiseen headeriin mukaan, ettet mene sotkemaan esikääntäjän kanssa.)
C++11 helpottaa mallien implementaatiota sallimalla extern:n käytön template-luokille.

Re: C++ -kysymykset

Posted: Tue Jan 10, 2012 8:55 pm
by Kumiankka
Osaisikos kukaan ehdottaa mitään peliohjelmointiin soveltuvaa kirjatoa? Pärjääkö SDL:llä tai SFML:llä?

Re: C++ -kysymykset

Posted: Tue Jan 10, 2012 9:02 pm
by temu92
SFML:llä voi piirtää 2D grafiikkaa ja OpenGL:n käyttö onnistuu 3D-grafiikan luontia varten. Muistaakseni äänet ja musiikitkin onnistuu sillä toistaa. Kuitenkin jos haluaa vähän "kehittyneempiä" pelejä tehdä niin joku erillinen fysiikkamoottori, esim. Box2D tai Chipmunk, voi olla hyvä tarkastaa josko sopisi omiin tarkoituksiin.

SDL on wanha ja kehitetty C:lle, SFML on uudempi ja tukee C++:n olio-ohjelmointiominaisuuksia joka tekee siitä huomattavasti helpomman käytettävän. Ennyt muista tasan tarkkaan miten SDL toimii mutta periaatteessa SFML on OpenGL-wrapperi 2D-grafiikan piirtoon joka siis toisin sanoen meinaa sitä, että graffat piirretään laitteistokiidytyksellä.

Re: C++ -kysymykset

Posted: Tue Jan 10, 2012 10:29 pm
by esa94
temu92 wrote:SDL on wanha ja kehitetty C:lle
Joskin sitä päivitetään yhä ahkerasti eikä se ole juuri lainkaan vanhentunut teknologisesti.

Re: C++ -kysymykset

Posted: Thu Mar 22, 2012 3:43 pm
by naputtelija
Allegro troublez. Näyttää siltä että seuraava esimerkkikoodi ei luo ikkunaa eikä muuta sitä oikean väriseksi. Kuitenkin se restaa sen 5 sekkaa. Mikä on ongelma?

Code: Select all

#include <allegro5/allegro.h>
#include <allegro5/allegro_native_dialog.h>

int main(void)
{
  ALLEGRO_DISPLAY *display = NULL;
 
  if(!al_init()) 
  {
    al_show_native_message_box(NULL, NULL, NULL, 
                 "failed to initialize allegro!", NULL, NULL);                   
    return -1;
  }
 
  display = al_create_display(800, 600);

  
  if(!display) 
  {
    al_show_native_message_box(NULL, NULL, NULL, 
                "failed to initialize display!", NULL, NULL);
    return -1;
  }
  al_clear_to_color(al_map_rgb(255,0,255));
  al_flip_display();
  al_rest(5.0);
  al_destroy_display(display);

  return 0;
}
Allegro on versio 5.0.5 Dev-c++:n DevPakina.

Re: C++ -kysymykset

Posted: Thu Mar 22, 2012 4:22 pm
by MaGetzUb
naputtelija wrote:Allegro troublez. Näyttää siltä että seuraava esimerkkikoodi ei luo ikkunaa eikä muuta sitä oikean väriseksi. Kuitenkin se restaa sen 5 sekkaa. Mikä on ongelma?

Code: Select all

#include <allegro5/allegro.h>
#include <allegro5/allegro_native_dialog.h>

int main(void)
{
  ALLEGRO_DISPLAY *display = NULL;
 
  if(!al_init()) 
  {
    al_show_native_message_box(NULL, NULL, NULL, 
                 "failed to initialize allegro!", NULL, NULL);                   
    return -1;
  }
 
  display = al_create_display(800, 600);

  
  if(!display) 
  {
    al_show_native_message_box(NULL, NULL, NULL, 
                "failed to initialize display!", NULL, NULL);
    return -1;
  }
  al_clear_to_color(al_map_rgb(255,0,255));
  al_flip_display();
  al_rest(5.0);
  al_destroy_display(display);

  return 0;
}
Allegro on versio 5.0.5 Dev-c++:n DevPakina.
Hmm, mitä virheilmoituksia tulee? Olethan muistanut linkittää Allegron?
Btw, miksi Allegro? SFML olisi helpompi käsitellä oliopohjaisuuden takia. :)
EDIT:

Niin ja miksi Dev-C++?
Edelleen suosittelen tätä http://www.codeblocks.org/


Re: C++ -kysymykset

Posted: Thu Mar 22, 2012 4:33 pm
by naputtelija
MaGetzUb wrote:
naputtelija wrote:Allegro troublez. Näyttää siltä että seuraava esimerkkikoodi ei luo ikkunaa eikä muuta sitä oikean väriseksi. Kuitenkin se restaa sen 5 sekkaa. Mikä on ongelma?

Code: Select all

#include <allegro5/allegro.h>
#include <allegro5/allegro_native_dialog.h>

int main(void)
{
  ALLEGRO_DISPLAY *display = NULL;
 
  if(!al_init()) 
  {
    al_show_native_message_box(NULL, NULL, NULL, 
                 "failed to initialize allegro!", NULL, NULL);                   
    return -1;
  }
 
  display = al_create_display(800, 600);

  
  if(!display) 
  {
    al_show_native_message_box(NULL, NULL, NULL, 
                "failed to initialize display!", NULL, NULL);
    return -1;
  }
  al_clear_to_color(al_map_rgb(255,0,255));
  al_flip_display();
  al_rest(5.0);
  al_destroy_display(display);

  return 0;
}
Allegro on versio 5.0.5 Dev-c++:n DevPakina.
Hmm, mitä virheilmoituksia tulee? Olethan muistanut linkittää Allegron?
Btw, miksi Allegro? SFML olisi helpompi käsitellä oliopohjaisuuden takia. :)
EDIT:

Niin ja miksi Dev-C++?
Edelleen suosittelen tätä http://www.codeblocks.org/

Ei virheilmoituksia. Hommanpas ton codeblocksin ja SFML:n sitten.

Re: C++ -kysymykset

Posted: Thu Mar 22, 2012 4:39 pm
by MaGetzUb
naputtelija wrote: Ei virheilmoituksia. Hommanpas ton codeblocksin ja SFML:n sitten.
Virheilmoituksilla siis meinaan Dev-C++:n Compile logiin ilmestyvää tekstiä. ;)

Re: C++ -kysymykset

Posted: Thu Mar 22, 2012 6:08 pm
by naputtelija

Code: Select all

Compiler: Default compiler
Building Makefile: "C:\Dev-Cpp\Allegrot\Aloitus\Makefile.win"
Executing  make...
make.exe -f "C:\Dev-Cpp\Allegrot\Aloitus\Makefile.win" all
make.exe: Nothing to be done for `all'.

Execution terminated
Compilation successful


Re: C++ -kysymykset

Posted: Fri Mar 23, 2012 3:54 pm
by naputtelija
Proseduurin aloituskohtaa _ZN2sf5ClockC1Ev ei löydy dynaamisesti linkittyvästä kirjastosta sfml-system.dll?

Code: Select all

#include <SFML/System.hpp>
#include <iostream>

int main()
{
    sf::Clock Clock;
    while (Clock.GetElapsedTime() < 5.f)
    {
        std::cout << Clock.GetElapsedTime() << std::endl;
        sf::Sleep(0.5f);
    }

    return 0;
}


Re: C++ -kysymykset

Posted: Fri Mar 23, 2012 3:56 pm
by valscion
Itse olen oikein tykästynyt nyt Allegroon, SFML kun jäi cbEnchantedista pois sen bugisuuden takia niin en sen kanssa jaksa säätää. Omasta mielestäni hyvä editori puolestaan on Qt Creator, jonka saat Qt SDK:n mukana (itselläni taisi olla versio 4.8.0). Sen lisäksi kun lataa Visual C++ 2010 Expressin niin saat kääntäjän, jolla olen ainakin itse saanut onnistuneesti Allegron pyörimään. Olen ladannut Allegron täysin valmiina toimintaan täältä (Allegro Windows Binaries) ja valinnut tuon MSVC 10 paketin. Sitten pistät mieleen sen, että minne paketin purat. Olisi hyvä jos purkaisit paketin sellaiseen tiedostopolkuun, jossa ei esiinny välilyöntejä, muuten saatat joutua jännän äärelle.

Jos aiot valita minun vaihtoehtoni, niin tässä olisi esimerkki .pro-tiedostosta, jolla Qt Creator avaa projektin ja luo linkkerille ja kääntäjälle oikeat asetukset. Tallenna se <mikätahansanimi>.pro tekstitiedostona ja avaa se Qt Creatorilla. Katso SOURCES-rivi, jolla olen määritellyt että projektin lähdekoodit ovat yhdessä tiedostossa nimeltä main.cpp, joka sijaitsee samassa kansiossa .pro tiedoston kanssa.

Code: Select all

TEMPLATE = app
CONFIG += console
CONFIG -= qt

SOURCES += main.cpp


win32 {
        LIBS += -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 -lopengl32 -lPsapi -lWinmm -lShlwapi

        DEFINES += WIN32 ALLEGRO_STATICLINK
        INCLUDEPATH += "$$(ALLEGRO_INCLUDE)"
        DEPENDPATH += "$$(ALLEGRO_INCLUDE)"
        CONFIG(release, debug|release){
                LIBS += -L"$$(ALLEGRO_LIB)" -lallegro-5.0.6-monolith-static-md -llibvorbisfile-1.3.2-static-md -lzlib-1.2.5-static-md -llibogg-1.2.1-static-md -llibFLAC-1.2.1-static-md -lfreetype-2.4.8-static-md -ldumb-0.9.3-static-md -llibvorbis-1.3.2-static-md
                PRE_TARGETDEPS += "$$(ALLEGRO_LIB)/allegro-5.0.6-monolith-static-md.lib"
        }
        else {
                LIBS += -L"$$(ALLEGRO_LIB)" -lallegro-5.0.6-monolith-static-md-debug -llibvorbisfile-1.3.2-static-md-debug -lzlib-1.2.5-static-md-debug -llibogg-1.2.1-static-md-debug -llibFLAC-1.2.1-static-md-debug -lfreetype-2.4.8-static-md-debug -ldumb-0.9.3-static-md-debug -llibvorbis-1.3.2-static-md-debug
                PRE_TARGETDEPS += "$$(ALLEGRO_LIB)/allegro-5.0.6-monolith-static-md-debug.lib"
        }
}
Sinun täytyy vain asettaa järjestelmän ympäristömuuttujiin kaksi arvoa:
  • ALLEGRO_LIB: Täydellinen polku Allegron paketin sisällä olevaan lib-kansioon, esim. H:\computing\allegro\lib
  • ALLEGRO_INCLUDE: Täydellinen polku Allegron paketin sisällä olevaan include-kansioon, esim. H:\computing\allegro\include
Voi olla että olen määritellyt paljon turhia kirjastoja LIBS-riveillä, mutta ainakin saan sillä hommat pyörimään :)

Re: C++ -kysymykset

Posted: Fri Mar 23, 2012 4:05 pm
by Latexi95
VesQ wrote:*loistava selitys*
naputtelija wrote:Proseduurin aloituskohtaa _ZN2sf5ClockC1Ev ei löydy dynaamisesti linkittyvästä kirjastosta sfml-system.dll?
Tuo allegro on kyllä ihan hyvä kirjasto, vaikka onkin c:llä tehty.
Mutta vielä tuohon kysymykseen, niin tuo virhe tulee yleensä, kun dll:llä ja ohjelma on käännetty eri kääntäjillä.

Re: C++ -kysymykset

Posted: Tue Mar 27, 2012 8:51 pm
by esa94
Latexi95 wrote:vaikka onkin c:llä tehty
wat

Re: C++ -kysymykset

Posted: Tue Mar 27, 2012 9:25 pm
by Latexi95
esa94 wrote:
Latexi95 wrote:vaikka onkin c:llä tehty
wat
Viittaatko siihen "vaikka"-sanaan? Se viittasi lähinnä MaGetzUbin kommentiin C++:lla kirjaston helppoudesta verrattuna C:n kirjastoihin.

Re: C++ -kysymykset

Posted: Wed Mar 28, 2012 6:31 pm
by koodaaja
Paljon enemmänhän se on kirjaston toteutuksesta kuin kielestä kiinni. Melkein kaiken oliotyylisen voi tehdä C:llä muuttamalla "olio->metodi(a, b, c)" muotoon "metodi(olio, a, b, c)". Merkkejä tässä on täsmälleen sama määrä ja aivan yhtä selkeitä ovat omasta mielestäni. Namespaceja tai vastaavia voi lähinnä jäädä kaipailemaan.

Re: C++ -kysymykset

Posted: Sat May 19, 2012 11:38 am
by Untitled.bmp
Osaisiko kukaan ehdottaa hyviä kääntäjiä ja editoreita C++:lle? Vaatimukset olisi, että ovat molemmat freewarea tai sharewarea ja, että suht.koht helppokäyttöisiä.

Re: C++ -kysymykset

Posted: Sat May 19, 2012 11:58 am
by Latexi95
Untitled.bmp wrote:Osaisiko kukaan ehdottaa hyviä kääntäjiä ja editoreita C++:lle? Vaatimukset olisi, että ovat molemmat freewarea tai sharewarea ja, että suht.koht helppokäyttöisiä.
Suosittelen QtSDK:ta. Siinä tulee mukana kaikki tarvittava.