Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Tiedosto puuttuu

Sivun loppuun

mika132 [28.12.2009 20:01:06]

#

Mistä johtuu, että aina aloittaessani uuden projektin niin tulee tämä:

MSVCR90.dll ei löytynyt. Jos laitan sen pelin kanssa samaan kansiion tulee

MSCVR90.dll ei löytynyt. Lisään senkin niin tulee windows errori 142, joka taas tarkoittaa:
Järjestelmä ei voi suorittaa JOIN- tai SUBST-toimintoja tällä hetkellä.

Mistä se johtuu? Osa projekteistani alkaa toimimaan joskus ilman noita tiedostoja taas toinen puoli pyytää tuota koko ajan ja jos laitan ne niin alkaa windows errorien suur sade, enkä tiedä mistä johtuu, kun olen sen tähän mennessä vahinkossa korjannut, joten nyt kysyn mistä johtuu?

Spongi [28.12.2009 23:19:14]

#

Joskus et luultavasti tarvitse niitä dll-tiedostoja pelin hakemistossa, koska ne löytyy jostain windowsin syövereistä(ympäristömuuttujien takaa). Tuohon toiseen virheilmotukseen en voi arvata kuin että dll-tiedoston versio on väärä.

mika132 [29.12.2009 04:30:46]

#

Ei voi olla versio väärä, kun se toimii silloin tällöin.

Missä noiden tiedostojen pitäisi tarkalleen olla. Siis.

MSVCR90.dll
MSCVR90.dll
MSVCRTD.dll

mika132 [29.12.2009 19:57:26]

#

Noniin laitoin tiedostot.
MSVCR90.dll
MSVCRTD.dll

Windows/system kansioon mihin ne selvästikkin kuuluu ja:

Errori on tälläinen pelin käynnistäessä:
Unhandled exception at 0x7c91b21a in openjasdl.exe: 0xC0000005: Access violation writing location 0x00000010.

Claw [29.12.2009 20:47:14]

#

Käsittääkseni tuo virheilmoitus liittyy muistinhallintaan sillä tavalla että ohjelma yrittää kirjoittaa muistialueelle jota se ei ole varannut itselleen, vika siis lienee koodissa.

mika132 [29.12.2009 21:04:32]

#

#include "stdafx.h"
#include <iostream>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include "windows.h"
#include <cmath>
#include <io.h>
#include <SDL.h>
#include <SDL_rotozoom.h>
#include "SDL_ttf.h"
#pragma comment(lib, "SDL_ttf.lib")
#pragma comment(lib, "SDLmain.lib")
#pragma comment(lib, "SDL.lib")
#pragma comment(lib, "SDL_gfx.lib")


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

    if( SDL_Init(SDL_INIT_VIDEO) < 0 )
    {
        fprintf(stderr, "SDL:n alustus ei onnistunut: %s\n", SDL_GetError()); // virheestä tiedot tiedostoon
        return 0;
    }
	SDL_Surface *naytto;
    naytto = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE|SDL_FULLSCREEN|SDL_DOUBLEBUF);

    SDL_Quit();
    return 0;
}

Legu [29.12.2009 22:09:50]

#

Kokeile asentaa vcredist_x86.exe.
Tuo on "virallinen" tapa asentaa nuo puuttuvat palikat. Pelkkä DLL:ien kopiointi ei välttämättä riitä.

Claw [29.12.2009 22:54:38]

#

Koodi lienee kunnossa, ainakin linuxilla rullaa kunhan poistaa pragmat ja korjaa/poistaa ylimääräiset include-rivit. Vika siis kaiketi juuri noissa tiedostoissa.

mika132 [29.12.2009 23:32:34]

#

Ei auttanut mikään noistakaan. Eli kerron tarkalleen mitä teen. (Projektinani on Console Application)

1. Käynnistän debuggerin.

2. Se lataa ongelmitta.

3. Tulee errori ikkuna KUVA

4. Painan OK

5. Tulee taas error ikkuna. "Sovelluksen alustus epäonnistui (0xc0000142). Lopeta sovellus valistemalla OK

6. Painan OK.

7. Tulee Visual C++ errori ikkuna. "Unhandled exception at 0x7c9666c6 in openjasdl.exe: 0xC0000142: DLL Initialization Failed."

8. Painan Continue.

9. Kuva menee mustaksi kuin peli yrittäisi käynnistyä, mutta palaakin takaisin Visual C++ errorin kanssa. "Unhandled exception at 0x7c91b21a in openjasdl.exe: 0xC0000005: Access violation writing location 0x00000010."

10. Nyt saan painaa Continue vaikka millä mitalla, mutta silti tuo ei tuosta katoa, vaan sama errori tulee. Joten painan Break ja tulee "There is no source code available for the current location."

