C++ -kysymykset
-
- Moderator
- Posts: 1583
- Joined: Mon Aug 27, 2007 11:24 pm
- Location: Otaniemi - Mikkeli -pendelöinti
Re: C++ -kysymykset
Mikähän tässä on, kun ei MinGW osaa kääntää komentoriviltä ajettaessa? Yritän siis seuraavaa: MinGW-c++ testing.cpp -o testing. Muuten pelittää, mutta heti lisätessäni yhdenkin includettavan filen, tulee parisataa riviä valitusta siitä, ettei kaikkea schaissea ole määritelty. Mikä hitto tässä muka menee metsään?
Re: C++ -kysymykset
Tuo 32 tarkoittaa, että se on 32 -bittinen eikä 2.32 versio, koska 2.2 on uusin versio winsocketeista. Syy erroriin oli se, että olin unohtanut WIN32_LEAN_AND_MEAN:n, minkä takia windows.h:n lisättiin winsock2.h:n sijaan winsock.h.anttipanda wrote:Katso mikä paluuarvo WSAStartupilta tulee: http://msdn2.microsoft.com/en-us/library/ms742213.aspxjabanii wrote:Olen alkanut opettelemaan sokettejen käyttöä, mutta WSAStartup ei toimi jostain syystä.
Kääntäjä ei valita mitään, mutta kun laitan seuraavan koodin, niin funktio palauttaa 1.
Olen includettanut windows.h:n ja linkannut ws2_32.lib:n, sekä tuo wsadata on alustetta "WSADATA wsadata;". Kääntäjä on Visual C++ 2005 Express Edition.Code: Select all
if(WSAStartup(MAKEWORD(2,2), &wsadata)==SOCKET_ERROR) { WSACleanup(); return 1; } return 0;
Huomaan myös että olet linkannut winsockin versiota 2.32 vasten (ws2_32.lib), mutta pyydät versiota 2.2 (WSAStartup(MAKEWORD(2,2)). Ehkä tuo vaikuttaa asiaan?
-
- Active Member
- Posts: 248
- Joined: Mon Aug 27, 2007 9:23 pm
- Location: Oulu
Re: C++ -kysymykset
Minkä includen lisäsit? Jos lisäsit headerin jonka toteutus on jossain kirjastossa (.lib tai .dso), niin sinun pitää komentaa linkkeriä ottamaan kirjasto mukaan vastaavasti.koodaaja wrote:Mikähän tässä on, kun ei MinGW osaa kääntää komentoriviltä ajettaessa? Yritän siis seuraavaa: MinGW-c++ testing.cpp -o testing. Muuten pelittää, mutta heti lisätessäni yhdenkin includettavan filen, tulee parisataa riviä valitusta siitä, ettei kaikkea schaissea ole määritelty. Mikä hitto tässä muka menee metsään?
C++-ohjelma tehdään jotakuinkin seuraavasti:
Esikääntö (makrot) -> Kääntö(includet, tekee sourcet assemblerille ja optimoi(?)) -> Assembleri (tekee moduulit)-> Linkkeri (yhdistää moduulit ja valmiit kirjastot).
Heh, niinpäs olikin No hyvä kun selvisi (ja kerroit muillekin )Tuo 32 tarkoittaa, että se on 32 -bittinen eikä 2.32 versio, koska 2.2 on uusin versio winsocketeista. Syy erroriin oli se, että olin unohtanut WIN32_LEAN_AND_MEAN:n, minkä takia windows.h:n lisättiin winsock2.h:n sijaan winsock.h.
OoO
-
- Moderator
- Posts: 1583
- Joined: Mon Aug 27, 2007 11:24 pm
- Location: Otaniemi - Mikkeli -pendelöinti
Re: C++ -kysymykset
Juu, jälkikäteen muistin lisätä linkkauksen, ei se kyllä mitään auttanut. Iostream.h:ta yritin sisällyttää. Kokeilin siirtää kaikki samaan kansioon kääntäjän kanssa (koodin, kirjaston ja headerin) muttei se siltikään pelittänyt. Kaikki errorit tulevat jostain headerin virheestä; puuttuu pilkkuja tai puolipisteitä jne. näitä ei IDE:n kautta kääntäessä tule.anttipanda wrote:Minkä includen lisäsit? Jos lisäsit headerin jonka toteutus on jossain kirjastossa (.lib tai .dso), niin sinun pitää komentaa linkkeriä ottamaan kirjasto mukaan vastaavasti.koodaaja wrote:Mikähän tässä on, kun ei MinGW osaa kääntää komentoriviltä ajettaessa? Yritän siis seuraavaa: MinGW-c++ testing.cpp -o testing. Muuten pelittää, mutta heti lisätessäni yhdenkin includettavan filen, tulee parisataa riviä valitusta siitä, ettei kaikkea schaissea ole määritelty. Mikä hitto tässä muka menee metsään?
C++-ohjelma tehdään jotakuinkin seuraavasti:
Esikääntö (makrot) -> Kääntö(includet, tekee sourcet assemblerille ja optimoi(?)) -> Assembleri (tekee moduulit)-> Linkkeri (yhdistää moduulit ja valmiit kirjastot).
Heh, niinpäs olikin No hyvä kun selvisi (ja kerroit muillekin )Tuo 32 tarkoittaa, että se on 32 -bittinen eikä 2.32 versio, koska 2.2 on uusin versio winsocketeista. Syy erroriin oli se, että olin unohtanut WIN32_LEAN_AND_MEAN:n, minkä takia windows.h:n lisättiin winsock2.h:n sijaan winsock.h.
-
- Active Member
- Posts: 248
- Joined: Mon Aug 27, 2007 9:23 pm
- Location: Oulu
Re: C++ -kysymykset
Miten lisäsit linkkauksen? Itse kyllä kääntäisin ihan IDE:stä, jos ei ole pakko kääntää komentoriviltä. Joissain ideissä saa muuten esille minkälaisella komennolla ide kääntää (idekin käyttää sitä samaa kääntäjää minkä saat komentoriviltä käyntiin). Sen kopioimalla voi kääntää itsekin komentoriviltä. Projektin asetuksista löytyy jos on löytyäkseen.koodaaja wrote:Juu, jälkikäteen muistin lisätä linkkauksen, ei se kyllä mitään auttanut. Iostream.h:ta yritin sisällyttää. Kokeilin siirtää kaikki samaan kansioon kääntäjän kanssa (koodin, kirjaston ja headerin) muttei se siltikään pelittänyt. Kaikki errorit tulevat jostain headerin virheestä; puuttuu pilkkuja tai puolipisteitä jne. näitä ei IDE:n kautta kääntäessä tule.
OoO
Re: C++ -kysymykset
Tietääkö kukaan, miten linuxissa määritetään resurssit (resource)? Vai toimiiko C++:ssa samat, kuin Windows ohjelmoinnissa? Jos ei, niin voisiko joku kertoa korvikkeen RCDATA:lle?
Ja viellä, millä esikääntäjän vakiolla voi saada selville onko käyttöjärjestelmä Windows tai Linux? Ajattelin samantapaista, kuin esim: ___LINE___ tai ___FILE___.
Ja viellä, millä esikääntäjän vakiolla voi saada selville onko käyttöjärjestelmä Windows tai Linux? Ajattelin samantapaista, kuin esim: ___LINE___ tai ___FILE___.
-
- Active Member
- Posts: 248
- Joined: Mon Aug 27, 2007 9:23 pm
- Location: Oulu
Re: C++ -kysymykset
linuxin resursseista en tiedä mitään. yleensä sulautettujen resurssien käyttö on muutenkin melko turhaa... Eivät takuulla toimi samalla tavalla kuin windowsissa.jabanii wrote:Tietääkö kukaan, miten linuxissa määritetään resurssit (resource)? Vai toimiiko C++:ssa samat, kuin Windows ohjelmoinnissa? Jos ei, niin voisiko joku kertoa korvikkeen RCDATA:lle?
Ja viellä, millä esikääntäjän vakiolla voi saada selville onko käyttöjärjestelmä Windows tai Linux? Ajattelin samantapaista, kuin esim: ___LINE___ tai ___FILE___.
Tässä on pieni sivu mikä voi auttaa selvittämään minkälainen kääntäjä on käytössä: http://predef.sourceforge.net/
Esikääntäjän lippujen asettaminen ei riipu mitenkään käyttöjärjestelmästä, vaan se on (esi)kääntäjän tehtävä. Voit joko killailla erinäisillä olemassa olevilla esikääntäjän lipuilla, tai vain luoda omat. Olisi muutenkin omituista, jos koodejasi ei pystyisi Linux-koneella kääntämään Windows-ohjelmaksi, ja toisin päin.
Voit lisätä johonkin yhteiseen headeriin definet, joista voidaan valita käännöksen kohdejärjestelmä.
#define WINDOWS_32
//#define WINDOWS_64
//#define WINDOWS_VISTA_32
//#define WINDOWS_VISTA_64
//#define LINUS_MIKÄLIE
Tai voit määritellä esikääntäjän direktiivejä useimmissa IDE:issä, projektin asetuksissa yms. paikassa. Komentoriviltä käännettäessäkin voidaan lippuja määritellä.
OoO
- Dibalo
- Advanced Member
- Posts: 298
- Joined: Mon Aug 27, 2007 8:12 pm
- Location: Espoo, Finland
- Contact:
Re: C++ -kysymykset
Usein olen törmännyt Windowsin yhteydessä WIN32-symboliin. Linuxin symboli ei tule nyt mieleen.anttipanda wrote:Tai voit määritellä esikääntäjän direktiivejä useimmissa IDE:issä, projektin asetuksissa yms. paikassa. Komentoriviltä käännettäessäkin voidaan lippuja määritellä.
Re: C++ -kysymykset
Ajattelin vain, että onko esikääntäjässä mitään tälläistä:anttipanda wrote:Esikääntäjän lippujen asettaminen ei riipu mitenkään käyttöjärjestelmästä, vaan se on (esi)kääntäjän tehtävä. Voit joko killailla erinäisillä olemassa olevilla esikääntäjän lipuilla, tai vain luoda omat. Olisi muutenkin omituista, jos koodejasi ei pystyisi Linux-koneella kääntämään Windows-ohjelmaksi, ja toisin päin.jabanii wrote:Tietääkö kukaan, miten linuxissa määritetään resurssit (resource)? Vai toimiiko C++:ssa samat, kuin Windows ohjelmoinnissa? Jos ei, niin voisiko joku kertoa korvikkeen RCDATA:lle?
Ja viellä, millä esikääntäjän vakiolla voi saada selville onko käyttöjärjestelmä Windows tai Linux? Ajattelin samantapaista, kuin esim: ___LINE___ tai ___FILE___.
Voit lisätä johonkin yhteiseen headeriin definet, joista voidaan valita käännöksen kohdejärjestelmä.
#define WINDOWS_32
//#define WINDOWS_64
//#define WINDOWS_VISTA_32
//#define WINDOWS_VISTA_64
//#define LINUS_MIKÄLIE
Tai voit määritellä esikääntäjän direktiivejä useimmissa IDE:issä, projektin asetuksissa yms. paikassa. Komentoriviltä käännettäessäkin voidaan lippuja määritellä.
Code: Select all
#ifdef WINDOWS
int UseLib()
{
//Windows DLL:n lataus run-timessa
}
#endif
#ifdef LINUX
int UseLib()
{
//Linux SO:n lataus run-timessa
}
#endif
#ifdef MAC_OS
int UseLib()
{
//Mac OS kirjaston lataus run-timessa
}
#endif
- Dibalo
- Advanced Member
- Posts: 298
- Joined: Mon Aug 27, 2007 8:12 pm
- Location: Espoo, Finland
- Contact:
Re: C++ -kysymykset
No tottakai on, jos vain teet niin!
-
- Active Member
- Posts: 248
- Joined: Mon Aug 27, 2007 9:23 pm
- Location: Oulu
Re: C++ -kysymykset
Edellisessä viestissäni jo ilmaisin, miten kyseinen toiminnallisuus voidaan saavuttaa.Ajattelin vain, että onko esikääntäjässä mitään tälläistä:
Tekisin itse asian hieman toisin. Kartoittaisin missä alustariippuvuus vaikuttaa, ja tekisin alustariippumattoman kantaluokan. Kantaluokkaan kaikki se toteutus mikä on yhteistä, ja sitten jokaiselle alustalle aina peritään uusi luokka johon toteutetaan tai laajennetaan kantaluokan toteutuksia. Tämän jälkeen factoryluokassa (tai headereilla) valitaan oikea toteutus käännösaikana. Näin käännösliput ja alustariippuvuus saadaan yhteen paikkaan, ja koodi pysyy mahdollisimman geneerisenä.
Kantaluokka toimisi loistavasti juuri tuollaisessa tapauksessa, missä ladataan toteutus ajonaikaisesti kirjastosta. Perityn luokan metodi lataa toteutuksen, ja tuo on täysin läpinäkyvää ohjelman kannalta.
ps. En kai ole suunnitellut että kirjasto ladataan käyttöjärjestelmän jossa ohjelmaa ajetaan, perusteella?
Code: Select all
// Pieni enemmän tai vähemmän pseudo-esimerkki siitä, miten voitaisiin ladata käännöksestä riippuen oikea toteutus, ja kuin koodi saataisiin pysymään mahdollisimman puhtaana käännöslipuista.
typedef void (*PerfromSomeStuffFunctionPointer)();
class SomeClassWhichHasMultipleImplementations
{
public:
void Initialize();
virtual void PerformSomeStuff() = 0;
protected:
virtual void DoLoadImplementation() = 0;
PerfromSomeStuffFunctionPointer stuffPerformFunction;
};
void SomeClassWhichHasMultipleImplementations::Initialize()
{
DoLoadImplementation();
}
void WindowsImplementation::PerformaStuff()
{
stuffPerformFunction();
}
class WindowsImplementation : public SomeClassWhichHasMultipleImplementations
{
protected:
void DoLoadImplementation();
};
void WindowsImplementation::DoLoadImplementation()
{
//load dll and get the interface to the function pointers
HINSTANCE handle = NULL;
handle = LoadLibrary("WindowsImplementation.dll");
if( handle != NULL )
{
stuffPerformFunction = (PerfromSomeStuffFunctionPointer)GetProcAddress(dllHandle, "PerformSomeStuffImpl");
}
}
class ImplementationFactory
{
static SomeClassWhichHasMultipleImplementations* GetInstance();
};
SomeClassWhichHasMultipleImplementations* ImplementationFactory::GetInstance()
{
#ifdef WINDOWS
return new WindowsImplementation();
#elif LINUX
return new LinuxImplementation();
#endif
}
....
SomeClassWhichHasMultipleImplementations myObject = ImplementationFactory::GetInstance();
myObject->Initialize();
myObject->PerformSomeStuff();
delete myObject;
...
OoO
- Dibalo
- Advanced Member
- Posts: 298
- Joined: Mon Aug 27, 2007 8:12 pm
- Location: Espoo, Finland
- Contact:
Re: C++ -kysymykset
Aivan! Juuri noin itsekin lähtisin asiaa rakentamaan. Tässä hieman koodia ChaosBasicin enginestä hieman pelkistettynä ja muutettuna helpommin ymmärrettäväksi:
Code: Select all
// ChBPlatform.h
#ifndef __ChB_platform_h__
#define __ChB_platform_h__
/** Määrittää, käytetäänkö muistinhallintamanageria muistivuotojen
* löytämiseen. Tämä toiminto on release-tilassa automaattisesti
* pois käytöstä tehokkuussyistä. Aseta 0:ksi, jos haluat managerin
* pois käytöstä myös debug-tilassa.
*/
#define __MEMORY_MANAGER_ENABLED__ 1
/** Määrittää, liitetäänkö ohjelmaan mukaan standardi-virrat.
* Aseta arvo 0:ksi, jos haluat virrat pois käytöstä.
*/
#define __INCLUDE_STD_IOSTREAM__ 1
/** Poistaa varoitukset käytöstä, jos asetus laitetaan 1:ksi. */
#define __DISABLE_COMPILER_WARNINGS__ 1
/** Tapa, jolla varoitukset poistetaan.
- disable: poistetaan kokonaan
- once: yksi varoitustyyppi näytetään kerran
*/
#define __COMPILER_WARNING_STATE__ disable
/** 8-bittisen unicode-merkistön symboli. */
#define __UTF_8_BIT_STRING__ 8
/** 16-bittisen unicode-merkistön symboli. */
#define __UTF_16_BIT_STRING__ 16
/** ChaosBasicin käyttämä merkkijärjestelmä. Voit valita joko __UTF_8_BIT_STRING__ tai
* __UTF_16_BIT_STRING__. Tämä vaikuttaa ChB::String ja ChB::ch8 -tietotyyppien valintaan.
* Oletuksena __UTF_8_BIT_STRING__ (std::string, char)
*/
#define __CHB_STRINGS__ __UTF_8_BIT_STRING__
/** ChaosBasicin käyttämien perustietotyyppien lukumäärä. */
#define __CHB_BASIC_TYPE_COUNT__ 8
/** ChaosBasicin operaattorien lukumäärä. */
#define __CHB_OPERATOR_COUNT__ 15
/** Version tiedot */
#define __CHB_PERSONAL_ID_NBR__ 45
#define __CHB_VERSION_NBR__ 0
#define __CHB_SUB_VERSION_NBR__ 1
#define __CHB_REVISION_NBR__ 1
#define __CHB_CHECK_SUM_1__ 46
#define __CHB_CHECK_SUM_2__ 51
#define __CHB_CHECK_SUM_3__ 123
#define __CHB_CHECK_SUM_4__ 79
#define __CHB_CHECK_SUM_HEADER__ ( (__CHB_CHECK_SUM_1__ << 24) | (__CHB_CHECK_SUM_2__ << 16) | (__CHB_CHECK_SUM_1__ << 8) | (__CHB_CHECK_SUM_2__) )
#define __CHB_VERSION_HEADER__ ( (__CHB_PERSONAL_ID_NBR__ << 24) | (__CHB_VERSION_NBR__ << 16) | (__CHB_SUB_VERSION_NBR__ << 8) | (__CHB_REVISION_NBR__) )
/** Väliaikaispuskurin koko. */
#define __CHB_TEMPORARY_BUFFER_SIZE__ 15
/** Jos haluat, että SharedPtr voidaan kopioida mistä tahansa toisen tyyppisestä
* SharedPtr:stä, aseta tämän symbolin arvo 1:ksi. Tämä tyyppikonversio on tarkoitettu
* vain sukulais-pointtereita varten, ja kahden toisilleen tuntemattoman luokan
* pointterin käyttö on hyvin vaarallista. Tässä tapauksessa onneksi pysäytetään
* ohjelman suoritus assertioon.
*
* HUOM! TARKKANA TÄMÄN SYMBOLIN KANSSA!
*/
#define __ENABLE_SHARED_PTR_TYPE_CONVERSION__ 0
/** Oletustietotyyppi, joka on kontrollimuuttujissa tavukoodissa.
* Jos arvoksi on asetettu 4, on perustietotyyppi int.
* Jos arvoksi on asetettu 2, on perustietotyyppi short int.
*/
#define __CHB_DEFAULT_ID_DATATYPE__ 4
/** Symboli, joka ilmoittaa olemassaolollaan sen, että käännetään debug-tilassa. */
#ifndef NDEBUG
# define __CHB_DEBUG__ 1
#else
# define __CHB_DEBUG__ 0
#endif
/** Tiedoston nimi, josta bytecodea luetaan. */
#define __CHB_BYTECODE_FILENAME__ "../../../Compiler/bin/debug/bc.txt"
/** Poistetaan kääntäjän varoitukset. */
#if __DISABLE_COMPILER_WARNINGS__
# include "ChBDisableWarnings.h"
#endif
#ifdef WIN32
// WINAPI-funkkarit
# include "windows.h"
# include "windowsx.h"
# ifdef _ENGINE
// OpenGL
# include <gl/gl.h>
# pragma comment(lib, "opengl32.lib")
# pragma comment(lib, "glu32.lib")
// kuvienlataus-kirjasto
# if __CHB_DEBUG__ == 1
# pragma comment(lib, "corona_static_d.lib")
# else
# pragma comment(lib, "corona_static.lib")
# endif
# endif
#endif
#ifdef LINUX
// LINUX-KAMAT TÄHÄN!
#endif
#endif
Code: Select all
// ChBRenderWindow.h
#ifndef __ChB_window_h__
#define __ChB_window_h__
#include "ChBPlatform.h"
#include "ChBDatatypes.h"
#include "ChBRect.h"
#include "ChBRenderSystem.h"
namespace ChB
{
/** Luokka, joka on tarkoitettu ikkunan luomiseen. Periytä tämä luokka eri renderöintirajapintoihin.
@remarks
Kun käyttäjä luo tämän luokan instanssin, hän luo käyttöjärjestelmään uuden ikkunan
haluamallaan rajapinnalla. Tämän rajapinnan tulee periä tämä luokka.
*/
class RenderWindow
{
public:
/** Luo tyhjän instanssin, joka pitää alustaa ennen kuin ikkuna saadaan käyttöön.
@remakrs
Katso init-metodi.
*/
RenderWindow() : mRenderSys(0), mUseRelative(false), mFullscreen(false), mBPP(0), mCreated(false), mIsClosed(false) {}
/** Tuhoaa instanssin ja sammuttaa ikkunan. */
virtual ~RenderWindow() {}
/** Tämä metodi luo ikkunan järjestelmään. Kutsutaan vain KERRAN.
@param width Ikkunan leveys pikseleinä.
@param height Ikkunan korkeus pikseleinä.
@param bpp Ikkunan värisyvyys bitteinä (16,24,32).
@param fullscreen Aseta tämä true:ksi jos haluat koko ruudun kokoisen ikkunan.
@param relative Aseta tämä true:ksi, jos haluat OpenGL:n käyttävän suhteellista [0,1] koordinaatistoa absoluuttiisen [0,w/h] sijaan.
@notes
Heittää ChB::Exception tyyppisen poikkeuksen, jos ikkunan luonti ei onnistu.
*/
virtual void init(int width, int height, int bpp, bool fullscreen = false, bool relative = false) = 0;
/** Päivittää ikkunan kontekstin. */
virtual void update() = 0;
/** Tuhoaa ikkunan varaamat resurssit. */
virtual void drop() = 0;
/** Kertoo, onko ikkuna auki.
@returns
Jos ikkunan oikeassa ylälaidassa sijaitsevaa ruksia on klikattu, eli ikkuna halutaan
sammuttaa, palautetaan false. Muussa tapauksessa palautusarvo on true.
*/
virtual bool isOpen() const { return !mIsClosed; }
/** Asettaa ikkunan otsikon.
@param caption Otsikon sisältävä merkkijono.
@remarks
Otsikko ilmestyy heti ikkunan yläpalkkiin. Tämä ei päde kehyksettömissä ikkunoissa.
*/
virtual void setCaption(const String& caption) = 0;
/** Asettaa ikkunan RanderSystem-instanssin. */
virtual void setRenderSystem(RenderSystem* renderer) { mRenderSys = renderer; }
/** Palauttaa osoittimen instanssin renderöintisysteemiin. */
virtual RenderSystem* getRenderSystem() { return mRenderSys; }
protected:
bool mCreated; // onko ikkuna jo luotu
TRect<int> mDimensions; // ikkunan koko
int mBPP; // ikkunan värisyvyys
bool mFullscreen; // onko ikkuna kokoruutu-tilassa
bool mUseRelative; // käytetäänkö suhteellista koordinaatistoa
RenderSystem* mRenderSys; // instanssin rendersystem
bool mIsClosed; // onko sulkunappia painettu
};
} // ChB
#endif
Code: Select all
// ChBRenderWindowWin32.h
#ifndef __ChB_render_window_win32_h__
#define __ChB_render_window_win32_h__
#include "ChBPlatform.h"
#include "ChBDatatypes.h"
#include "ChBRenderWindow.h"
namespace ChB
{
/** Luokka, joka on tarkoitettu ikkunan luomiseen käyttäen OpenGL.
@remarks
Tämä ikkuna on tarkoitettu Win32-grafiikkarajapinnalle, joten käyttäjän RenderSystem
tulee olla myös Win32-yhteensopiva.
@notes
Toteutus: ChBRenderWindowWin32.cpp
*/
class RenderWindowWin32 : public RenderWindow
{
public:
/** Luo tyhjän instanssin, joka tulee alustaa. Kts. init-metodi. */
RenderWindowWin32();
/** Tuhoaa instanssin ja samalla myös ikkunan. */
virtual ~RenderWindowWin32();
/** Tämä metodi luo ikkunan järjestelmään. Kutsutaan vain KERRAN.
@param width Ikkunan leveys pikseleinä.
@param height Ikkunan korkeus pikseleinä.
@param bpp Ikkunan värisyvyys bitteinä (16,24,32).
@param fullscreen Aseta tämä true:ksi jos haluat koko ruudun kokoisen ikkunan.
@param relative Aseta tämä true:ksi, jos haluat OpenGL:n käyttävän suhteellista [0,1] koordinaatistoa absoluuttiisen [0,w/h] sijaan.
@notes
Heittää ChB::Exception tyyppisen poikkeuksen, jos ikkunan luonti ei onnistu.
*/
virtual void init(int width, int height, int bpp, bool fullscreen = false, bool relative = false);
/** Päivittää ikkunan kontekstin. */
virtual void update();
/** Tuhoaa ikkunan varaamat resurssit. */
virtual void drop();
/** Asettaa ikkunan otsikon.
@param caption Otsikon sisältävä merkkijono.
@remarks
Otsikko ilmestyy heti ikkunan yläpalkkiin. Tämä ei päde kehyksettömissä ikkunoissa.
*/
virtual void setCaption(const String& caption);
/** Asettaa ohjelman instanssin.
@notes
Vain Windows-ympäristö!!
*/
virtual void setApplicationInstace(HINSTANCE hInstance) { mHInstance = hInstance; }
protected:
HWND mHwnd; // ikkunan kahva
WNDCLASSEX mClassInfo; // ikkunan luokan rekisteröinti-info
HINSTANCE mHInstance; // ohjelman kahva
};
} // ChB
#endif // __ChB_render_window_win32_h__
Code: Select all
// ChBSystem.cpp
#include "ChBSystem.h"
#include "ChBKeyboard.h"
#include "ChBException.h"
#ifdef WIN32
# include "ChBRenderWindowWin32.h"
# include "ChBRenderSystemWin32.h"
#endif
#ifdef LINUX
// LINUX-KAMAT
#endif
ChB::System* ChB::Singleton<ChB::System>::m_SingletonPtr = 0;
namespace ChB
{
System::System()
: mInited( false )
{
mRenderWindow = 0;
mRenderSystem = 0;
mKeyboard = 0;
}
System::~System()
{
drop();
}
void System::init(int width, int height, int bpp, bool fullscreen, bool relative)
{
// tarkistetaan tila
if( mInited )
CHB_EXCEPTION("Can´t initialize system twice.",
"Trying to initialize System instance twice.",
"System.Init");
#ifdef WIN32
mRenderWindow = new RenderWindowWin32();
mRenderSystem = new RenderSystemWin32();
#endif
#ifdef LINUX
// LINUX-KAMAT
#endif
// luodaan ikkuna
assert( mRenderWindow && mRenderSystem );
mRenderWindow->setRenderSystem( mRenderSystem );
mRenderWindow->init(width, height, bpp, fullscreen, relative);
// luodaan näppäimistö
mKeyboard = new Keyboard();
mInited = true;
}
void System::update()
{
// tarkistus, onko alustettu
if( !mInited ) _throwUnInited();
mKeyboard->update();
mRenderWindow->update();
}
void System::drop()
{
if( mInited )
{
mRenderWindow->drop();
delete mRenderSystem;
delete mRenderWindow;
mInited = false;
}
}
inline void System::_throwUnInited()
{
CHB_EXCEPTION("Can´t use system before initialization.", "Initialize the system first", "");
}
} // ChB
-
- Active Member
- Posts: 248
- Joined: Mon Aug 27, 2007 9:23 pm
- Location: Oulu
Re: C++ -kysymykset
Ohjelminti on siitä hienoa, että samaan lopputulokseen voi päästä monella tavalla Ohjenuorana kannattaa kuitenkin aina pitää se, että riippuvuudet ovat rajattu mahdollisimman pienelle alueelle. Tämä onnistuu rajapintoja määrittelemällä.
Itse pyrin aina siihen, että käännöslippuja ei käytettäisi koodin seassa, mutta pitäähän niitä joskus käyttää. Omaa esimerkkiäni voisi muuttaa vielä siten, että tuonne factoryn sourceen ei tule noita käännöslippuja. Ei tuokaan tuollaisena ole paha. Mutta jos haluaa olla puristi (mikä usein kannattaa), voisi factoryn tehdä inlinenä ja valita oikea toteutus käännöslipulla headerissa:
Tai jopa:
Tämänkin voisi tosin tehdä toisin, mutta kuten sanottua keinoja on melkein yhtä paljon kuin koodareita
Itse pyrin aina siihen, että käännöslippuja ei käytettäisi koodin seassa, mutta pitäähän niitä joskus käyttää. Omaa esimerkkiäni voisi muuttaa vielä siten, että tuonne factoryn sourceen ei tule noita käännöslippuja. Ei tuokaan tuollaisena ole paha. Mutta jos haluaa olla puristi (mikä usein kannattaa), voisi factoryn tehdä inlinenä ja valita oikea toteutus käännöslipulla headerissa:
Code: Select all
//ImplemenationFactory.h
#ifdef WINDOWS
#include "WindowsImplementationFactory.h"
#elif LINUX
#include "LinuxImplementationFactory.h"
#endif
//WindowsImplementationFactory.h
class ImplementationFactory
{
inline static SomeClassWhichHasMultipleImplementations* GetInstance()
{
return new WindowsImplementation();
}
};
//LinuxImplementationFactory.h
class ImplementationFactory
{
inline static SomeClassWhichHasMultipleImplementations* GetInstance()
{
return new LinuxImplementation();
}
};
Code: Select all
//ImplemenationFactory.h
class ImplementationFactory
{
#ifdef WINDOWS
#include "WindowsImplementationFactory.inl"
#elif LINUX
#include "LinuxImplementationFactory.inl"
#endif
};
//WindowsImplementationFactory.inl
inline static SomeClassWhichHasMultipleImplementations* GetInstance()
{
return new WindowsImplementation();
}
//LinuxImplementationFactory.inl
inline static SomeClassWhichHasMultipleImplementations* GetInstance()
{
return new LinuxImplementation();
}
OoO
Re: C++ -kysymykset
Joku vois olla kiltti ja lähettää pienen koodivinkin miten SDL:än avulla voit piirtää läpinäkyviä kuvia tyyliin CB:n DrawGhostImage. Yritin saada selkoa SDL:n omasta API tutosta mutta ku sieltä ei vaan saa mitään kunnon kuvaa miten se voidaan suorittaa...
Ja sitten vielä kanssa pieni esimerkki linkitetyistä listoista. Oon yrittäny löytää sitä Docendon C++ kirjasta mutta en toistaseks oo löytäny mitään --> etsinnät jatkuvat
Ja sitten vielä kanssa pieni esimerkki linkitetyistä listoista. Oon yrittäny löytää sitä Docendon C++ kirjasta mutta en toistaseks oo löytäny mitään --> etsinnät jatkuvat
-
- Active Member
- Posts: 248
- Joined: Mon Aug 27, 2007 9:23 pm
- Location: Oulu
Re: C++ -kysymykset
En ole esimerkkejä etsinyt, mutta dokumentaatiossa on seuraavaa:temu92 wrote:Joku vois olla kiltti ja lähettää pienen koodivinkin miten SDL:än avulla voit piirtää läpinäkyviä kuvia tyyliin CB:n DrawGhostImage. Yritin saada selkoa SDL:n omasta API tutosta mutta ku sieltä ei vaan saa mitään kunnon kuvaa miten se voidaan suorittaa...
Ja sitten vielä kanssa pieni esimerkki linkitetyistä listoista. Oon yrittäny löytää sitä Docendon C++ kirjasta mutta en toistaseks oo löytäny mitään --> etsinnät jatkuvat
Ehkä tuosta saa tarpeeksi selvän kuvan miten läpinäkyvän kuvan voi piirtää.set_alpha (flag,alpha)
SDL::Surface::set_alpha sets the opacity of the image for alpha blits. alpha takes a value from 0x00 to 0xff.
Auttaisiko listoihin tämä? http://www.codeproject.com/cpp/Lists_and_Trees.asp
Ja lisää apuja googlettamalla "linked list c++", ensimmäisessä linkissä mikä minulle tuli oli ihan hyvä kuva miten lista toimii: http://richardbowles.tripod.com/cpp/lin ... nklist.htm
OoO
Re: C++ -kysymykset
Itteasias ton linkitetyn listan löysinkin C++ kirjasta, oli vaan nimellä "Dynaamiset tietorakenteet"
-
- Active Member
- Posts: 248
- Joined: Mon Aug 27, 2007 9:23 pm
- Location: Oulu
Re: C++ -kysymykset
Ps pienenä vinkkinä että se kirja on aika hanurista...temu92 wrote:Itteasias ton linkitetyn listan löysinkin C++ kirjasta, oli vaan nimellä "Dynaamiset tietorakenteet"
OoO
-
- Active Member
- Posts: 101
- Joined: Tue Aug 28, 2007 2:27 pm
Re: C++ -kysymykset
Yritin ajaa Marcoderin dll-tutoriaalia, mutta Dev-C++ valittaa:
dllcrt2.o C:\Users\Mun kone\Desktop\Pelit\DLL\dlls\ld No such file: No such file or directory.
C:\Users\Mun kone\Desktop\Pelit\DLL\dlls\Makefile.win [Build Error] [Project1.dll] Error 1
dllcrt2.o C:\Users\Mun kone\Desktop\Pelit\DLL\dlls\ld No such file: No such file or directory.
C:\Users\Mun kone\Desktop\Pelit\DLL\dlls\Makefile.win [Build Error] [Project1.dll] Error 1
Re: C++ -kysymykset
Sulta puuttuu dllcrt2.o joka on valmiiksi käännetty objekti. Googleta!
-
- Active Member
- Posts: 101
- Joined: Tue Aug 28, 2007 2:27 pm
Re: C++ -kysymykset
Joo. Asia selvisi jo, ja asia johtuu Vistasta. Vistalla MinGW:n dll-luonti ei toimi kunnolla, koska ainakin esikääntäjä sekoilee Vistalla. Asetuksia ja tiedostoja pitää muuttaa, niin toimii.temu92 wrote:Sulta puuttuu dllcrt2.o joka on valmiiksi käännetty objekti. Googleta!