Mutta kun ei toimi. Se mun versio toimi ihan hyvin. Joskin puolipiste unohtu tänne laittaa...Vieras wrote:MessageBoxin vika parametri puuttuu, eikä siinä ole puolipistettä.Jani wrote:Ei toimi tuo "Testi"-funktio...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*
Toimiva:Code: Select all
void Test() { MessageBox(NULL,"Terve","Viesti") }
Korjattu:Code: Select all
void Test() { MessageBox(NULL, "Terve", "Viesti", MB_OK); }
C++ -kysymykset
Re: C++ -kysymykset
Codegolf: 99 bottles of beer (oneliner) - Water map partition
-
- Active Member
- Posts: 248
- Joined: Mon Aug 27, 2007 9:23 pm
- Location: Oulu
Re: C++ -kysymykset
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.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.
Re: C++ -kysymykset
Re: C++ -kysymykset
Ei se Devillä käänny.anttipanda wrote: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.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.
Codegolf: 99 bottles of beer (oneliner) - Water map partition
Re: C++ -kysymykset
Aha, ja mitenkähän tähän päädyit?Jani wrote: Ei se Devillä käänny.
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ä. <__<
Re: C++ -kysymykset
Päädyin siihen näin: Avasin sen tiedoston.dem0 wrote:Aha, ja mitenkähän tähän päädyit?Jani wrote: Ei se Devillä käänny.
Kyllähän se ihan hyvin kompiloituu ainakin 4.9.9.2:lla mikä tässä alla hyrrää.
Codegolf: 99 bottles of beer (oneliner) - Water map partition
Re: C++ -kysymykset
Mahdoitkohan avata niitä lähdekooditiedostoja?Jani wrote:Päädyin siihen näin: Avasin sen tiedoston.dem0 wrote:Aha, ja mitenkähän tähän päädyit?Jani wrote: Ei se Devillä käänny.
Kyllähän se ihan hyvin kompiloituu ainakin 4.9.9.2:lla mikä tässä alla hyrrää.
Ihan kivasti itselläni kääntyy ja toimii. Kääntäjänä GCC, IDEnä C::B
Uusi ongelma: En saa DLL:stä palautusarvoa muistipalaan. Kuinka tämä tulisi toteuttaa?
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
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;
}
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 );
}
-
- Active Member
- Posts: 248
- Joined: Mon Aug 27, 2007 9:23 pm
- Location: Oulu
Re: C++ -kysymykset
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
-
- Forum Veteran
- Posts: 2396
- Joined: Tue Aug 28, 2007 4:20 pm
Re: C++ -kysymykset
Re: C++ -kysymykset
KiitosGrandi 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ä.
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);
}
Kolmio jää vain valkoiseksi. :/
-
- Active Member
- Posts: 248
- Joined: Mon Aug 27, 2007 9:23 pm
- Location: Oulu
Re: C++ -kysymykset
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();
}
Tämmöinen pieni mainostus
Re: C++ -kysymykset
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.hdll.cppCode: 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
Testiohjelma: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; }
main.cppKaikki sujuu hyvin, kunnes pitäisi kutsua funktiota. Silloin ohjelma vain kaatuu. Kokeilkaa vaikka kääntää testiohjelma ja DLL samaan kansioon ja ajaa.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 ); }
Re: C++ -kysymykset
Re: C++ -kysymykset
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;
}
-
- Forum Veteran
- Posts: 2396
- Joined: Tue Aug 28, 2007 4:20 pm
Re: C++ -kysymykset
Re: C++ -kysymykset
se on tehty jo tässä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.
Code: Select all
if(kirjain == seperator && jono == what){
return asd;
}
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
-
- Forum Veteran
- Posts: 2396
- Joined: Tue Aug 28, 2007 4:20 pm