11. huomasin myös, että consoli jäi auki. Eli peli ei sammunut kokonaan vain se ns. graaffinen fullscreen mode ei käynnisty. (Eikä auta vaikka ottaisin Fullscreenin pois).

Claw [30.12.2009 01:36:22]

#

Kokeile ilman mitään ylimääräisiä C-spesifisiä kirjastoja. Vaikka tällä koodilla:

#include <iostream>
#include <SDL.h>


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

    if( SDL_Init(SDL_INIT_VIDEO) < 0 )
    {
        std::cout << "SDL:n alustus ei onnistunut: " << SDL_GetError() << std::endl;
        return 0;
    }
    SDL_Surface *naytto;
    naytto = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE|);

    SDL_Quit();
    return 0;
}

Jossain kuitenkin vikaa silti, kun kerran virhettäkin pukkaa.

Oletko kokeillut jotain toista IDEä? Esim. Code::Blocks saattaisi olla kokeilemisen arvoinen.

mika132 [30.12.2009 02:13:39]

#

Sama Show tulee silti. Eli tuo ylempi viestini.

Claw [30.12.2009 03:16:26]

#

Mites sitten ihan perus helloworld ohjelma? Tähän tyyliin:

#include <iostream>

int main() {
    std::cout << "Hello world!" << std::endl;
    return 0;
}

Teet siis uuden projektin, console application, ja sitten isket tuon koodin sinne ja ajat sen.

Itse en noista Microsoftin työkaluista tai ympäristöstä ymmärrä niin paha muuta ehdottaa kun IDE:n vaihtoa.

mika132 [30.12.2009 16:24:06]

#

Voisitko kertoa hieman tuosta Code Blocista? Miten SDL ja muut asennetaan siihen? Miten nämä lib:it haetaan siihen kun visual C++:
#pragma comment(lib, "joku.lib")

Ja miten muuten CodeBlock eroaa Visual C++ työkaluissaan yms?

Claw [30.12.2009 16:53:18]

#

Code::Blocks on varsin simppeli IDE(Ainakin verrattuna VC++:n), huomattavasti vähemmän toiminnallisuutta kuin Microsoftin tekeleissä. Kuitenkaan et tuota "ylimääräistä" toiminnallisuutta varmasti vielä tässä vaiheessa niin tarvitse ettetkö voisi hyvinkin käyttää tuota Code::Blocksia.

Code::Blocks täältä: http://www.codeblocks.org/
SDL-ohjeet täältä: http://www.lazyfoo.net/SDL_tutorials/index.php

Kyllä se siitä lähtee. ;)

mika132 [30.12.2009 17:16:13]

#

Juuri tätä tarkoitan. Miksi kääntäjien pitää olla niin erillaisia, mutta asiaan:

#include "SDL/SDL.h"
int main( int argc, char* args[] )
{
    SDL_Init( SDL_INIT_EVERYTHING );

    SDL_Delay(5000); //Pistin siks et se ei sammu heti.
    SDL_Quit();

    return 0;
}

Kuitenkin debugger ei käynnisty vaan ilmoittaa error ikkunan jossa valitetaan, että debuggerin asetuksia ei ole määritelty. Mitä asetuksia?

Ja sitten koitin build and run niin tulee vain:

"RacePhysics - Debug" uses an invalid compiler. Skipping...
Nothing to be done.

Claw [30.12.2009 18:26:56]

#

Kai latasit sen paketin jossa tulee MinGW mukana? Eli sen isomman(19 Mt vrt. 10 Mt) paketin?

Jos näin on, niin googlettamalla tuota "uses an invalid compiler. Skipping..."-tekstiä löytyy tällainen aihe josta voi olla apua: http://forums.codeblocks.org/index.php?topic­=6902.0

Mikäli latasit tuon pienemän paketin(jossa ei siis tule kääntäjää ja debuggeria mukana) niin lataa se isompi paketti ja kokeile sillä.

Kyllä se kohta toimii.

mika132 [30.12.2009 19:24:05]

#

hmm.. En ymmärtänyt tuota täysin eli mitä pitää laittaa tuonne executableen? Tuon pelin osoite vain kansio missä pelit ovat?

Claw [30.12.2009 21:31:28]

#

Toolchain executables tarkoittaa kansiota josta löytyy kääntäjä, linkkeri, debuggeri jne. Eli siis sinne tarjotaan se MinGW kansio joka löytyy varmaan sieltä Code::Blocksin kansion syövereistä jostain.

Metabolix [30.12.2009 21:35:08]

#

Kannattaisi suoraan vain asentaa se oikea paketti, joka laittaa asetuksensa automaattisesti kuntoon.

mika132 [31.12.2009 04:10:34]

#

