Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Oma kirjoituskenttä

mika132 [07.12.2010 00:48:58]

#

Eli aloitin oman kirjoituskentän toteuttamisen.. tapa on huono, mutta kaikesta oppii.. enkä keksi nyt miksi järjestelmä tekee koko virheen tästä? Eli kysyy lähetetäänkö virhe raportti.

CodeBlocks antaa tälläisen:

process terminated with status -1073741510 (0 minutes, 13 seconds)

ja konsoliin tallentuu windows errori 1D

ja koodi on tälläistä:

namespace ohjelma {
//Otin tästä kaiken ylimääräisen pois.
	namespace fontit {
		static TTF_Font *LataaFontit(const char *nimi, int size);
		static TTF_Font *font;
	}
	namespace tekstien {
		static SDL_Surface *lataateksti(const char *text, bool muuttuja, int muuttujan_arvo, int r, int b, int g, int size, TTF_Font *fontt);
		static SDL_Surface *lataatekstimerkkijonona(const char *text, bool muuttuja, std::string rex, int r, int b, int g, int size, TTF_Font *fontt);

		static SDL_Surface *teksti, *teksti2, *teksti3, *teksti4, *teksti5, *teksti6, *teksti7, *teksti8, *teksti9, *teksti10, *teksti11;
		static SDL_Surface *teksti12, *teksti13, *teksti14, *teksti15, *teksti16, *teksti17, *teksti18;
        static SDL_Surface *teksti19, *teksti20, *teksti21, *teksti22, *teksti23, *teksti24, *teksti25, *teksti26, *teksti27, *teksti28;
        static SDL_Surface *teksti29, *teksti30, *teksti31, *teksti32, *teksti33, *teksti34;
	}

}


void ohjelma::LataaUudestaanTekstit(int Toimistontaso, int Tehtaantaso, int Varastontaso, std::string sana) {
//Tässä ei tarvitse välittää kuin alimmasta
	SDL_FreeSurface(tekstien::teksti31);
	SDL_FreeSurface(tekstien::teksti32);
	SDL_FreeSurface(tekstien::teksti33);
	SDL_FreeSurface(tekstien::teksti34);
    tekstien::teksti31 = tekstien::lataateksti("nothing", true, Toimistontaso, 255, 0, 0, 16, fontit::font);
    tekstien::teksti32 = tekstien::lataateksti("nothing", true, Tehtaantaso, 255, 0, 0, 16, fontit::font);
    tekstien::teksti33 = tekstien::lataateksti("nothing", true, Varastontaso, 255, 0, 0, 16, fontit::font);
    tekstien::teksti34 = tekstien::lataatekstimerkkijonona(" ", true, sana, 255, 0, 0, 16, fontit::font);
}


static SDL_Surface *ohjelma::tekstien::lataateksti(const char *text, bool muuttuja, int muuttujan_arvo, int r, int b, int g, int size, TTF_Font *fontt) {
    SDL_Color textcolor = {r, b, g};
    if (muuttuja) {
        char mjono[10];
        sprintf(mjono, "%i", muuttujan_arvo);
        SDL_Surface *tex = TTF_RenderText_Blended(fontt, mjono, textcolor);
        return tex;
		}
    else {
        SDL_Surface *tex = TTF_RenderText_Blended(fontt, text, textcolor);
        return tex;
    }
}

// Lataa kuvan ja optimoi sen piirtoa varten.
static SDL_Surface *ohjelma::tekstien::lataatekstimerkkijonona(const char *text, bool muuttuja, std::string rex, int r, int b, int g, int size, TTF_Font *fontt) {
    SDL_Color textcolor = {r, b, g};
    if (muuttuja) {
        char mjono[10];
        sprintf(mjono, "%s", rex);
        SDL_Surface *tex = TTF_RenderText_Blended(fontt, mjono, textcolor);
        return tex;
		}
    else {
        SDL_Surface *tex = TTF_RenderText_Blended(fontt, text, textcolor);
        return tex;
    }
}

peli.cpp tiedosto jossa kysytään kirjoitus.hpp tiedostossa olevaa kirjainta näin:

//Tässä kirjoitus.hpp tiedoston tämän hetken koodi:

#ifndef _KIRJOITIN_HPP
#define _KIRJOITIN_HPP

#include <iostream>
#include <cmath>
#include <cstdlib>
#include <string>
#include <ctime>
#include <SDL/SDL.h>

