C++ -kysymykset

Muu yhteisön välinen keskustelu.
Jani
Devoted Member
Posts: 741
Joined: Fri Oct 31, 2008 4:53 pm

Re: C++ -kysymykset

Post by Jani »

Vieras wrote:
Jani wrote:
vms100 wrote:Tässä olisi DLL-pohja jollekin joka on kiinnostunut tekemään sellaisen

Kommentoitu on ja helppo ymmärtää. Toivottavasti tästä on jollekin hyötyä :)

*clicks*
Ei toimi tuo "Testi"-funktio...
Toimiva:

Code: Select all

void Test()
{
    MessageBox(NULL,"Terve","Viesti")
}
MessageBoxin vika parametri puuttuu, eikä siinä ole puolipistettä.

Korjattu:

Code: Select all

void Test()
{
    MessageBox(NULL, "Terve", "Viesti", MB_OK);
}
Mutta kun ei toimi. Se mun versio toimi ihan hyvin. Joskin puolipiste unohtu tänne laittaa...
Dead men tell no tales. Also, Python rocks!
Codegolf: 99 bottles of beer (oneliner) - Water map partition
anttipanda
Active Member
Posts: 248
Joined: Mon Aug 27, 2007 9:23 pm
Location: Oulu

Re: C++ -kysymykset

Post by anttipanda »

phons wrote:Kuinka niin ei saa auki? Ja miten tuon dllbase:n saa .DLL muotoon kun sitä ei siinä ollut... En oikein ymmärrä näiden juttujen päälle.
DLL:n saat tietenkin tehtyä siten, että käännät nuo koodit haluamallasi C++-kääntäjällä. Tuossa näytti tulevan dllbase.dev-tiedosto, joka on mitä ilmeisimmin Dev-C++ IDE:n projektitiedosto? Tuon ohjelman lataaminen ja käyttäminen voisi olla hyvä veto jos kokeilla haluaa.
OoO
phons
Guru
Posts: 1056
Joined: Wed May 14, 2008 10:11 am

Re: C++ -kysymykset

Post by phons »

Joo mulla on se ja sitten vielä Code::Blocks jossa en saanut käännettyä tuota, tosin Devillä en kokeillut.
Image
Jani
Devoted Member
Posts: 741
Joined: Fri Oct 31, 2008 4:53 pm

Re: C++ -kysymykset

Post by Jani »

anttipanda wrote:
phons wrote:Kuinka niin ei saa auki? Ja miten tuon dllbase:n saa .DLL muotoon kun sitä ei siinä ollut... En oikein ymmärrä näiden juttujen päälle.
DLL:n saat tietenkin tehtyä siten, että käännät nuo koodit haluamallasi C++-kääntäjällä. Tuossa näytti tulevan dllbase.dev-tiedosto, joka on mitä ilmeisimmin Dev-C++ IDE:n projektitiedosto? Tuon ohjelman lataaminen ja käyttäminen voisi olla hyvä veto jos kokeilla haluaa.
Ei se Devillä käänny.
Dead men tell no tales. Also, Python rocks!
Codegolf: 99 bottles of beer (oneliner) - Water map partition
dem0
Newcomer
Posts: 43
Joined: Wed Mar 19, 2008 7:36 am

Re: C++ -kysymykset

Post by dem0 »

Jani wrote: Ei se Devillä käänny.
Aha, ja mitenkähän tähän päädyit?
Kyllähän se ihan hyvin kompiloituu ainakin IDE4.9.9.2:lla mikä tässä alla hyrrää.

e. Vielä pakko sanoa taasen, että ei se IDE niitä käännä. <__<
Last edited by dem0 on Sun Feb 22, 2009 3:00 pm, edited 1 time in total.
Jani
Devoted Member
Posts: 741
Joined: Fri Oct 31, 2008 4:53 pm

Re: C++ -kysymykset

Post by Jani »

dem0 wrote:
Jani wrote: Ei se Devillä käänny.
Aha, ja mitenkähän tähän päädyit?
Kyllähän se ihan hyvin kompiloituu ainakin 4.9.9.2:lla mikä tässä alla hyrrää.
Päädyin siihen näin: Avasin sen tiedoston.
Dead men tell no tales. Also, Python rocks!
Codegolf: 99 bottles of beer (oneliner) - Water map partition
User avatar
esa94
Guru
Posts: 1855
Joined: Tue Sep 04, 2007 5:35 pm

Re: C++ -kysymykset

Post by esa94 »

Jani wrote:
dem0 wrote:
Jani wrote: Ei se Devillä käänny.
Aha, ja mitenkähän tähän päädyit?
Kyllähän se ihan hyvin kompiloituu ainakin 4.9.9.2:lla mikä tässä alla hyrrää.
Päädyin siihen näin: Avasin sen tiedoston.
Mahdoitkohan avata niitä lähdekooditiedostoja?
EDIT:

Ihan kivasti itselläni kääntyy ja toimii. Kääntäjänä GCC, IDEnä C::B

-----------------
EDIT:

Uusi ongelma: En saa DLL:stä palautusarvoa muistipalaan. Kuinka tämä tulisi toteuttaa?

EDIT:

Myöskin: Minulla on ongelma DLL'n dynaamisessa linkityksessä @ c++. Minulla on seuraavat lähdetiedostot:

DLL:
dll.h

Code: Select all

#ifndef _DLL_H_
#define _DLL_H_

#include <iostream.h>
#include <stdio.h>
#include <windows.h>

#define DLL_EXPORT extern "C" __declspec( dllexport )
DLL_EXPORT int * GrabLol( int * _in ); // Luo vastaavanlainen rivi aina kun luot uuden funktion.
DLL_EXPORT int Lol( int * _in );

#endif

dll.cpp

Code: Select all

#include "dll.h"
#include <windows.h>

DLL_EXPORT // Tarvitset tämän aina kun uusi funktio alkaa.

int * GrabLol( int * _in ) {

    int in = *_in;
    int * _out = 0;

    if ( in == 1337 ) {

        *_out = 715517;

    }
    else {

        *_out = 80085;

    }

    return _out;
}

DLL_EXPORT

int Lol( int * _in ) {

    char * tempChar = "";
    MessageBox( NULL, itoa( *GrabLol( _in ), tempChar, 10 ), "MSG", NULL );
    return 1;

}
Testiohjelma:
main.cpp

Code: Select all

#include <iostream>
#include <windows.h>

using namespace std;

typedef int * ( WINAPI * MyFuncT )( int * );

int main() {

    HINSTANCE MyDLL = LoadLibrary( "DLL.dll" );
    if ( MyDLL ) {

        cout << "DLL LOADING SUCCESFUL!" << endl << "DLL LOADED TO MEMORY AT " << MyDLL << endl;

    }
    else {

        cout << "DLL LOADING FAILED!" << endl;

    }

    cout << "----------";
    cin.get();

    MyFuncT MyFunc = (MyFuncT)GetProcAddress( (HINSTANCE)MyDLL, "Lol" );

    if ( MyFunc ) {

        cout << "FUNCTION LOADING SUCCESFUL!" << endl;

        cout << "----------";
        cin.get();

        int * _joo = 0;
        *_joo = 1337;

        cout << MyFunc( _joo );

    }
    else {

        cout << "FUNCTION LOADING FAILED!" << endl;

    }

    cout << "----------";
    cin.get();

    return !FreeLibrary( MyDLL );

 }
Kaikki sujuu hyvin, kunnes pitäisi kutsua funktiota. Silloin ohjelma vain kaatuu. Kokeilkaa vaikka kääntää testiohjelma ja DLL samaan kansioon ja ajaa.[/edit]
anttipanda
Active Member
Posts: 248
Joined: Mon Aug 27, 2007 9:23 pm
Location: Oulu

Re: C++ -kysymykset

Post by anttipanda »

Jani wrote:Päädyin siihen näin: Avasin sen tiedoston.
Asiantuntijuutta :D
OoO
sillie
Newcomer
Posts: 19
Joined: Sun Dec 14, 2008 8:56 pm

Re: C++ -kysymykset

Post by sillie »

SDL ja OpenGL ovat molemmat tunnetusti toimivia sekä winukalla, linuxilla ja macilla.