Ja tämän löytää mistä, koska latasin Code Blocin omilta kotisivuilta tuon.

vehkis91 [31.12.2009 11:07:46]

#

Lataat sieltä sivuilta sen isomman paketin, niin pitäis toimia.

Metabolix [31.12.2009 12:13:17]

#

Osaatko lukea?

http://www.codeblocks.org/downloads/5:

Windows 2000 / XP / Vista:

FileDateSizeDownload from
codeblocks-8.02-setup.exe28 Feb 200810.8 MBSourceforge or BerliOS
codeblocks-8.02mingw-setup.exe28 Feb 200819.3 MBSourceforge or BerliOS

NOTE: The codeblocks-8.02mingw-setup.exe file includes the GCC compiler and GDB debugger from MinGW.

NOTE: The compiler included in codeblocks-8.02mingw-setup.exe does not work reliable on Windows Vista. Please do not use it and install a more recent one from MinGW. That is because at the time Code::Blocks was released there was no working GCC for Windows Vista available. Meanwhile there is.

mika132 [31.12.2009 17:25:42]

#

yes but my english not good.

Eli latasin silloin itse:
codeblocks-8.02mingw-setup.exe
tuon. Eikö se ole oikea?

Metabolix [31.12.2009 21:12:41]

#

Luitko vielä loppuun? Jos käytät Windows Vistaa, joudut asentamaan itse kääntäjästä uudemman version; linkki löytyy C++-oppaan liitteestä.

mika132 [02.01.2010 14:46:12]

#

Käytän ihan Windows XP:tä.

mika132 [08.01.2010 19:22:44]

#

En ole vieläkään onnistunut asentamaan tuota. Mistä näen, että onko kaikki asetukset kohdillaan? :O

alottelijaa [08.01.2010 20:55:52]

#

poista se code::blocks jonka asensit ennen tota oikeeta. ja vistalla ainakin mulla tuli linkkerin virhe joskus.

mika132 [09.01.2010 02:06:41]

#

Poistin kaiken mikä viittasi Code::Blocks ohjelmaan ja asensin uudestaan. Ei toiminut, mutta saan errorin yrittäessäni suorittaa debuggausta.

Errori kuva

En nyt täysin ymmärrä mikä muka täytyy muuttaa? :O

Claw [09.01.2010 10:04:21]

#

Niin, siis valitset sen debugger-ohjelman sinne. En tiedä mikä se on MinGW-ympäristössä, mutta GCC:n debuggeri on gdb, joka voi myös olla sama MinGW:llä.

Miksi muuten yrität debuggausta edes? Se koodihan yleensä käännetään(compile) ensin. :)

mika132 [09.01.2010 10:33:55]

#

Jos painan compile file niin ei tapahdu mitään ja sen jälkeen koitan painaa RUN niin ei tapahdu mitään. Pitääkö siis gdb ladata itse koneelle? sen jälkeen kun debuggaa niin käynnistyy lähdekoodin suorituskin? :O

Claw [09.01.2010 10:41:42]

#

En nyt muista miten code::blocksissa tuo homma toimii, mutta miten olis "Build & run"-namiska?

Kun menet tuonne Settings/compiler and debugger -> programs, niin mitä on siinä "compiler"-kohdassa?

mika132 [09.01.2010 11:00:06]

#

öö...öö... Taidan laittaa kuvan selventämään olenko edes oikeassa paikassa:

KUVA

alottelijaa [09.01.2010 11:16:21]

#

siellä code blocksin pääikkunassa jossa on se ite koodi etti ylhäältä semmonen paikka missä lukee debug ja vaihda se releaseen. ainakin toi eka virhe näytti siltä ettei debuggeria (gdb) oo asennettu.

Claw [09.01.2010 12:01:24]

#

Mitä jos teet näin:

1: File -> New -> Project...
2: Listasta "SDL Project"
3: Project title jne kenttiin jotain randomia
4: Compiler kohdassa valitset "GNU GCC Compiler", ja valitset vain "Create release configuration".
5: Eteen hyppää tyhjä projekti, Build-valikosta valitset "Build and Run", tai vaihtoehtoisesti painat F9-nappia.

Tämä vaatinee sen että sinulla on Code::Blocks, MinGW ja SDL:n kehitystiedostot asennettuna. Jos ei toimi, vika mitä ilmeisimmin jossain noista. Tällä hetkellä näyttää siltä että Code::Blocks ei tunnista MinGW:n työkaluja jostain syystä.

mika132 [09.01.2010 13:00:48]

#

No nyt on gdb asennettu. En vain ole täysin varma missä dpg.exe sijaitsee ja miten linkkaan sen kääntäjälle?

Claw [09.01.2010 13:15:08]

#

Settings -> Compiler and debugger -> Global compiler settings -valikosta pääset säätämään kääntäjien, linkkerin ja debuggerin polkuja.

