C++ -kysymykset

Muu yhteisön välinen keskustelu.
User avatar
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: C++ -kysymykset

Post by koodaaja » Mon Oct 08, 2007 8:17 pm

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?

User avatar
jabanii
Member
Posts: 93
Joined: Tue Aug 28, 2007 9:23 pm

Re: C++ -kysymykset

Post by jabanii » Mon Oct 08, 2007 10:49 pm

anttipanda wrote:
jabanii 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.

Code: Select all

	if(WSAStartup(MAKEWORD(2,2), &wsadata)==SOCKET_ERROR)
	{
	  WSACleanup();
	  return 1;
	}
        return 0;
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.
Katso mikä paluuarvo WSAStartupilta tulee: http://msdn2.microsoft.com/en-us/library/ms742213.aspx
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?
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.

User avatar
anttipanda
Active Member
Posts: 248
Joined: Mon Aug 27, 2007 9:23 pm
Location: Oulu

Re: C++ -kysymykset

Post by anttipanda » Tue Oct 09, 2007 8:37 am

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?
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.
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).
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.
Heh, niinpäs olikin :) No hyvä kun selvisi (ja kerroit muillekin ;) )
OoO

User avatar
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: C++ -kysymykset

Post by koodaaja » Tue Oct 09, 2007 4:19 pm

anttipanda wrote:
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?
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.
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).
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.
Heh, niinpäs olikin :) No hyvä kun selvisi (ja kerroit muillekin ;) )
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.

User avatar
anttipanda
Active Member
Posts: 248
Joined: Mon Aug 27, 2007 9:23 pm
Location: Oulu

Re: C++ -kysymykset

Post by anttipanda » Wed Oct 10, 2007 12:48 pm

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

User avatar
jabanii
Member
Posts: 93
Joined: Tue Aug 28, 2007 9:23 pm

Re: C++ -kysymykset

Post by jabanii » Thu Oct 18, 2007 7:59 pm

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

User avatar
anttipanda
Active Member
Posts: 248
Joined: Mon Aug 27, 2007 9:23 pm
Location: Oulu

Re: C++ -kysymykset

Post by anttipanda » Fri Oct 19, 2007 10:14 am

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___.
linuxin resursseista en tiedä mitään. yleensä sulautettujen resurssien käyttö on muutenkin melko turhaa... Eivät takuulla toimi samalla tavalla kuin windowsissa.

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

User avatar
Dibalo
Advanced Member
Posts: 298
Joined: Mon Aug 27, 2007 8:12 pm
Location: Espoo, Finland
Contact:

Re: C++ -kysymykset

Post by Dibalo » Fri Oct 19, 2007 9:16 pm

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ä.
Usein olen törmännyt Windowsin yhteydessä WIN32-symboliin. Linuxin symboli ei tule nyt mieleen.
The darkest spells can be found from
http://tunkkaus.blogspot.fi

User avatar
jabanii
Member
Posts: 93
Joined: Tue Aug 28, 2007 9:23 pm

Re: C++ -kysymykset

Post by jabanii » Fri Oct 19, 2007 9:17 pm

anttipanda wrote:
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___.
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ä.
Ajattelin vain, että onko esikääntäjässä mitään tälläistä:

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

User avatar
Dibalo
Advanced Member
Posts: 298
Joined: Mon Aug 27, 2007 8:12 pm
Location: Espoo, Finland
Contact:

Re: C++ -kysymykset

Post by Dibalo » Sat Oct 20, 2007 6:40 pm

No tottakai on, jos vain teet niin! :lol:
The darkest spells can be found from
http://tunkkaus.blogspot.fi

User avatar
anttipanda
Active Member
Posts: 248
Joined: Mon Aug 27, 2007 9:23 pm
Location: Oulu

Re: C++ -kysymykset

Post by anttipanda » Mon Oct 22, 2007 9:43 am

Ajattelin vain, että onko esikääntäjässä mitään tälläistä:
Edellisessä viestissäni jo ilmaisin, miten kyseinen toiminnallisuus voidaan saavuttaa.

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

User avatar
Dibalo
Advanced Member
Posts: 298
Joined: Mon Aug 27, 2007 8:12 pm
Location: Espoo, Finland
Contact:

Re: C++ -kysymykset

Post by Dibalo » Mon Oct 22, 2007 3:47 pm

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
The darkest spells can be found from
http://tunkkaus.blogspot.fi

User avatar
anttipanda
Active Member
Posts: 248
Joined: Mon Aug 27, 2007 9:23 pm
Location: Oulu

Re: C++ -kysymykset

Post by anttipanda » Tue Oct 23, 2007 12:11 pm

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:

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();
    }
};
Tai jopa:

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();
}
Tämänkin voisi tosin tehdä toisin, mutta kuten sanottua keinoja on melkein yhtä paljon kuin koodareita :)
OoO

User avatar
temu92
Web Developer
Web Developer
Posts: 1226
Joined: Mon Aug 27, 2007 9:56 pm
Location: Gamindustri
Contact:

Re: C++ -kysymykset

Post by temu92 » Tue Oct 23, 2007 9:12 pm

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

User avatar
anttipanda
Active Member
Posts: 248
Joined: Mon Aug 27, 2007 9:23 pm
Location: Oulu

Re: C++ -kysymykset

Post by anttipanda » Wed Oct 24, 2007 10:03 am

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
En ole esimerkkejä etsinyt, mutta dokumentaatiossa on seuraavaa:
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.
Ehkä tuosta saa tarpeeksi selvän kuvan miten läpinäkyvän kuvan voi piirtää.

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

User avatar
temu92
Web Developer
Web Developer
Posts: 1226
Joined: Mon Aug 27, 2007 9:56 pm
Location: Gamindustri
Contact:

Re: C++ -kysymykset

Post by temu92 » Wed Oct 24, 2007 11:47 am

Itteasias ton linkitetyn listan löysinkin C++ kirjasta, oli vaan nimellä "Dynaamiset tietorakenteet"

User avatar
anttipanda
Active Member
Posts: 248
Joined: Mon Aug 27, 2007 9:23 pm
Location: Oulu

Re: C++ -kysymykset

Post by anttipanda » Wed Oct 24, 2007 2:53 pm

temu92 wrote:Itteasias ton linkitetyn listan löysinkin C++ kirjasta, oli vaan nimellä "Dynaamiset tietorakenteet"
Ps pienenä vinkkinä että se kirja on aika hanurista...
OoO

User avatar
jannepelaa
Active Member
Posts: 101
Joined: Tue Aug 28, 2007 2:27 pm

Re: C++ -kysymykset

Post by jannepelaa » Tue Nov 06, 2007 6:55 pm

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

User avatar
temu92
Web Developer
Web Developer
Posts: 1226
Joined: Mon Aug 27, 2007 9:56 pm
Location: Gamindustri
Contact:

Re: C++ -kysymykset

Post by temu92 » Wed Nov 07, 2007 5:37 pm

Sulta puuttuu dllcrt2.o joka on valmiiksi käännetty objekti. Googleta!

User avatar
jannepelaa
Active Member
Posts: 101
Joined: Tue Aug 28, 2007 2:27 pm

Re: C++ -kysymykset

Post by jannepelaa » Wed Nov 07, 2007 5:50 pm

temu92 wrote:Sulta puuttuu dllcrt2.o joka on valmiiksi käännetty objekti. Googleta!
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.

Post Reply