std::string GetDownKey(std::string sana) {
    std::string merkki;
    if (SDLK_a) {
        merkki="a";
    }
    if (SDLK_b) {
        merkki="b";
    }
    sana = sana + merkki;
    return sana;
}

#endif



//ja tässä on peli.cpp tiedostossa oleva:
			if (p.room == 2)
			{
			    ohjelma::LataaUudestaanTekstit(p.FirmanTaso, p.TehtaanTaso, 1, p.sam); //p.sam on se teksti.
                ohjelma::piirra_tekstit(2, p);
                p.sam = GetDownKey(p.sam);
			}

En osaa selittää helpommin ja toivon että joku ymmärtää.

alottelijaa [07.12.2010 14:02:02]

#

varmaan tulee page fault jossain kohtaa tai joku vastaava jos kerran kaatuu koko ohjelma.

Milo [07.12.2010 15:37:48]

#

http://www.cplusplus.com/doc/tutorial/arrays/
https://www.ohjelmointiputka.net/oppaat/opas.php?tunnus=cohj_2#taulukko
https://www.ohjelmointiputka.net/oppaat/opas.php?tunnus=cpp_ohj_04#taulukot

mika132 [07.12.2010 21:37:50]

#

nyt tiedän missä vika, mutta en että miksi

tekstien::teksti34 = tekstien::lataatekstimerkkijonona(" ", true, sana, 255, 0, 0, 16, fontit::font, p.montakokirjainta);

Tuossa kohta josta ladataan ja tässä latausfunktio:

static SDL_Surface *ohjelma::tekstien::lataatekstimerkkijonona(const char *text, bool muuttuja, std::string rex, int r, int b, int g, int size, TTF_Font *fontt, int montakokirjainta) {
    SDL_Color textcolor = {r, b, g};
    if (muuttuja) {
        char mjono[montakokirjainta];
        sprintf(mjono, "%s", text);
        SDL_Surface *tex = TTF_RenderText_Blended(fontt, mjono, textcolor);
        return tex;
		}
    else {
        SDL_Surface *tex = TTF_RenderText_Blended(fontt, text, textcolor);
        return tex;
    }
}

Jos rivi
sprintf(mjono, "%s", text);
on muodossa:

sprintf(mjono, "%s", rex);

eli stringin arvo siihen ohjelma kaatuu.. Miksi? miten sen voisi toteuttaa eritavalla, että saan muuttujan arvon siihen?

Metabolix [07.12.2010 21:53:48]

#

Et voi syöttää sprintf-funktiolle string-oliota vaan ainoastaan C:n merkkijonoja (kuten tuo mjono tai text ovat). Stringistä sellaisen palauttaa jäsenfunktio c_str().

Oikeasti et tarvitse tuossa koko mjonoa, vaan voit antaa TTF-funktiolle suoraan tekstin rex.c_str().

mika132 [07.12.2010 22:22:59]

#

muuten.. KIITOS! Mietin tässä parempaa ratkaisu tyyliä ja taisin hoksata, mutta toteutus hieman pielessä. :D

kirjaimet[] = ("a", "b", "c");
if (nappi[SDLK_kirjaimet[]) {
    merkki=kirjaimet[];
    SDL_Delay(150);
}

tajuan itsekkin ettei mitään logiikkaa, mutta miten tuohon saisi sen logiikan? Vai saako tuolla tavalla mitenkään?

mika132 [08.12.2010 06:23:11]

#

Ylempään ei tarvitse enää vastata toteutin eri tavalla.

mutta tähän haluaisin vastauksen..

Miten kannattaa toteuttaa tieto haku? Jos esimerkiksi tallennan tiedostoon:

2    5    1
100  5    1
540  150  1
120  500  2

tuohon tyyliin osaan tallentaa. Metabolixin koodivinkin ansiosta jonka antoi pari topickkia sitten.
eli tuossa on x ja y akseli sekä maan ID.

Nyt kun ne haetaan tiedostosta niin miten ne voisi hakea niin, että ne saa tallennettua taulukkoon tyyliin ja sieltä ei saa tulla väärää hahmoa vaan juuri oikeat:

int a=0;
for (int i = 0; i <= tiedoston.size(); i++) { //en ole ihan varma tuosta tiedosto.size() funktiosta.
    if (maa == oma_maa) {
        x[a] = //se haetun rivin x arvo
        y[a] = //se haetun rivin y arvo
        a++; //tämä siksi että ei taulukkoon tule turhaan arvoja
    }
}

ja sitten tuolla ne piirretään, mutta sen uskon osaavani jo toteuttaa.. tuota en vain osaa.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta