C++ -kysymykset

Muu yhteisön välinen keskustelu.
Feuer
Devoted Member
Posts: 520
Joined: Tue Jun 16, 2009 11:13 am
Contact:

Re: C++ -kysymykset

Post by Feuer »

Mites SDL:n saa tyhjentämään ruudun ennen uutta SDL_Flip():ä? Tuo sorsa jonka kanssa opettelen käyttäytyy kuin cb-sorsa jonka pääloopin drawscreen olisi muoto "DrawScreen OFF,OFF"

Danke, Grandi!
Last edited by Feuer on Sat Dec 12, 2009 5:25 pm, edited 2 times in total.
Asus P8P67 LE/Intel Core i5 2500K/ GTX560/ 8GT RAM/750GT HDDt + 120GT SSD + 13" Macbook Pro
Blogi - Peräpohjola - MERPG
Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm

Re: C++ -kysymykset

Post by Koodiapina »

Code: Select all

SDL_FillRect (SDL_GetVideoSurface(), 0L, 0);
KankiKalle
Active Member
Posts: 170
Joined: Mon Jun 23, 2008 9:04 pm

Re: C++ -kysymykset

Post by KankiKalle »

Aloin tutkiskella C++ tässä pari päivää sitten, ja nyt olen päätynyt hieman kinkkiseen tilanteeseen. Nimittäin, kumpi näistä koodeista on oikein:

Code: Select all

//ohjelmointiputkan C++ oppaasta napattu koodinpätkä
#include <iostream>
int main ()
{
	std::cout <<"Hei maailma!"<< std::endl;
}
Kun taas tälläinen koodinpätkä takertui mukaan jostain C++ oppaasta:

Code: Select all

#include <iostream>
using namespace std;
void  main()
  {
   cout<<" Hello, world \n";
  }
Kummatkin näyttäisivät toimivan, eli tuskin kumpikaan on varsinaisesti väärä, kenties vanhentunut tai jotain? Kumpi tapa olisi parempi? Vai onko mitään väliä?
Väsyttää niin ettei jaksa edes mennä lepäämään.
Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm

Re: C++ -kysymykset

Post by Koodiapina »

Joo, tuo alempi on vanhentunut tapa. C++:n main-funktiohan on muotoa

Code: Select all

int main ([int [, char**]])
JATothrim
Tech Developer
Tech Developer
Posts: 606
Joined: Tue Aug 28, 2007 6:46 pm
Location: Kuopio

Re: C++ -kysymykset

Post by JATothrim »

Grandi jeps. Ja vielä hieman lisää Infoa: kun käytät standardi kirjaston juttuja (cin, cout, #include <iostream>, cmath jne..) kannattaa vain kirjoittaa esikääntäjän komentojen jälkeen "using namespace std;" mikä ottaa "std" nimiavaruuden käyttöön. Säästyt monilta virheiltä kun jokaisen tulostuskomenon eteen ei tarvitse kirjoittaa nimiavaruutta jossa cout sijaitsee.. ;) Jälkeen päin kannattaa (varsinkin isojen sorsien kanssa) ottaa vain yksittäisiä nimiä tyyliin: "using std:cout;"
Ja, jos näyttää että koodi on oiken, mutta kääntäjä buklaa biljoona eri virhettä, vika on linkkerille tai kääntäjälle annetuissa poluissa. Koeta tällöin säätää editorista prohektin asetuksia. Viimeinen vinkki: \ toimii merkkijoinoissa "escapechater":na. Niimpä cout<<"\\"; tulostaa: \ ja cout<<"\""; tulostaa kaksoisheittomerkin. "\n" on rivin vaihto. :)
-On selkeästi impulsiivinen koodaaja joka...
ohjelmoi C++:lla rekursiivisesti instantioidun templaten, jonka jokainen instantiaatio instantioi sekundäärisen singleton-template-luokan, jonka jokainen instanssi käynistää säikeen tulostakseen 'jea'.
User avatar
esa94
Guru
Posts: 1855
Joined: Tue Sep 04, 2007 5:35 pm

Re: C++ -kysymykset

Post by esa94 »

