Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: HFONT ongelma

Sivun loppuun

pistemies [22.03.2006 22:51:32]

#

HFONT hFont = GetStockObject (DEFAULT_GUI_FONT) ;
Tuo aiheuttaa virheen:

67 C:\unzipped\koodit\rivinlisays.cpp invalid conversion from `void*' to `HFONT__*'

Pitääkö ladata jotain kirjastoja?

Metabolix [23.03.2006 17:43:34]

#

Ei, vaan lisätä väliin tyypinmuunnos (HFONT), kuten virhe kertoo.

pistemies [23.03.2006 22:34:46]

#

Ei tuo tyyppimuunnos minulta onnistunut. Miten se pitää tehdä?

tn [23.03.2006 23:03:37]

#

Tuo virhe siis mitä luultavimmin tarkoittaa, että GetStockObject-funktio palauttaa void* -tyyppisen arvon, jota sitten yrität sijoittaa HFONT -tyyppiseen (ilmeisesti alias HFONT__* -tyypille) muuttujaan. Tämä ei tietenkään onnistu suoraan, vaan sinun täytyy eksplisiittisellä tyyppimuunnoksella kertoa kääntäjälle, että kyseinen muunnos on sallittu. Siis tähän tyyliin:

HFONT hFont = (HFONT)GetStockObject (DEFAULT_GUI_FONT);

pistemies [24.03.2006 13:21:46]

#

Kiitos!
Siitä selvittiin. Koodissa näyttää olevan edelleen vikoja, jotka ei sovi Dev-Cpp:lle. Ilmoittaa nyt riviltä 109, joka on:

	hwndStatus = CreateWindowEx ( NULL, STATUSCLASSNAME, "Aloita...",
WS_CHILD | WS_VISIBLE | CCS_BOTTOM | SBARS_SIZEGRIP,
0, 0, 0, 0,hwnd, (HMENU) 7, hInstance, NULL ) ;

Kyseessä on tuo alin rivi ja HWND
Virheilmoitus:

C:\unzipped\koodit\rivinlisays.cpp:109: warning: passing NULL used for non-pointer converting 1 of `HWND__* CreateWindowExA(DWORD, const CHAR*, const CHAR*, DWORD, int, int, int, int, HWND__*, HMENU__*, HINSTANCE__*, void*)'

Miten tuosta oikein selviää?

tn [24.03.2006 13:39:15]

#

Eli tuosta virheilmoituksestahan selviää funktion prototyyppi:

HWND__* CreateWindowExA(DWORD, const CHAR*, const CHAR*, DWORD, int, int, int, int, HWND__*, HMENU__*, HINSTANCE__*, void*)

Tuossa tuo DWORD-tyyppi ei taida olla osoitin, vaan oikeastaan puhdas kokonaisluku. (En ole pahemmin tuollaista windows-ohjelmointia harrastanut, joten en tuota mene kyllä vannomaankaan.)
Sitten siinä virheilmoituksessa myöskin sanotaan: passing NULL used for non-pointer Eli yrität syöttää NULL-arvoa (joka on osoitintyyppinen vakio) ei-osoitin-parametriksi. Ja kun katsotaan sitä koodiasi:

hwndStatus = CreateWindowEx ( [b]NULL[/b], STATUSCLASSNAME, "Aloita...",
WS_CHILD | WS_VISIBLE | CCS_BOTTOM | SBARS_SIZEGRIP,
0, 0, 0, 0,hwnd, (HMENU) 7, hInstance, NULL ) ;

, niin niinhän siinä tosiaan näyttää ensimmäisen parametrin kohdalla käyvän. Eli kokeileppas laittaa siihen ekan NULL-arvon tilalle pelkkä 0 (nolla), niin ehkäpä tuostakin varoituksesta päästään eroon.

Ja tuohan siis tosiaan oli varoitus (warning) eikä virhe (error). Erona näillä on mm. se, että virheellinen ohjelma ei käänny, mutta pelkkiä varoituksia tuottava koodista sen sijaan saadaan kyllä toimiva ohjelma. Eria asia sitten onkin, että kuinka se toimii, joten niistä varoituksista kannattaa kyllä pyrkiä eroon...

pistemies [24.03.2006 14:11:05]

#

Kiitos.

Sain myös riviltä 127 toimimaan muuttamalla kaikki NULL arvot nolliksi.
Nyt on edennyt riville 135.

SendMessage (hwnd, WM_COMMAND, MAKEWPARAM(5, BN_CLICKED),0) ;

Tässäkin ei huolinut NULL arvoa, joten muutin siihen 0. Mutta nyt se ei tee mitään...
Ilmoittaa:

 Compiler: Default compiler
Executing  g++.exe...
g++.exe "C:\unzipped\koodit\rivinlisays.cpp" -o "C:\unzipped\koodit\rivinlisays.exe"    -I"C:\Dev-Cpp\lib\gcc\mingw32\3.4.2\include"  -I"C:\Dev-Cpp\include\c++\3.4.2\backward"  -I"C:\Dev-Cpp\include\c++\3.4.2\mingw32"  -I"C:\Dev-Cpp\include\c++\3.4.2"  -I"C:\Dev-Cpp\include"   -L"C:\Dev-Cpp\lib" -lsdk
C:\Dev-Cpp\Bin\..\lib\gcc\mingw32\3.4.2\..\..\..\..\mingw32\bin\ld.exe: cannot find -lsdk
collect2: ld returned 1 exit status

Execution terminated

Ei varsinaista virheilmoitusta, mutta jotain häikkää...
Onko tuo paketti oikea, imuroin jostakin sellaisen kuin OpenAL SDK.DevPak

Heikki [24.03.2006 15:23:46]

#

Tuossahan se virhe näkyy selkeästi:

C:\Dev-Cpp\Bin\..\lib\gcc\mingw32\3.4.2\..\..\..\..\mingw32\bin\ld.exe: cannot find -lsdk

Eli yrität linkittää kirjastoa sdk (etsii tiedostoa libsdk.a tai mikä onkaan winukassa) mutta sitä ei löydy. Vaikuttaisi siltä että teet WinAPI:lla jotain. Katso package managerilla että WinAPI:iin liittyvät jutut on asennettu, ja sen jälkeen aloita uusi Windows application -projekti (tms, ei nyt ole Dev-C++:aa tässä että voisin kattoo) jonka pitäisi laittaa linkkeriasetukset kuntoon.

pistemies [24.03.2006 21:59:26]

#

Windows32API on asennettu. Eikö tuo tuossa tarvitse SDK:ta?

Kuten sanoin, olen asentanut OpenAL.DevPakin, jonka mukana tuli OpenAL SDK ja myös tuo -lsdk komento on suoritettu, ohjelmakin näkyy sen suorittavan automaattisesti.
Mitä tuon eteen tulisi tehdä? Mikä on oikea komento tuolle kirjastolle? Onkon se oikea tähän tarkoitukseen?
Olen ladannut monia muitakin DevPak-paketteja, mutta kun ei ole tietoa, millä komennolla ne ladataan.

pistemies [25.03.2006 09:30:40]

#

Huomasin juuri, että viimeisin Compiler Options-komento jää DevCpp:n muistiin. Kun poistin kentässä olevan tekstin ja poistin ruksin kohdasta "Add these commands when calling compiler" ilmoitti Link_error virheestä, kun yritin kääntää:

  [Linker error] undefined reference to `InitCommonControls@0'
  [Linker error] undefined reference to `GetStockObject@4'

C:\DOCUME~1\Pekka\LOCALS~1\Temp/cckfcaaa.o(.text+0x1d1):rivinlisays.cpp: undefined reference to `GetStockObject@4'
collect2: ld returned 1 exit status

Mitähän tuo oikein kaipaa?

Metabolix [25.03.2006 11:44:10]

#

Voisi laittaa nuo kääntäjävirheet lainauksiksi eikä koodeiksi. Ei ole kiva, kun leiska räjähtää :(

Mitään sdk-kirjastoa tuskin on olemassakaan. Kannattaa sieltä SDK:n helpistä katsoa funktion kohdalta, minkä kirjaston se haluaa. Sieltä selviää esimerkiksi, että InitCommonControls löytyisi (Microsoftilla) kirjastosta comctl32.lib. MinGW:n vastaava on todennäköisesti libcomctl32.a, joka linkitetään parametrilla -lcomctl32. Toisen osaatkin varmasti itse etsiä samalla periaatteella.

pistemies [25.03.2006 20:18:40]

#

Metabolix kirjoitti:

MinGW:n vastaava on todennäköisesti libcomctl32.a, joka linkitetään parametrilla -lcomctl32. Toisen osaatkin varmasti itse etsiä samalla periaatteella.

En tiedä, olenko luottamuksesi arvoinen :)
Olen aivan aloittelija...

Onko niin, että tuo linkitys toimii sen mukaan, että jos tiedoston nimi lib-hakemistossa on esim libpekka.a, se linkitetään -lpekka ?

Ja tuossa linkityshommassa on kaksi kenttää, onko sama kumpaan kenttään kirjoittaa tuon homman ja tartteeko checkbox olla ruksattu, jotta linkitys toimii?

Deewiant [25.03.2006 21:10:25]

#

Pekka Mansikka kirjoitti:

Onko niin, että tuo linkitys toimii sen mukaan, että jos tiedoston nimi lib-hakemistossa on esim libpekka.a, se linkitetään -lpekka?

On.

pistemies [25.03.2006 22:20:25]

#

Sain tämän nyt toimimaan. Vaati seuraavat kirjastot:

Dev-C++ kirjoitti:

-lcomctl32 -lgdi32

Opin taas sen verran lisää tästä ohjelmasta, että joka ohjelmalle joutuu erikseen ajamaan nuo linkitykset, sillä tuo -lgdi32 on ajettu ekakerran jo muutama päivä sitten, kun selvitin Link_errorin.


Sivun alkuun

Vastaus

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

Tietoa sivustosta