C kääntäjä on gcc, C++ kääntäjä on g++, jne.

Tosin että niiden pitäisi olla jo valmiiksi asetettuina.

mika132 [09.01.2010 13:28:51]

#

No siinä syy miksi tuolla on jo jokin .exe valmiina, mutta miksi sitten ei debuggaa eikä anna testata koodia?

Claw [09.01.2010 13:44:01]

#

Toimiiko noilla minun aiemin antamilla ohjeilla?

mika132 [09.01.2010 14:15:06]

#

Se kysyy SDL polkua eikä hyväksy tuota jonka annan sille. (Miksei kääntäjän asennus voisi vain olla yhtä helppoa kuin Visual C++. (ei ole kysymys vaan oma pohdinta tähän väliin))

Claw [09.01.2010 14:23:57]

#

Kai olet seurannut näitä ohjeita?

http://www.lazyfoo.net/SDL_tutorials/lesson01/windows/codeblocks/index.php

Sinulta luultavasti puuttuu SDL:n kehitystiedostot, kaikki tarvittava on selitetty tuossa kyllä, minimaalisella englannintaidolla pärjää kun kuvista saa varmaan tarpeeksi selkoa.

Metabolix [09.01.2010 14:29:41]

#

Miten olet taas saanut homman sotkettua noin? Minulla Code::Blocks on aina toiminut suoraan ensimmäisellä asennuksella ilman minkäänlaisia lisäsäätöjä. Ehkä sinun kannattaa käyttää jotain helpompaa kieltä ja ympäristöä.

mika132 [09.01.2010 15:33:26]

#

Ei vaan yksinkertaisesti tuo ei nyt ymmärrä minua enkä minä sitä. Seurasin tismalleen noita ohjeita joka sanasta joka kuvaan, mutta ei niin ei. En oikaissut missään kohdassa, enkä tehnyt mitään muutakaan.

Metabolix [09.01.2010 19:25:17]

#

Auttaisiko video-ohje Code::Blocksin asennuksesta?

mika132 [12.01.2010 20:14:13]

#

Video auttoi sen verran, että sain toimimaan tuon lähes. Se nyt ei vain avaa mitään SDL funktiota. Johtuuko kenties siitä, että en tiedä onko SDL:än .lib tiedostot tuossa mukana? Miten ne otetaan käyttöön, kun pragma comment oli visual C++ niin mikä on Code::Blocissa?

Macro [12.01.2010 20:46:23]

#

http://www.dreamincode.net/forums/showtopic57275.htm

mika132 [12.01.2010 21:56:59]

#

en saa nyt millään noita linkkereitä asennettua vaan ilmoittaa:

Linking console executable: bin\Debug\TGRPEngine.exe
D:\SDL-1.2.14\lib\libSDL.la: file not recognized: File format not recognized
collect2: ld returned 1 exit status
Process terminated with status 1 (0 minutes, 0 seconds)
0 errors, 0 warnings


En tajua miksi ohjeessa on libSDL.a ja minulla taas koneessa .la? :o

mika132 [16.01.2010 19:29:54]

#

Nyt oikeasti. En teen mitä vain se tekee saman. Jos muutan tuon tiedoston:
libSDL.la --> libSDL.a

tulee sama errori:
Linking console executable: bin\Debug\TGRPEngine.exe
D:\SDL-1.2.14\lib\libSDL.a: file not recognized: File format not recognized
collect2: ld returned 1 exit status
Process terminated with status 1 (0 minutes, 0 seconds)
0 errors, 0 warnings

Mistä se johtuu?

Andu [16.01.2010 19:57:14]

#

Ainakaan alimmassa ohjeessa ei mainita kertaakaan tiedostoa libSDL.a. Riittää, että linkkaat tiedostot libmingw32.a, libSDLmain.a ja libSDL.dll.a, kuten ohjeessakin.

mika132 [16.01.2010 20:37:19]

#

No tästähän se hauskuus alkoikin sitten! :)

Missä ihmeen herculeksessa nyt mättää? :O


/Users/hercules/trunk/SDL-1.2/./src/main/win32/SDL_win32_main.c:227: undefined reference to `_SDL_strlcpy'
/Users/hercules/trunk/SDL-1.2/./src/main/win32/SDL_win32_main.c:243: undefined reference to `_SDL_SetModuleHandle'
D:\Code Block\CodeBlocks\MinGW\lib\libSDLmain.a­(SDL_win32_main.o): In function `WinMain':
/Users/hercules/trunk/SDL-1.2/./src/main/win32/SDL_win32_main.c:303: undefined reference to `_SDL_strlcpy'
/Users/hercules/trunk/SDL-1.2/./src/main/win32/SDL_win32_main.c:304: undefined reference to `_SDL_strlcat'
/Users/hercules/trunk/SDL-1.2/./src/main/win32/SDL_win32_main.c:327: undefined reference to `_SDL_strlcpy'
/Users/hercules/trunk/SDL-1.2/./src/main/win32/SDL_win32_main.c:328: undefined reference to `_SDL_strlcat'
/Users/hercules/trunk/SDL-1.2/./src/main/win32/SDL_win32_main.c:370: undefined reference to `_SDL_strlcpy'

