Re: C++ -kysymykset
Posted: Mon Feb 07, 2011 2:45 pm
Miten c++ saa vaihdettua tekstin värin ja saa sijoitettua tekstin x,y koordinaatteihin? Mielellään ilman sdl, opengl ym.
Cursesmkn wrote:Miten c++ saa vaihdettua tekstin värin ja saa sijoitettua tekstin x,y koordinaatteihin? Mielellään ilman sdl, opengl ym.
Riippuen alustasta joko PDCurses tai ncurses
RTFM or GTFO :Vmkn wrote:Olen aloittanut c++ pari viikkoa sitten ---> olen huono :D
Voisitko kertoa millä "funktiolla?" se onnistuu.
Ja koodi kiitos...mkn wrote:Kun kääntää sdl ohjelman niin se kaatuu Olen noudattanut ohjelmointiputkan sdl oppaan esimerkkejä tarkasti mutta ei toimi siitä huolimatta
Code: Select all
#include <Windows.h>
#include <fstream>
#include <iostream>
int FileSize(const char* sFileName) //kotoisin osoitteesta http://www.codeproject.com/KB/files/filesize.aspx
{
std::ifstream f;
f.open(sFileName, std::ios_base::binary | std::ios_base::in);
if (!f.good() || f.eof() || !f.is_open()) { return 0; }
f.seekg(0, std::ios_base::beg);
std::ifstream::pos_type begin_pos = f.tellg();
f.seekg(0, std::ios_base::end);
return static_cast<int>(f.tellg() - begin_pos);
}
bool tulostaTavut(const char* polku)
{
int size = FileSize(polku);
if(size<1) //tyhjä tai olematon tiedosto :)
{
MessageBox(NULL,L"Tiedostohärö",L"Tiedostohärö",NULL);
return false;
}
std::ifstream f(polku,std::ios::in | std::ios::binary);
unsigned char* sisältö = new unsigned char[size];
if(f.is_open())
{
f.read((char*)sisältö,size);
for(int i=0; i<size; i++)
{
std::cout<<"Kohdassa "<<i<<" lukee: "<<(int)sisältö[i]<<std::endl;
}
}
delete [] sisältö;
f.close();
return true;
}
Äkkiä tuosta pisti silmään ainakin, että muuttujanimesi sisältää ääkkösiä. Se saattaa laittaa kääntäjän tekemään hassuja.Feuer wrote:Miksi pelkkä tuollaisen koodilohkon mukanaolo saa ohjelman kaatumaan sulkeutuessa, vaikkei sitä kutsuta? Ja mikä olisi turvallinen tapa lukea tiedostosta N tavua johonkin containeriin? Lisäksi, mikä ylläolevassa on väärin?Code: Select all
#include <Windows.h> #include <fstream> #include <iostream> int FileSize(const char* sFileName) //kotoisin osoitteesta http://www.codeproject.com/KB/files/filesize.aspx { std::ifstream f; f.open(sFileName, std::ios_base::binary | std::ios_base::in); if (!f.good() || f.eof() || !f.is_open()) { return 0; } f.seekg(0, std::ios_base::beg); std::ifstream::pos_type begin_pos = f.tellg(); f.seekg(0, std::ios_base::end); return static_cast<int>(f.tellg() - begin_pos); } bool tulostaTavut(const char* polku) { int size = FileSize(polku); if(size<1) //tyhjä tai olematon tiedosto :) { MessageBox(NULL,L"Tiedostohärö",L"Tiedostohärö",NULL); return false; } std::ifstream f(polku,std::ios::in | std::ios::binary); unsigned char* sisältö = new unsigned char[size]; if(f.is_open()) { f.read((char*)sisältö,size); for(int i=0; i<size; i++) { std::cout<<"Kohdassa "<<i<<" lukee: "<<(int)sisältö[i]<<std::endl; } } delete [] sisältö; f.close(); return true; }
Onko sulla varmasti kaikki kuvat ja tarvittavat dll:t koneella?mkn wrote:http://www.ohjelmointiputka.net/opas.php?tunnus=sdl3
Ohjelmointiputkan sdl-opas 3 ja tuton alin koodi.
Toimii veljeni koneella, mutta itselläni se vain kaatuu :(
Tämän takia kohellan mielummin itse kuin tulen kysymään apua, jonka antaminen voisi joskus jopa johtaa johonkin järkevään lopputulokseenkin >:([/edit]Vika lienee koneen käyttäjässä jos homma ei pelaa...
Itse olen kyllä käyttänyt SDL:ää ja fstreamia varsin hyvin yhdessä. Vika lienee koneen käyttäjässä jos homma ei pelaa...Feuer wrote:Teinpä tutkimuksia tuosta omasta ongelmastani: kun projekti sisältää nuo pari viestiä sitten mainitsemani funktiot ja mainin joka kutsuu tulostaTavut() - funktiota, kaikki toimii ihan kauniisti, mutta erään SDL-projektin kyljessä tuo käyttäytyy kuten kerroin.
Lisäksi, kun tuosta projektista kommentoi ulos kaiken fstreamiin liittyvän, ohjelma pysyy aivan kauniisti pystyssä loppuun asti. SDLllä lienee siis jotain fstreamia vastaan -> kannattaisi kokeilla toteuttaa tuo tiedoston lukeminen C:n tiedostoapilla?
Feuer wrote:Miksi pelkkä tuollaisen koodilohkon mukanaolo saa ohjelman kaatumaan sulkeutuessa, vaikkei sitä kutsuta? Ja mikä olisi turvallinen tapa lukea tiedostosta N tavua johonkin containeriin? Lisäksi, mikä ylläolevassa on väärin?Code: Select all
#include <Windows.h> #include <fstream> #include <iostream> int FileSize(const char* sFileName) //kotoisin osoitteesta http://www.codeproject.com/KB/files/filesize.aspx { std::ifstream f; f.open(sFileName, std::ios_base::binary | std::ios_base::in); if (!f.good() || f.eof() || !f.is_open()) { return 0; } f.seekg(0, std::ios_base::beg); std::ifstream::pos_type begin_pos = f.tellg(); f.seekg(0, std::ios_base::end); return static_cast<int>(f.tellg() - begin_pos); } bool tulostaTavut(const char* polku) { int size = FileSize(polku); if(size<1) //tyhjä tai olematon tiedosto :) { MessageBox(NULL,L"Tiedostohärö",L"Tiedostohärö",NULL); return false; } std::ifstream f(polku,std::ios::in | std::ios::binary); unsigned char* sisältö = new unsigned char[size]; if(f.is_open()) { f.read((char*)sisältö,size); for(int i=0; i<size; i++) { std::cout<<"Kohdassa "<<i<<" lukee: "<<(int)sisältö[i]<<std::endl; } } delete [] sisältö; f.close(); return true; }
Code: Select all
#include <SDL/SDL.h>
#undef main // ei anneta käyttää SDLmainia
Piti editoida alkuperänen kysymys uudelle sivulle ja lisää vastausta:
Feuer: L"asdfasdf". L heittää merkkijonon widechater merkkijonoksi, joita MessageBoxW syö. MessageBox on makro joka voi olla MessageBoxA (Ascii) tai MessageBoxW (widechatter, unicode..). Tällä ei tosin pitäisi olla mitään merkistystä koodissasi.. Infoa vain.
Mysteerikaatumiset on hyvä selvitellä esimerkiksi Valgrindin avulla mikä debug-käännöksistä löytää virheet yleensä rivilleen sieltä missä ne ovat.Feuer wrote:Ohjelma kaatui aina ikkunan raksia painaessa, mikä johtaa monien resurssien vapauttamiseen ja lopulta sulkeutumiseen. Mielestäni debuggailin niin että sain selville ettei ohjelma kaatunut ennen mainin return 0; - riviä, mutta sen voinee varmistaa tulevaisuudessa...
Koodin ongelmat ovat kuitenkin eläneet koodin myötä, nykytilanne on se että Debug-käännös kaatuu kun sen sulkee SDL-ikkunasta, mutta ei kaadu jos sen sulkee komentorivi-ikkunasta ja Release-käännös on vakaa kuin junan vessa. Mikä on tämän logiikka?
Nuo L:t iskin MessageBoxin tekstiparametreihin koska MessageBox(NULL,"asdf","fdsa",NULL) ei mennyt kääntäjästä läpi, ja sen sijaan että olisin etsinyt dokumentaatiosta oikean tavan käyttää funktiota, muistin mitä anttipanda oli sanonut pari vuotta sitten tässä editissä.
MSVC jostain syystä tykkää käyttää aina Unicode-versioita. Siksi ne L:t pitää olla.Feuer wrote:Nuo L:t iskin MessageBoxin tekstiparametreihin koska MessageBox(NULL,"asdf","fdsa",NULL) ei mennyt kääntäjästä läpi, ja sen sijaan että olisin etsinyt dokumentaatiosta oikean tavan käyttää funktiota, muistin mitä anttipanda oli sanonut pari vuotta sitten tässä editissä.
Code: Select all
void Camera::pushMatrix()
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(fieldOfView*zoom,aspectRatio,nearPoint,farPoint);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
QVector3D direction(0,0,1);
direction = direction * rotateYaw(rotation.yaw) * rotatePitch(rotation.pitch) * rotateRoll(rotation.roll);
QVector3D up(0,1,0);
up = up * rotateYaw(rotation.yaw) * rotatePitch(rotation.pitch) * rotateRoll(rotation.roll);
gluLookAt(position.x,position.y,position.z,direction.x(),direction.y(),direction.z(),up.x(),up.y(),up.z());
}
QMatrix4x4 rotateYaw(qreal a)
{
QMatrix4x4 matrix(qCos(a),-qSin(a),0,0,qSin(a),qCos(a),0,0,0,0,1,0,0,0,0,1);
return matrix;
}
QMatrix4x4 rotatePitch(qreal a)
{
QMatrix4x4 matrix(qCos(a),0,qSin(a),0,qSin(a),1,0,0,-qSin(a),0,qCos(a),0,0,0,0,1);
return matrix;
}
QMatrix4x4 rotateRoll(qreal a)
{
QMatrix4x4 matrix(1,0,0,0,0,qCos(a),-qSin(a),0,0,qSin(a),qCos(a),0,0,0,0,1);
return matrix;
}
Code: Select all
void GLWidget::paintGL()
{
this->setWindowTitle(QString::number(camera->rotation.yaw) + "," + QString::number(camera->rotation.pitch) + "," + QString::number(camera->rotation.roll));
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(0.0,0.0,0.0,0.0);
camera->pushMatrix();
glLoadIdentity();
glPushMatrix();
glBegin(GL_TRIANGLES);
glColor3f(0,1,0);
glVertex3f(0,0,-40);
glVertex3f(1,-1,-40);
glVertex3f(-1,-1,-40);
glEnd();
glPopMatrix();
}