Muttatosiaan, käytännössä en ole koskaan ohjelmoinut kuin Windowsille.

Pitääkö koodiin tehdä muutoksia, vai toimiiko se joka alustalla kunhan vain buildaa oman version?

Oma koodinpätkäni, josta pelikin pitäisi joskus valmistua, käyttää otsikkotiedostoja SDL.h ja gl.h, joiden pitäisi myös linuxilta löytyä. Siltä osin homma on siis selvä.
Käytän SDL -funktioita syötteiden nappaamiseen ja ikkunan luomiseen, ja sitten puhtaasti OpenGLää grafiikkaan.

Niin kauan kun en käytä Windows APIa tai muita Windows-only kirjastoja pitäisi tuon saman koodin toimia myös Linuxilla ilman muutoksia, vai?

Filujen käsittelyssä turvaudun varmaan iostream.h, joka sekin pitäisi linuxilla toimia kun kerta C++ standardikirjastoon kuuluu?`

Kiitos jos joku viitsii opastaa aloittelijaa :D
Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm

Re: C++ -kysymykset

Post by Koodiapina »

Windows-only kirjastojen lisäksi myös joitakin funktioita on vältettävä. Näihin kuuluu esimerkiksi stdlib.h:sta löytyvät tyyppimuunnos funktiot itoa/atoi ja mitä kaikkia niitä nyt löytyykään. Ne eivät toimi kaikilla kääntäjillä, koska ovat epästandardia C++:aa. Niiden korvikkeeksi kannattaa ottaa vaikka sstream, jonka olen ainakin itse huomannut varsin toimivaksi. Näin saat koodistasi parempaa jos alat jakelemaan sitä.
sillie
Newcomer
Posts: 19
Joined: Sun Dec 14, 2008 8:56 pm

Re: C++ -kysymykset

Post by sillie »

Grandi wrote:Windows-only kirjastojen lisäksi myös joitakin funktioita on vältettävä. Näihin kuuluu esimerkiksi stdlib.h:sta löytyvät tyyppimuunnos funktiot itoa/atoi ja mitä kaikkia niitä nyt löytyykään. Ne eivät toimi kaikilla kääntäjillä, koska ovat epästandardia C++:aa. Niiden korvikkeeksi kannattaa ottaa vaikka sstream, jonka olen ainakin itse huomannut varsin toimivaksi. Näin saat koodistasi parempaa jos alat jakelemaan sitä.
Kiitos ;)

EDIT: Mikäköhän mun teksturoinnissa on vikana? Copypastea on joo, mutta en millään saa toimimaan, kaikenlaisia purkkavirityksiä oon myöskin tehny kymmeniä mutta ei vaan toimi :/ Tässä nyt valehtelematta oon tunnin koodia tutkinu, enkä löydä että mitään puuttuis vaikka samalla tutkailen suomipelit.comin, ohjelmointiputkan ja nehen tutoja :/ Pakko postata tänne jos joku viittis kahtoo, alan muuten hyppimään seinille.

Code: Select all

#include <SDL/SDL.h>
#include <gl/gl.h>

// Metabolixin tekstuurinlatausfunkkari ohjelmointiputkasta
int MySDL_glTexImage2D(SDL_Surface *kuva) 
{ 
    SDL_Surface *apu; 
    /* Helpottaa, jos tavut ovat järjestyksessä RGBA. 
     * Säädetään siis konetyypin mukaan värien bittimaskit 
     * niin, että tavujen järjestys muistissa osuu oikein. */ 
#if SDL_BYTEORDER == SDL_BIG_ENDIAN 
    const Uint32 rshift = 24, gshift = 16, bshift = 8, ashift = 0; 
#else 
    const Uint32 rshift = 0, gshift = 8, bshift = 16, ashift = 24; 
#endif 
    const Uint32 
        rmask = 0xff << rshift, 
        gmask = 0xff << gshift, 
        bmask = 0xff << bshift, 
        amask = 0xff << ashift; 
    Uint32 *ptr; 
    Uint32 kuva_flags; 
    Uint32 kuva_colorkey; 
    Uint8 kuva_alpha; 
    SDL_Rect r1, r2; 
     
    /* Tarkistetaan kuva. OpenGL:ää varten sivun pitää olla kahdella jaollinen. */ 
    if (!kuva || !kuva->w || !kuva->h || (kuva->w & 1) || (kuva->h & 1)) { 
        return -1; 
    } 
     
    /* Otetaan talteen arvot, jotka muuttuvat funktion aikana */ 
    kuva_flags = kuva->flags; 
    kuva_alpha = kuva->format->alpha; 
    kuva_colorkey = kuva->format->colorkey; 
     
    /* Luodaan apupinta halutussa formaatissa (RGBA). */ 
    apu = SDL_CreateRGBSurface(SDL_SWSURFACE, kuva->w, kuva->h, 32, rmask, gmask, bmask, amask); 
    if (!apu) { 
        return -1; 
    } 
    SDL_FillRect(apu, 0, 0); 
     
    /* Poistetaan erityiset läpinäkyvyysasetukset. */ 
    SDL_SetAlpha(kuva, 0, 0); 
    if ((kuva_flags & SDL_SRCALPHA) != 0 && kuva->format->Amask) { 
        SDL_SetColorKey(kuva, 0, 0); 
    } 
     
    /* OpenGL:n ja SDL:n y-akselit osoittavat eri suuntiin. 
     * Kopioidaan siis kuva pikselirivi kerrallaan ylösalaisin. */ 
    r1.x = r2.x = 0; 
    r1.h = r2.h = 1; 
    r1.w = r2.w = kuva->w; 
    for (r1.y = 0, r2.y = kuva->h - 1; r2.y >= 0; ++r1.y, --r2.y) { 
        SDL_BlitSurface(kuva, &r1, apu, &r2); 
    } 
     
    /* Koko pinnan alfa-arvo pitää palauttaa erikseen, jos sellainen on. */ 
    if ((kuva_flags & SDL_SRCALPHA) && !kuva->format->Amask && kuva_alpha != 0xff) { 
        for (r1.y = 0; r1.y < apu->h; ++r1.y) { 
            ptr = (Uint32*)((Uint8*) apu->pixels + r1.y * apu->pitch); 
            for (r1.x = 0; r1.x < apu->w; ++r1.x) { 
                if ((ptr[r1.x] & amask) != 0) { 
                    ptr[r1.x] &= (kuva_alpha << ashift) | ~amask; 
                } 
            } 
        } 
    } 
     
    /* Lähetetään kuva OpenGL:lle, tuhotaan apupinta ja palautetaan asetukset. */ 
    glTexImage2D(GL_TEXTURE_2D, 0, 4, apu->w, apu->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, apu->pixels); 
    SDL_FreeSurface(apu); 
    SDL_SetAlpha(kuva, kuva_flags, kuva_alpha); 
    SDL_SetColorKey(kuva, kuva_flags, kuva_colorkey); 
    return 0; 
}


int main(int argc, char *argv[]){
    
  SDL_Event event;
  
  GLuint tex; 
  SDL_Surface *kuva; 

  SDL_Init(SDL_INIT_VIDEO);
  SDL_SetVideoMode(600, 300, 0, SDL_OPENGL | SDL_HWSURFACE);
  
  glViewport(0, 0, 600, 300);
  glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  glClearDepth(1.0);
  glDepthFunc(GL_LEQUAL);
  glEnable(GL_DEPTH_TEST);
  glEnable(GL_TEXTURE_2D);
  glShadeModel(GL_SMOOTH);
  glMatrixMode(GL_PROJECTION);
  glMatrixMode(GL_MODELVIEW);
  
  glGenTextures(1, &tex); 
  glBindTexture(GL_TEXTURE_2D, tex); 

  kuva = SDL_LoadBMP("kuva.bmp"); 
if (MySDL_glTexImage2D(kuva) != 0) { 
  fprintf(stderr, "Virhe.\n"); 
} 
  
  int done;
  for(done = 0; !done;){
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glLoadIdentity();
    glTranslatef(0.0f,0.0f,0.0f);

    glBegin(GL_TRIANGLES);
    glTexCoord2f(0.5,1.0); glVertex3f(0.0f, 1.0f, -1.0f);
    glTexCoord2f(1.0,0.0); glVertex3f(0.1f, -0.1f, -1.0f);
    glTexCoord2f(0.0,0.0); glVertex3f(-0.1f, -0.1f, -1.0f);
    glEnd();

    SDL_GL_SwapBuffers();
    SDL_PollEvent(&event);
    if(event.key.keysym.sym == SDLK_ESCAPE)
      done = 1;
  }
  SDL_FreeSurface(kuva); 
  glDeleteTextures(1, &tex);
  SDL_Quit();
  return(0);
}
kuva.bmp kyllä löytyy samasta kansiosta. Eikä mitään virheitä anna.
Kolmio jää vain valkoiseksi. :/
anttipanda
Active Member
Posts: 248
Joined: Mon Aug 27, 2007 9:23 pm
Location: Oulu

Re: C++ -kysymykset

Post by anttipanda »

Asiasta kolmanteen, jos haluaa tehdä C++:lla helposti Windows-ohjelmia (ja miksei Linuxille, Macille, Windows CE:lle ja S60:llekin) kannattaa ehtottomasti tutustua Qt:hen. Koodin pitäisi oikein tehtynä kääntyä monelle alustalle, eli ihanteellista opeteltavaa jos on epäselvyyksiä noiden kaiken maailman kirjastojen kanssa. Mm. KDE ja Google Earth on koodattu Qt:lla. Ja koska koodi on kuitenkin ihan C++:aa, sekaan voi viskellä Qt:hen kuulumatonta koodia. Qt:llä onnistuu myös 3d-ohjelmointi OpenGL-moduulin ansiosta.

Alkuun pääsemiseen riittää kun lataa ja asentaa täyden Qt Creator-paketin (ei ihan virallinen julkaisu vielä), joka sisältää Windows-IDEn, MinGW-kääntäjän ja itse Qt-kirjastot, plus esimerkkejä. Tässä yksikertainen windows-ohjelma joka pitäisi tuolla paketilla saada kääntymään:

Code: Select all

#include <QApplication>
#include <QPushButton>

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

    QPushButton button("Hello World!");
    button.show();
    QObject::connect(&button, SIGNAL(clicked()), &a, SLOT(quit()));

    return a.exec();
}
Esimerkki on enemmän tai vähemmän lainattu täältä: http://doc.trolltech.com/4.3/tutorial.html.

Tämmöinen pieni mainostus :)
OoO
User avatar
esa94
Guru
Posts: 1855
Joined: Tue Sep 04, 2007 5:35 pm

Re: C++ -kysymykset

Post by esa94 »

Toistan:
esa94 wrote:Uusi ongelma: En saa DLL:stä palautusarvoa muistipalaan. Kuinka tämä tulisi toteuttaa?[/edit]
EDIT:

Myöskin: Minulla on ongelma DLL'n dynaamisessa linkityksessä @ c++. Minulla on seuraavat lähdetiedostot:

DLL:
dll.h

Code: Select all

#ifndef _DLL_H_
#define _DLL_H_

#include <iostream.h>
#include <stdio.h>
#include <windows.h>

#define DLL_EXPORT extern "C" __declspec( dllexport )
DLL_EXPORT int * GrabLol( int * _in ); // Luo vastaavanlainen rivi aina kun luot uuden funktion.
DLL_EXPORT int Lol( int * _in );

#endif

dll.cpp

Code: Select all

#include "dll.h"
#include <windows.h>

DLL_EXPORT // Tarvitset tämän aina kun uusi funktio alkaa.

int * GrabLol( int * _in ) {

    int in = *_in;
    int * _out = 0;

    if ( in == 1337 ) {

        *_out = 715517;

    }
    else {

        *_out = 80085;

    }

    return _out;
}

DLL_EXPORT

int Lol( int * _in ) {

    char * tempChar = "";
    MessageBox( NULL, itoa( *GrabLol( _in ), tempChar, 10 ), "MSG", NULL );
    return 1;

}
Testiohjelma:
main.cpp

Code: Select all

#include <iostream>
#include <windows.h>

using namespace std;

typedef int * ( WINAPI * MyFuncT )( int * );

int main() {

    HINSTANCE MyDLL = LoadLibrary( "DLL.dll" );
    if ( MyDLL ) {

        cout << "DLL LOADING SUCCESFUL!" << endl << "DLL LOADED TO MEMORY AT " << MyDLL << endl;

    }
    else {

        cout << "DLL LOADING FAILED!" << endl;

    }

    cout << "----------";
    cin.get();

    MyFuncT MyFunc = (MyFuncT)GetProcAddress( (HINSTANCE)MyDLL, "Lol" );

    if ( MyFunc ) {

        cout << "FUNCTION LOADING SUCCESFUL!" << endl;

        cout << "----------";
        cin.get();

        int * _joo = 0;
        *_joo = 1337;

        cout << MyFunc( _joo );

    }
    else {

        cout << "FUNCTION LOADING FAILED!" << endl;

    }

    cout << "----------";
    cin.get();

    return !FreeLibrary( MyDLL );

 }
Kaikki sujuu hyvin, kunnes pitäisi kutsua funktiota. Silloin ohjelma vain kaatuu. Kokeilkaa vaikka kääntää testiohjelma ja DLL samaan kansioon ja ajaa.
Guest

Re: C++ -kysymykset

Post by Guest »

Koetapa vaikka käyttää debuggeria josko tuon kaatumisen syy selviäisi.
zHelmet
Member
Posts: 73
Joined: Mon Nov 10, 2008 3:55 pm

Re: C++ -kysymykset

Post by zHelmet »

osaako kukaan saaha tätä funktiota tehokkaammaksi?

Code: Select all

std::string explode_string(std::string lol,std::string seperator,int what){
     std::string asd;
     int kohta=0;
     int jono=0;
     while(kohta < lol.length()){
        std::string kirjain = lol.substr (kohta,1);
        if(kirjain == seperator && jono != what){
           jono++;
        }else if(jono == what){
           asd+=kirjain;
        }
        kohta++;
        kirjain = lol.substr (kohta,1);
        if(kirjain == seperator && jono == what){
           return asd;
        }
     }
     if(asd == "") return "-1";
     return asd;
} 
Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm

Re: C++ -kysymykset

Post by Koodiapina »

Silleen sais nopeammaksi, että palauttaa arvon jo siinä vaiheessa kun haluttu pätkä on luettu. Nyt näyttäisi siltä, että koko merkkijono käydään loppuun asti joka tapauksessa.
zHelmet
Member
Posts: 73
Joined: Mon Nov 10, 2008 3:55 pm

Re: C++ -kysymykset

Post by zHelmet »

Grandi wrote:Silleen sais nopeammaksi, että palauttaa arvon jo siinä vaiheessa kun haluttu pätkä on luettu. Nyt näyttäisi siltä, että koko merkkijono käydään loppuun asti joka tapauksessa.
se on tehty jo tässä

Code: Select all

        if(kirjain == seperator && jono == what){
           return asd;
        }
EDIT:

Tarkoituksena on että tuo lukee tiedostosta rivin esim."0|0|0|0" jossa on tietoja ohjelmaa varten tietysti jos on nopeampi vaihtoehto kuin omaratkaisuni niin mikä ettei

Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm

Re: C++ -kysymykset

Post by Koodiapina »

No oletko kokeillut tätä?
Jormalaz
Member
Posts: 77
Joined: Sun Jun 15, 2008 9:22 pm

Re: C++ -kysymykset

Post by Jormalaz »

Tiedättekö millä kirjastolla pystyisi mallintamaan objekteja tai jotain vastaavaa projektiini? Käytän Visual C++:tä. Olisi tarkoitus, että jotenkin 3D Studio Maxilla mallintamat aseet yms. saisi peliin jotenkin. Millä kirjastolla se onnistuu?
phons
Guru
Posts: 1056
Joined: Wed May 14, 2008 10:11 am

Re: C++ -kysymykset

Post by phons »

Irrlicht tai Ogre... Äläkä sano ettei ne toimii siinä, sillä itsellä Irrlicht ainakin toimii, kyllä jossain on joku tuto niiden laittamiseen.
Image
Post Reply