Metabolix [16.01.2010 21:03:35]

#

Lataa vaikka tästä libSDL.a ja libSDLmain.a. Varmista myös, että linkityksessä kirjastot ovat oikeassa järjestyksessä (mingw32, SDLmain, SDL).

mika132 [16.01.2010 22:25:28]

#

Tuo oli ongelma. En tiennyt, että järjestykselläkin oli jokin väli, mutta kiitos paljon! :)


E: Nyt tulikin ongelmainen. Näiden "ylimäärä" tiedostojen kanssa.

Eikös seuraava tarkoita, että ei voida luoda linkkeriä:
Compiling: data\start.ss
mingw32-g++.exe: C:\Documents and Settings\Mika.KOTI-8FEC3C6EF1\Työpöytä\tyopoydan_kansiot\CPelit\World Leaders 2\data\start.ss: linker input file unused because linking not done


No minulla on koodirivissä:

#include "data/start.ss"


Eli pitäisi olla tehty. Vai tehdäänkö nuo omien tiedostojen lisät johonkin toiseen paikkaan?

Teuro [16.01.2010 22:38:01]

#

Rivi pitäisi olla muodossa

#include "data\\start.ss"

Metabolix [16.01.2010 22:40:53]

#

Opettelepa sitten käyttämään niitä tiedostoja oikein, kuten on kai pari kymmentä kertaa kehotettu. Nimeä tiedostosi tavallisilla päätteillä (cpp ja h), jotta kehitysympäristö osaa käsitellä ne oikein, ja unohda nuo itse keksimäsi omituiset include-kikkailut ja katso mallia niistä kahdesta Koodin jakaminen -koodivinkistä.

mika132 [17.01.2010 01:28:31]

#

\tyopoydan_kansiot\CPelit\World Leaders 2\data\start.c|3|error: syntax error before '*' token|

Ja koodina on:

SDL_Surface *naytto;
SDL_Surface *aloituskuva; //rivi 3!
SDL_Surface *aloituskuva2; /Sama errori tässä


bool pois=false;

Mitä tuo tarkoittaa?

Metabolix [17.01.2010 01:50:39]

#

Oletko ehkä jättänyt SDL.h:n liittämättä?

mika132 [17.01.2010 02:20:05]

#

Kyllä se siellä on.

#include <iostream>
#include <SDL/SDL.h>
#include "data\start.c"
#include "data\functions.h"

Milo [17.01.2010 10:37:22]

#

Includeista sen verran, että poluissa olisi syytä käyttää vain forward slashejä ( / ), eikä suinkaan backslasheja, vaikka Windows niistä tykkääkin. '\'-merkillä on parempaakin tekemistä kuin toimia poluissa kansioerottimina.

Jos tuo on kerta rivi 3, niin sitten siellä ei mitenkään voi olla oikeita includeja ennen noita kyseisiä koodeja. Ymmärrät kai, että tiedoston jäsentely menee seuraavanlaisesti:

lainaus:

Includet

globaalit muuttujat

funktioprotot

funktiot

eli jos ensimmäisellä rivillä on esim "int sdl_main(int argc, char **argv) {" niin ei voi tosiaankaan includet olla kohillaan. Includet eivät ole globaaleja. Eli jos tiedostossa jotain.c includetaan ensin SDL ja sitten tuo "start.c", niin start.c:n täytyy itse huolehtia omista includeistaan, eli se _myös_ tarvitsee SDL:n includeihinsa.

Kuten Metabolix on jo monta kertaa sanonut, unohda ne include kikkailut ja tee niin kuin koodivinkki neuvoo.

mika132 [17.01.2010 12:59:48]

#

Koodista tulee uskomattoman pitkää jos laitan kaiken samaan tiedostoon? Eikös katoss nyt.

#include <iostream>
#include <SDL/SDL.h>
#include "data\functions.h"
using namespace std;
SDL_Surface *naytto;
SDL_Surface *aloituskuva;
SDL_Surface *aloituskuva2;
bool pois=false;

void LadataanPeli(void) {
aloituskuva=SDL_LoadBMP("data/grafiikat/world_leaders_logo.bmp");
aloituskuva2=SDL_LoadBMP("data/grafiikat/world_leaders_logo_2.bmp");
}

void PiirraKuva(SDL_Surface *kuva, SDL_Surface *naytto, int x, int y)
{
  SDL_Rect alue;
  alue.x = x;
  alue.y = y;
  SDL_BlitSurface(kuva, NULL, naytto, &alue); // piirto
}

void LopetusPainikkeet(SDL_Event tapahtuma){
SDL_PollEvent(&tapahtuma);
            if ( tapahtuma.type == SDL_QUIT )  {  pois = true;  }
            if ( tapahtuma.type == SDL_KEYDOWN )  {
                    if ( tapahtuma.key.keysym.sym == SDLK_ESCAPE ) { pois = true; }
            }
}


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

    if( SDL_Init(SDL_INIT_VIDEO) < 0 )
    {
        fprintf(stderr, "SDL:n alustus ei onnistunut: %s\n", SDL_GetError());
        return 0;
    }
	Uint8* nappi;
	SDL_Event tapahtuma;
	SDL_PollEvent(&tapahtuma);
    naytto = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE|SDL_FULLSCREEN|SDL_DOUBLEBUF);

    LadataanPeli();
    while (pois==false)
	{
        PiirraKuva(aloituskuva, naytto, 350, 250);
        SDL_Flip(naytto);
        LopetusPainikkeet(tapahtuma);
	}
	while (pois==false)
	{

	}

    SDL_FreeSurface(aloituskuva);
    SDL_Quit();
    return 0;
}

Mielestäni yksinkertaisempaa:

#include <iostream>
#include <SDL/SDL.h>
#include "data\start.c" //alustukset
#include "data\functions.h" //funktiot

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

    if( SDL_Init(SDL_INIT_VIDEO) < 0 )
    {
        fprintf(stderr, "SDL:n alustus ei onnistunut: %s\n", SDL_GetError());
        return 0;
    }
	Uint8* nappi;
	SDL_Event tapahtuma;
	SDL_PollEvent(&tapahtuma);
    naytto = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE|SDL_FULLSCREEN|SDL_DOUBLEBUF);

    LadataanPeli();
    while (pois==false)
	{
        PiirraKuva(aloituskuva, naytto, 350, 250);
        SDL_Flip(naytto);
        LopetusPainikkeet(tapahtuma);
	}
	while (pois==false)
	{

	}

    SDL_FreeSurface(aloituskuva);
    SDL_Quit();
    return 0;
}

Mutta sitten ongelmaan. Vaikka laitan kaiken samaan tiedostoon se ei silti piirrä mitään, vaikka piirtofunktio käsky on laitettu?

Näyttää vain pelkän mustan näytön. Kyseessä on console application projekti. Eli olen kaiken tehnyt Code::Blocissa samalla tavalla kuin VisualC++ mutta mikään konsti ei ole toiminut. Ei includet eikä nyt piirtäminenkään, joten tehdäänkä sekin eri tavalla?

Teuro [17.01.2010 13:16:57]

#

Tai sitten voit kokeilla tällaista versiota.

#include "funktiot.hpp"
#include <iostream>

int main(int argc, char **argv){
	SDL_alusta(800, 600, 32, SDL_DOUBLEBUF);

	bool jatkuu = true;

	try{
		lataa();
	}catch(std::exception &e){
		std::cout << e.what() << std::endl;
	}

	while(jatkuu){
		jatkuu = kasittele_viestit();

		piirra();
	}

	tallenna();

	return EXIT_SUCCESS;
}

funktiot.hpp tiedosto sisältää funktioiden esittelyt.

#ifndef _FUNKTIOT_HPP
#define _FUNKTIOT_HPP

#include <string>
#include <vector>
#include <cmath>
#include <sstream>
#include <fstream>
#include <exception>
#include "kuvavarasto.hpp"
#include <SDL/SDL.h>
#include <SDL_ttf.h>
#include <ctime>

void SDL_alusta(int leveys, int korkeus, int syvyys, Uint32 Liput);
bool kasittele_viestit();
void piirra();
float kulunut_aika();
SDL_Rect uusi_paikka(int x, int y);
void tallenna();
void lataa();
std::vector <std::string> file(std::string nimi);
std::vector<std::string> explode(std::string erotin, std::string rivi);

#endif

mika132 [17.01.2010 13:39:50]

#

käynnistyy kyllä, mutta ei piirrä mitään. Enkä nyt kopioinut koodistasi kuin muutaman kohdan, koska eikös koodini aja suurin piirtein saman asian tällä hetkellä? Mutta missä vika kun se ei piirrä?

main.cpp:

#include "data\functions.hpp"
#include <iostream>

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

    if( SDL_Init(SDL_INIT_VIDEO) < 0 )
    {
        fprintf(stderr, "SDL:n alustus ei onnistunut: %s\n", SDL_GetError());
        return 0;
    }
	Uint8* nappi;
	SDL_Event tapahtuma;
	SDL_PollEvent(&tapahtuma);
    naytto = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE|SDL_FULLSCREEN|SDL_DOUBLEBUF);

    LadataanPeli();
    while (pois==false)
	{
        PiirraKuva(aloituskuva, naytto, 350, 250);
        SDL_Flip(naytto);
        LopetusPainikkeet(tapahtuma);
	}
	while (pois==false)
	{

	}

    SDL_FreeSurface(aloituskuva);
    SDL_FreeSurface(aloituskuva2);
    SDL_Quit();
    return 0;
}

functions.hpp:

#ifndef _FUNCTIONS_HPP
#define _FUNCTIONS_HPP
#include <SDL/SDL.h>
using namespace std;
SDL_Surface *naytto;
SDL_Surface *aloituskuva;
SDL_Surface *aloituskuva2;
bool pois=false;


void LadataanPeli(void) {
aloituskuva=SDL_LoadBMP("data/grafiikat/world_leaders_logo.bmp");
aloituskuva2=SDL_LoadBMP("data/grafiikat/world_leaders_logo_2.bmp");
}

void PiirraKuva(SDL_Surface *kuva, SDL_Surface *naytto, int x, int y)
{
  SDL_Rect alue; // mille alueellä näyttöä kuva piirretään
  alue.x = x; // koordinaatit
  alue.y = y;
  SDL_BlitSurface(kuva, NULL, naytto, &alue); // piirto
}

void LopetusPainikkeet(SDL_Event tapahtuma){
SDL_PollEvent(&tapahtuma);
            if ( tapahtuma.type == SDL_QUIT )  {  pois = true;  }  //poistumistapahtuma
            if ( tapahtuma.type == SDL_KEYDOWN )  {
                    if ( tapahtuma.key.keysym.sym == SDLK_ESCAPE ) { pois = true; }   // näinkin voi lukea näppäimiä
            }
}

#endif

vehkis91 [17.01.2010 13:47:02]

#

MIks sulla on 2 while-silmukkaa tuolla? Ei tosin liity piirtämiseen mitenkään...

Metabolix [17.01.2010 13:49:10]

#

Kuka oikeasti jaksaa sinua neuvoa, kun taaskaan et ole noudattanut annettuja neuvoja? Muutamia mainitakseni: kenoviivat tiedostonimissä, koodin jako tiedostoihin vinkkien 1770 ja 1901 mukaisesti... Ottaisit vaikka matopelioppaasta mallia.

mika132 [17.01.2010 14:08:48]

#

En tiedä missä vika oli, mutta tein jotain kyllästyessäni ja kuva ilmestyi, mutta kiitos kaikille. =)

E: Voiko muuten .avi tiedostoja avata ja näyttää jollakin tavalla?

Teuro [17.01.2010 15:09:21]

#

Voit ladata tästä esimerkin, jota olen hetken aikaa rakennellut. Tuossa ladataan joitakin kuvia ja tehdään hiukan laskentaa ja lisänä on vielä tallennus- ja latausfunktiot. Tuo ei välttämättä täytä kaikkia hienoja koodaustapoja.

mika132 [17.01.2010 17:08:26]

#

En löytänyt mistään, että miten voi luoda uusia olioita. Siis osaan luoda olion, mutta esimerkiksi jos painaa M kirjainta niin tulee uusi olio. Miten se toteutetaan? Eli käytännössä kloonataan uusi olio jolla on omat ominaisuutensa.


E: olioon liittyvät koodit:

class Panssarivaunut
{
public:
int nopeus;
void Piirretaan(int piste_x, int piste_y);
void Ohjaus();
};

void Panssarivaunut::Piirretaan(int piste_x, int piste_y){

    PiirraKuva(panssarivaunu, naytto, piste_x, piste_y);
	SDL_Flip(naytto);
}

void Panssarivaunut::Ohjaus(){

    sijainti_x+=1;
}
Panssarivaunut SuomenPanssarivaunu;
PiirraKuva(kentta_1, naytto, 0, 0);
SuomenPanssarivaunu.Ohjaus();
SuomenPanssarivaunu.Piirretaan(sijainti_x, sijainti_y);
SDL_Flip(naytto);

Metabolix [17.01.2010 17:09:45]

#

Katso matopelioppaasta mallia, siellä luodaan madolle uusia jaokkeita aina omenan kohdalla.

mika132 [17.01.2010 17:26:46]

#

Teen varmaan jotain väärin, koska tämä ei toimi. Tai ei ainakaan tule lisää panssarivaunuja:

struct Panssarivaunut
{
public:
    int nopeus;
	void Piirretaan(int piste_x, int piste_y);
	void Ohjaus();
    struct SuomenPanssarivaunu {
        float sijainti_x2, sijainti_y2;
    };
};

void Panssarivaunut::Piirretaan(int piste_x, int piste_y){

    PiirraKuva(panssarivaunu, naytto, piste_x, piste_y);
	SDL_Flip(naytto);
}

void Panssarivaunut::Ohjaus(){

    sijainti_x+=1;
}
if (huone==3)
{
	Panssarivaunut SuomenPanssarivaunu;
	PiirraKuva(kentta_1, naytto, 0, 0);
	SuomenPanssarivaunu.Ohjaus();
	SuomenPanssarivaunu.Piirretaan(sijainti_x, sijainti_y);
        nappi = SDL_GetKeyState(NULL);
	if (nappi[SDLK_m])
	{
		new Panssarivaunut::SuomenPanssarivaunu;
	}
	SDL_Flip(naytto);
}

Eli vaikka painan kuinka paljon M kirjainta niin ei tapahdu mitään.

Teuro [17.01.2010 17:33:31]

#

Pitäisikö sinulla olla luokkana Panssarivanu, josta noita vaunuja luodaan? Suomen panssarivaunut eivät tarvitse omaa luokkaa.

mika132 kirjoitti:

if (nappi[SDLK_m])
    {
        new Panssarivaunut::SuomenPanssarivaunu;
    }

Mitä ihmettä tuon rivin olisi tarkoitus tehdä?

Metabolix [17.01.2010 17:33:32]

#

... ja luitko sitä opasta? Ei siinä todellakaan noin tehty. Sitä paitsi eihän tuo koodi voi mitenkään edes kääntyä, joten miten voit muka testata sitä? Edit: Jaa, onhan siellä se SuomenPanssarivaunu-struct myös. Mutta miksi ihmeessä on myös muuttuja samalla nimellä? Toivottavasti ymmärrät, ettei noilla kahdella ole mitään yhteyttä toisiinsa.

mika132 [17.01.2010 17:49:54]

#

Miksei se muka voi kääntyä?

Ja sen rivin tarkoitus on katsoa, että jos painetaan nappia M niin luodaan uusi panssarivaunu, mutta se ei luo mitään. Vain sen yhden mikä tehdään tuossa if (huone==3) alapuolella.

Teuro [17.01.2010 17:59:01]

#

Kuten jo sanottua ymmärrätkö ollenkaan mitä olet koodaamassa, vai laitatko eri juttuja ja toivot, että se toimisi? Tuon if-lauseen jälkeen luodaan aina 'SuomenPanssarivaunu' niminen olio. Sen sijaan tuon toisen if-lauseen jälkeen tehdään jotain ihan kummallista. Ymmärrtäkö siis mitä siinä tapahtuu? Jos haluat uuden panssivaunun pitäisi se luoda jossakin, jota varten josakin olisi hyvä olla '=' merkki.

mika132 [17.01.2010 18:01:52]

#

No enää en ymmärrä. Miten voin luoda panssarivaunun käyttäen = merkkiä?

Teuro [17.01.2010 18:05:04]

#

No vaikka seuraavilla tavoilla tuo onnistuu. Kaikki tavat eivät vaadi '=' merkkiä.

Panssivaunut[seuraava_vapaa_indeksi] = new Panssarivaunu;
Panssarivaunu *pv = new Panssarivaunu;
Panssarivaunu pv;
Panssarivaunut.push_back(Panssarivaunu());

Metabolix [17.01.2010 18:05:32]

#

Kysynpä vielä kerran: katsoitko matopelioppaasta, miten jaokkeita luodaan, minne ne tallennetaan ja miten kaikki luodut jaokkeet käydään läpi?

alottelijaa [18.01.2010 12:29:46]

#

vähän offtopiccia mutta mitä tarkoitat jaokkeella?

tgunner [18.01.2010 12:53:12]

#

alottelijaa kirjoitti:

vähän offtopiccia mutta mitä tarkoitat jaokkeella?

Matopelioppaassa puhutaan jaokkeista eli palluroista, jotka muodostavat madon. Ei varsinainen ohjelmointitermi. :>

Metabolix [18.01.2010 12:59:24]

#

Monet eläimet muodostuvat jaokkeista. Valitettavasti suomenkielisen Wikipedian resurssit aiheesta ovat aika heikot, mutta ehkä tämä artikkeli auttaa.

tgunner kirjoitti:

Ei varsinainen ohjelmointitermi.

Minusta on aivan perusteltua käyttää matopelissä oikeita biologian termejä, puhutaanhan sotapeleissäkin aseista ja ajoneuvoista oikeilla termeillä.


Sivun alkuun

Vastaus

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

Tietoa sivustosta