KankiKalle wrote:Aloin tutkiskella C++ tässä pari päivää sitten, ja nyt olen päätynyt hieman kinkkiseen tilanteeseen. Nimittäin, kumpi näistä koodeista on oikein:

Code: Select all

//ohjelmointiputkan C++ oppaasta napattu koodinpätkä
#include <iostream>
int main ()
{
	std::cout <<"Hei maailma!"<< std::endl;
}
Kun taas tälläinen koodinpätkä takertui mukaan jostain C++ oppaasta:

Code: Select all

#include <iostream>
using namespace std;
void  main()
  {
   cout<<" Hello, world \n";
  }
Kummatkin näyttäisivät toimivan, eli tuskin kumpikaan on varsinaisesti väärä, kenties vanhentunut tai jotain? Kumpi tapa olisi parempi? Vai onko mitään väliä?
std::endl flushaa ulostulovirran, suosittelen käyttämään sitä.

Sen lisäksi vaikka void main ei aiheutakaan mitään Windowsilla, muilla alustoilla se saattaa aiheuttaa selittämättömiä virheitä käyttöjärjestelmän tai shellin tasolla.
Pyromanius

Re: C++ -kysymykset

Post by Pyromanius »

Hyvin tyhmä kysymys: Minkä tyyppinen muuttuja on int*? Mistään en ole löytänyt tietoa, joten tuo on varmaankin asia joka minun pitäisi tietää...
Awaclus
Forum Veteran
Posts: 2939
Joined: Tue Aug 28, 2007 2:50 pm

Re: C++ -kysymykset

Post by Awaclus »

Pyromanius wrote:Hyvin tyhmä kysymys: Minkä tyyppinen muuttuja on int*? Mistään en ole löytänyt tietoa, joten tuo on varmaankin asia joka minun pitäisi tietää...
Integer eli kokonaisluku.
Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm

Re: C++ -kysymykset

Post by Koodiapina »

JATothrim
Tech Developer
Tech Developer
Posts: 606
Joined: Tue Aug 28, 2007 6:46 pm
Location: Kuopio

Re: C++ -kysymykset

Post by JATothrim »

Optimointiin juttua. Teen (yllätys uusi projekti!) luokkaa bittikartta törmäyksille, eli ns. pixel-perfect tarkistuksia. Heräsi kysymys että miten kannattaa toteuttaa 2D-taulukko joka sisältää tuon bittikartan. Dataa tulee siis olemaan paljon, koska törmäyskartta voi olla minkä kokoinen tahansa. (eli hyvin iso) Tärkeintä on että taulukkoa luettaisiin mahdollisimman nopeasti silloin, kun bittejä selataan ylös/alas tai oikealle/vasemmalle paljon esim. vektorin sunnassa. Sanokaapas mikä on nopein:
Pseudoa:

Code: Select all

Tapa 1:
// Taulukon varaus:
char * table = new char[width*height]
// Taulukon Solunhaku:
data = table[y*width+x]

Tapa 2:
// Taulukon varaus:
char ** table = new char * [height]
for i = 0 to height
    table[i] = new char[width]
next
// Taulukon Solunhaku:
data = table[y][x];

Tapa 3:
// Taulukon varaus:
char * table = new char[width*height]
char ** helptable = new char * [height]
for i = 0 to height
    helptable[i] = table + i*width
next
// Taulukon Solunhaku:
data = helptable[y]+x
Itse veikkaan Tapa kolmea. 8-)
-On selkeästi impulsiivinen koodaaja joka...
ohjelmoi C++:lla rekursiivisesti instantioidun templaten, jonka jokainen instantiaatio instantioi sekundäärisen singleton-template-luokan, jonka jokainen instanssi käynistää säikeen tulostakseen 'jea'.
User avatar
esa94
Guru
Posts: 1855
Joined: Tue Sep 04, 2007 5:35 pm

Re: C++ -kysymykset

Post by esa94 »

