Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: G++ osaa, MinGW ei

vidar [06.08.2008 19:33:24]

#

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?

Kray [06.08.2008 20:01:07]

#

Sdl sdl_ttf:llä

maz [06.08.2008 22:47:02]

#

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ä?

Metabolix [07.08.2008 14:45:35]

#

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);

vidar [07.08.2008 16:14:56]

#

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ä.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta