Kristallipalloja esiin. Ristiinkääntelen OGLFT:ää Ubuntulla wintoosalle, binääreitä kunnen mistään löytänyt ja oli ensimmäinen OpenGL-fonttikirjasto joka toimi siedettävästi.
./configure && make toimii nätisti defaultti-asetuksilla g++:n kanssa. MinGW taas herjaa jännästi jotta
OGLFT.cpp:2538: error: invalid conversion from 'void (*)()' to 'void (*)()'
Itse rivi kuuluu gluTessCallback( tess_obj_, GLU_TESS_VERTEX, (GLUTessCallback)vertexCallback ), enempää en kaivellut, jonkinnäköinen funktiocasti ilmeisesti. Mutta eikai tuossa vikaa jos g++ sulattelee. Versiot ovat g++ (GCC) 4.2.3 (Ubuntu 4.2.3-2ubuntu7) ja i586-mingw32msvc-g++ (GCC) 4.2.1-sjlj (mingw32-2), ubuntun paketinhallista.
Äniveis, miten putkalaiset hoitavat fontit ja tekstin OGL:n kanssa? Onko lempparikirjastoja?
Sdl sdl_ttf:llä
onpa erikoinen virhe. Ihan ku tossa minGW versiossa olis joku bugi. (en väitä että on, totesinma vaan :D Mutta itse en nää mitään syytä miksei yhtä void funktio pointteria voi kastata toiseksi void funktio pointteriksi? (siis pointteri funktioon joka ei palauta mitään). Erikoista. mm.. ovathan molemmat kääntäjät 32 bittisiä?
Outo tapaus kyllä, mutta muutaman ehdotuksen voin silti heittää.
a) Kokeile ottaa tyypinmuunnos pois, anna funktiolle suoraan vertexCallback.
b) Käytä mustaa magiaa. Tämä luokka meni ainakin yhdestä g++:sta läpi kaikilla standardi- ja varoituslipuilla ilman varoituksia (gcc version 4.2.1 (SUSE Linux)). Luokka muuttaa annetun muuttujan miksi tahansa muuksi ympäristön vaatimusten mukaan, ja sitä voi käyttää funktion tapaan. Muunnoksen väliaikaistyyppinä on eräs funktio-osoitintyyppi.
class conv { typedef void conv_type(); conv_type *ptr; public: template <typename T> conv(T t) { ptr = reinterpret_cast<conv_type*>(t); } template <typename T> operator T () { return reinterpret_cast<T>(ptr); } }; gluTessCallback(tess_obj_, GLU_TESS_VERTEX, conv(vertexCallback));
c) Selvitä, tuleeko virhe funktion parametrista vai tuosta erillisestä muunnoksesta, ja yritä sitten selvittää, mitä asialle voi tehdä. Jaa siis rivi osiin ja katso, kumpi vaihe tuottaa virheen:
GLUTessCallback cb = (GLUTessCallback)vertexCallback; gluTessCallback(tess_obj_, GLU_TESS_VERTEX, cb);
Ilman castia virhe vaihtuu muotoon OGLFT.cpp:2538: error: invalid conversion from 'void (*)(OGLFT::Polygonal::VertexInfo*)' to 'void (*)()'. Virhe tulee nimenomaan funktiokutsusta, casti on ok.
Metabolixin taikatemput näyttäisivät toimivan, ainakin sain homman kääntymään. Testaamaan en vielä päässyt, hirveä homma saaha mokoma linkkaantumaan. Hyvältä kuitenkin näyttää, kiitoksia siis. Outo virhe kyllä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.