JATothrim wrote:Optimointiin juttua. Teen (yllätys uusi projekti!) luokkaa bittikartta törmäyksille, eli ns. pixel-perfect tarkistuksia. Heräsi kysymys että miten kannattaa toteuttaa 2D-taulukko joka sisältää tuon bittikartan. Dataa tulee siis olemaan paljon, koska törmäyskartta voi olla minkä kokoinen tahansa. (eli hyvin iso) Tärkeintä on että taulukkoa luettaisiin mahdollisimman nopeasti silloin, kun bittejä selataan ylös/alas tai oikealle/vasemmalle paljon esim. vektorin sunnassa. Sanokaapas mikä on nopein:
Pseudoa:

Code: Select all

Tapa 1:
// Taulukon varaus:
char * table = new char[width*height]
// Taulukon Solunhaku:
data = table[y*width+x]

Tapa 2:
// Taulukon varaus:
char ** table = new char * [height]
for i = 0 to height
    table[i] = new char[width]
next
// Taulukon Solunhaku:
data = table[y][x];

Tapa 3:
// Taulukon varaus:
char * table = new char[width*height]
char ** helptable = new char * [height]
for i = 0 to height
    helptable[i] = table + i*width
next
// Taulukon Solunhaku:
data = helptable[y]+x
Itse veikkaan Tapa kolmea. 8-)
Mihin tapa 3 perustuu o_O
JATothrim
Tech Developer
Tech Developer
Posts: 606
Joined: Tue Aug 28, 2007 6:46 pm
Location: Kuopio

Re: C++ -kysymykset

Post by JATothrim »

esa94 wrote:...
Mihin tapa 3 perustuu o_O
Kiitos illan parannuksesta. :D No selitämpäs asian: taulukko varataan dynaamisesti yhtenä pötkönä kuten tapa 1:ssä, mutta lisäksi varataan osoitin taulukko rivien aluille. For loopissa asetetaan aputaulukon osoittimet sojottamaan jokaisen "rivin" alkuun pötkössä varattuun muistiin. Nyt kun helptable[y] palauttaa osoittimen rivin alkuun, ja lisäämällä tähän vielä x saadaan (tada!) oikea indeksi. Huomaa että helptable on taulukollinen osoittimia. Muina Plussina on että "delete[] table" poistaa koko roskan kerralla, toisin kuin tapa 2:ssa. :)
-On selkeästi impulsiivinen koodaaja joka...
ohjelmoi C++:lla rekursiivisesti instantioidun templaten, jonka jokainen instantiaatio instantioi sekundäärisen singleton-template-luokan, jonka jokainen instanssi käynistää säikeen tulostakseen 'jea'.
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: C++ -kysymykset

Post by koodaaja »

Veikkaan että on huomattavasti halvempaa tehdä yksi kertolasku kuin lähteä kaivamaan taulun arvoa RAMista tai edes välimuistista. Etenkin kun muistelisin jostain lukeneeni, että tämä pitää paikkansa jopa trigonometrisillä funktioilla, jotka ovat huomattavasti hitaampia kuin kertolasku.

Tiedä sitten kun en ole millään muotoa testannut (ja näin pienet erot eivät kovin oleellisia yleensä ole, jos nyt ei jotain muutenkin ultimaattisen raskasta väännä ;3 )
JATothrim
Tech Developer
Tech Developer
Posts: 606
Joined: Tue Aug 28, 2007 6:46 pm
Location: Kuopio

Re: C++ -kysymykset

Post by JATothrim »

Enää en veikkaile vaan tutkin, pilkun tarkkaa optimointia tiedossa. :D olkoon pieni harjoutus minulle.
Tapa 3:n tuottama asm-koodi:

Code: Select all

0040F1C0	push   ebp
0040F1C1	mov    ebp,esp
0040F1C3	sub    esp,0x8
0040F1C6	mov    DWORD PTR [ebp-0x4],ecx
0040F1C9	mov    DWORD PTR [ebp-0x8],edx
0040F1CC	mov    eax,DWORD PTR [ebp-0x4]
0040F1CF	mov    eax,DWORD PTR [eax]
0040F1D1	mov    edx,DWORD PTR [ebp+0x8]
0040F1D4	shl    edx,0x2
0040F1D7	add    eax,edx
0040F1D9	mov    edx,DWORD PTR [eax]
0040F1DB	mov    eax,DWORD PTR [ebp-0x8]
0040F1DE	lea    eax,[edx+eax*1]
0040F1E1	mov    al,BYTE PTR [eax]
0040F1E3	leave
0040F1E4	ret    0x4
Tapa 1: tuottama asm-koodi:

Code: Select all

0040F1C0	push   ebp
0040F1C1	mov    ebp,esp
0040F1C3	sub    esp,0x8
0040F1C6	mov    DWORD PTR [ebp-0x4],ecx
0040F1C9	mov    DWORD PTR [ebp-0x8],edx
0040F1CC	mov    eax,DWORD PTR [ebp-0x4]
0040F1CF	mov    edx,DWORD PTR [eax+0x4]
0040F1D2	mov    eax,DWORD PTR [ebp-0x4]
0040F1D5	mov    ecx,DWORD PTR [eax+0x8]
0040F1D8	mov    eax,DWORD PTR [ebp+0x8]
0040F1DB	imul   ecx,eax
0040F1DE	mov    eax,DWORD PTR [ebp-0x8]
0040F1E1	lea    eax,[ecx+eax*1]
0040F1E4	lea    eax,[edx+eax*1]
0040F1E7	mov    al,BYTE PTR [eax]
0040F1E9	leave
0040F1EA	ret    0x4
Analyysi:
Tapa 1:n on enemmän komentoja kuin tapa 3:ssa. Tapa 3 siirtää vähemmän dataa. (9 mov kutsua vs. 10kpl) Molemmat käyttävät saman verran laskuoperaatiota. (4kpl) (add, sub, imul, lea) Näin ollen tapa 3 on nopeampi. koetin etsiä komentojen "clock-cycle" tietoja mutta ei tärpännyt. : / jos löydän ne, edittaan sitten tähän viestiin..
-On selkeästi impulsiivinen koodaaja joka...
ohjelmoi C++:lla rekursiivisesti instantioidun templaten, jonka jokainen instantiaatio instantioi sekundäärisen singleton-template-luokan, jonka jokainen instanssi käynistää säikeen tulostakseen 'jea'.
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 »

Näytäppä huvin vuoksi noita ASM-koodeja vastaavat C++-ohjelmakoodit (ja mieluiten vielä kutsuva osa, mikäli (kun) kyseessä on funktio).
The darkest spells can be found from
http://tunkkaus.blogspot.fi
SPuntte
Tech Developer
Tech Developer
Posts: 650
Joined: Mon Aug 27, 2007 9:51 pm
Location: Helsinki, Finland
Contact:

Re: C++ -kysymykset

Post by SPuntte »

Käyttäessäsi ilmausta "clock-cycle" -tiedot tarkoittanet tietoja siitä, kuinka monta kellojaksoa prosessori kutakin käskyä nysvää? En ole mikään ASM-ex-pertti, mutta ainakin sen tiedon perusteella, mitä minulla konekielestä ja tietokoneen arkkitehtuurista on, väittäisin, että kyseiset tiedot riippuvat arkkitehtuurista. Ja kaikki, mikä ei tapahdu prosessorin sisällä (rekistereissä), on riippuvaista muistakin rakenteista. Esimerkiksi MOV-käskyn operoidessa keskusmuistiin riippuu sen suoritusaika emolevyn muistiväylästä, muisteista ja Intelin vanhemman suoritinarkkitehtuurin tapauksessa myös piirisarjasta.
CoolBasic henkilökuntaa
Tech-kehittäjä
CoolBasic Classic, Cool VES

CoolPhysicsEngine | MissileSystem | Jana-ympyrä -törmäys | cbSimpleTexture | CoolCPLX
Feuer
Devoted Member
Posts: 520
Joined: Tue Jun 16, 2009 11:13 am
Contact:

Re: C++ -kysymykset

Post by Feuer »

Dev-c++ kääntää projektin, mutta valmista exeä ei voi suorittaa. Was ist? Ei tule minkäänlaista virheilmoitusta, ja testattu on sekä 32-bit - vistassa että 64bitvistassa. Ja IDE:n versio on 4.9.9.2

Ja tämä siis yhden ainoan projektin kanssa, perushelloworldeissä ei ole mitään ongelmaa.
Asus P8P67 LE/Intel Core i5 2500K/ GTX560/ 8GT RAM/750GT HDDt + 120GT SSD + 13" Macbook Pro
Blogi - Peräpohjola - MERPG
Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm

Re: C++ -kysymykset

Post by Koodiapina »

Ei se IDE niitä sinun koodejasi käännä.

Millä tavalla ilmenee, ettei EXEä voi suorittaa? Jos se on komentoriviohjelma niin sinun on ajettava se komentoriviltä tai lisättävä ohjelmaan jokin asia joka estää sitä suorittamisensa lopettamisen kunnes ollaan varmistuttu käyttäjän saaneen tietoisuuteensa ohjelman käyttäjälle välitettävät asiat, tässä tapauksessa lähinnä tulostukset.
Feuer
Devoted Member
Posts: 520
Joined: Tue Jun 16, 2009 11:13 am
Contact:

Re: C++ -kysymykset

Post by Feuer »

Kääntäjä, joka tulee yllämainitun IDE:n mukana, ja jonka nimi ei satu juuri tulemaan mieleen.

Ja kun tarkemmin tuota tutkin niin kävi ilmi ettei kyse tosiaan ole mistään Coolbasicista, jolla tehdyt ohjelmat huutavat suureen ääneen ettei homma toimi :roll: Kyllä tuo ohjelma suorittuu, mutta ainoa mitä se tekee on että luo suoritushakemistoon kaksi (tyhjää :shock: ) tiedostoa osoituksena siitä että SDL kohtasi jonkin virheen. Nyt herää jo kysymys että kannattaisiko iskeä koodi tänne ja kärsiä "copypastea!" - valitukset, kun tuo on ohjelmointiputkan SDL-esimerkin päälle kasattu...

Code: Select all

#include "SDL/SDL.h"
#include <string>

//luokillaharrastelua
using namespace std;
using std::string;

    SDL_Surface * naytto;

//tästä alkaa luokat
class pelihahmo
{
      public:
      int x;
      int y;
      
      double health;
      
      char tiedostonimi[11];
      SDL_Surface * hahmo;
      void PiirraItsesi(int x,int y);
//      int Siirry(int x_akseli,int y_akseli);
      pelihahmo();
      ~pelihahmo();
};

class ammukset: public pelihahmo
{
      public:
             ammukset();
             ~ammukset();
};

ammukset::ammukset()
     {hahmo=SDL_LoadBMP("pati.bmp");SDL_SetColorKey(hahmo, SDL_SRCCOLORKEY, SDL_MapRGB(hahmo->format,0,0,0));y=400; }
     
ammukset::~ammukset()
     {SDL_FreeSurface(hahmo);}
     

pelihahmo::~pelihahmo()
    {SDL_FreeSurface(hahmo);}

pelihahmo::pelihahmo()
     {
                      hahmo = SDL_LoadBMP("jamppa.bmp");
                      SDL_SetColorKey(hahmo, SDL_SRCCOLORKEY, SDL_MapRGB(hahmo->format,0,0,0));
                      health=100;
     }

void pelihahmo::PiirraItsesi(int x,int y)
{   if ( hahmo == NULL ) {
        fprintf(stderr, "Kuvannäyttö ei onnistunu: %s\n", SDL_GetError());
        return;
    }

    // mihin näytöllä
    SDL_Rect alue;   
    alue.x = x;
    alue.y = y;
   

    // näytölle
    SDL_BlitSurface(hahmo, NULL, naytto, &alue); // koska toinen parametri on NULL, piirretään koko kuva
} 
//tähän loppuu luokat

Code: Select all

//main

int main(int argc, char *argv[]) {

    if( SDL_Init(SDL_INIT_VIDEO) < 0 )  // paluuarvon ollessa pienempi kuin 0, tapahtui virhe
    {
        fprintf(stderr, "SDL:n alustus ei onnistunut: %s\n", SDL_GetError()); // virheestä tiedot tiedostoon
        return 0; // lopetetaan ohjelma
    }
    ammukset ammus[10];
    
    for(int i=0;i<10;i++) {ammus[i]=ammukset();} //luodaan fyysinen olio kutsumalla constructoria
    
    pelihahmo jamppa;
  //  SDL_Surface * jamppa; //turhia luokan vuoksi
  //  SDL_Surface * pati;
    Uint8* nappi;
   
    naytto = SDL_SetVideoMode(1024, 768, 32, SDL_HWSURFACE|SDL_RESIZABLE);
    //jamppa = SDL_LoadBMP("Jamppa.bmp");
    //pati = SDL_LoadBMP("Pati.bmp");
    
    bool pelissa=true;
   
    int rottax, rottay; //hiiren koordinaatit
    
//    SDL_SetColorKey(jamppa, SDL_SRCCOLORKEY, SDL_MapRGB(jamppa->format,0,0,0)); 
  //  SDL_SetColorKey(pati, SDL_SRCCOLORKEY, SDL_MapRGB(pati->format,0,0,0)); 

      for(int i=0;i<10;i++) {
              ammus[i].y=400+(i*4);
              ammus[i].x=0;}
    while(pelissa)
    {
                  SDL_FillRect (naytto, 0, 0);
                 
                  SDL_GetMouseState(&rottax, &rottay);
                 
                  SDL_Event tapahtuma; // tapahtumat
                  SDL_PollEvent(&tapahtuma);
                  
                  
                 //if(nappi[SDLK_RIGHT]) ammus.x++;
                 for(int i=0;i<10;i++) {
                                  ammus[i].x += 2;
                                  if(ammus[i].x>1024) ammus[i].x=-20;
                 
                                  ammus[i].PiirraItsesi(ammus[i].x,ammus[i].y);
                                  }
                  jamppa.PiirraItsesi(rottax,rottay);
                                  
                  nappi = SDL_GetKeyState(NULL);
                 
                  if(nappi[SDLK_ESCAPE]) pelissa=false;
                 
                  SDL_Flip(naytto);
    }
                     
   
//    SDL_FreeSurface(jamppa);
    SDL_FreeSurface(naytto);
    SDL_FreeSurface(jamppa.hahmo);

    SDL_Quit(); // "suljetaan" SDL
    return 0;
}
EDIT:

Kiitos, Dibalo ja Zero! Miten_voisi_toteuttaa - ajatukset muilta helpottavat tätä puuhaa melkoisesti!

Last edited by Feuer on Thu Jan 07, 2010 11:22 am, edited 1 time in total.
Asus P8P67 LE/Intel Core i5 2500K/ GTX560/ 8GT RAM/750GT HDDt + 120GT SSD + 13" Macbook Pro
Blogi - Peräpohjola - MERPG
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 »

Osoittimet ja perintä on hieman hakusessa. Suosittelen opettelemaan seuraavat asiat ja kokeilemaan sitten uudestaan:Myös muut sivuston tutoriaalit kannattaa lukaista ajatuksen kanssa! ;)

Itse lähtisin toteuttamaan tuota ongelmaasi seuraavalla tavalla:
1) Luokka "kuva", joka sisältää halutun kuvan latauksen tiedostonimen perusteella ja piirto-operaatiot.
2) Panoksille luokka "Ammus", joka perii kuva-luokan ja laajentaa tätä niin, että panos on tietoinen omasta sijainnistaan, suunnastaan ja nopeudestaan ja näin ollen osaa itse päivittää paikkansa ja piirtää itsensä.
3) Pelaajalle luokka "Pelihahmo", joka perii kuva-luokan ja laajentaa tätä niin, että pelaaja on tietoinen sijainnistaan, suunnastaan (nopeudestaan) sekä esimerkiksi nimestään ja hipareistaan.

En kerro, miten edellä mainitut kannattaa toteuttaa, se sinun tulee keksiä itse. :mrgreen:
Jos jaksan, niin saatan kirjoittaa jonkin pienen esimerkin. Vastuu asioiden opettelussa on kuitenkin sinulla! ;)
Lisäksi kannattaa opetella std-kirjastoista ainakin seuraavien luokkien käyttö hyvin: merkkijonot (std::string), vektorit (std::vector) [ ja listat (std::list) ]
The darkest spells can be found from
http://tunkkaus.blogspot.fi
Post Reply