Morjensta.
Olen tässä pienen tauon jälkeen innostunut tekemään pienen harjoitusohjelman koodikielenä C++ ja grafiikat hoituu SDL apuna käyttäen.
Käyttöjärjestelmä on Windows 7 ja kehitysympäristö on Code::Blocks.
Ongelmana on se, että aikani ohjelman kanssa räpellettyäni huomasin tietokoneeseen iskeneen seuraavanlaisen vian: Näytönohjaimen tuulettimet alkavat huutamaan 100% teholla ja näyttö menee mustaksi (kuin nykäisisi näyttikseltä tulevan johdon irti). Itsessään Windows ei kuitenkaan kaadu, vaan esimerkiksi musiikki kuuluu mainiosti taustalla.
Osasin aika pian paikantaa vian tuohon omaan ohjelmaani, sillä joka kerta noin 30s ohjelman käynnistyksen jälkeen tämä mystinen vika iski. Nyt kuitenkin tilanne on se, että noin 2min koneen käynnistyksen jälkeen tämä tapahtuu poikkeuksetta :S
Vaihtamalla piuhan paikan prosessorin integroituun näyttikseen vikaa ei ole. Kuitenkaan en ole enää uskaltanut ajaa tuota ohjelmaa pelkona, että prosessorikin kyrvähtää :( Näyttiskin itsessään jo maksaa sen 300€.
Nyt siis kaipaisin hyviä neuvoja niiltä, joilta löytyy oikeaa tietoa asian tiimoilta, että säästyisin suuremmilta taloudellisilta menetyksiltä. Ja jos nyt näyttis vaan sattui hajoamaan HARVINAISEN huonoon aikaan, niin saattaapi minun ohjelmointiura loppua ennen kuin edes alkoikaan.
Lykkään tähän tämän koodin kokonaisuudessaan, mutta JOKAINEN AJAKOON OHJELMAN OMALLA VASTUULLAAN!
#include <stdio.h> #include <SDL.h> #include <SDL_ttf.h> #include <windows.h> #include <sstream> #include <iostream> int tulos, valitulosA, valitulosB, lopputulos; int pelitulos(int tulosA, int tulosB, int veikkausA, int veikkausB) { if (tulosA > tulosB) { tulos = 1; // Ensimmäinen joukkue voitti. } else if (tulosA < tulosB) { tulos = 2; // Ensimmäinen joukkue hävisi. } else { tulos = 3; // Varsinainen peliaika päättyi tasapeliin. } if (tulos == 1 && veikkausA > veikkausB) { valitulosA = tulosA - veikkausA; valitulosB = tulosB - veikkausB; if (valitulosA < 0) { valitulosA = -valitulosA; } if (valitulosB < 0) { valitulosB = -valitulosB; } lopputulos = 10 - valitulosA - valitulosB; if (lopputulos < 3) { lopputulos = 3; } return (lopputulos); } else if (tulos == 2 && veikkausA < veikkausB) { valitulosA = tulosA - veikkausA; valitulosB = tulosB - veikkausB; if (valitulosA < 0) { valitulosA = -valitulosA; } if (valitulosB < 0) { valitulosB = -valitulosB; } lopputulos = 10 - valitulosA - valitulosB; if (lopputulos < 3) { lopputulos = 3; } return (lopputulos); } else if (tulos == 3 && veikkausA == veikkausB) { valitulosA = tulosA - veikkausA; if (valitulosA < 0) { valitulosA = -valitulosA; } lopputulos = 12 - valitulosA * 2; if (lopputulos < 3) { lopputulos = 3; } return (lopputulos); } else { lopputulos = 0; return (lopputulos); } } 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); } void piirraTeksti(TTF_Font *fontti, const char *merkkijono, SDL_Color vari, SDL_Surface *naytto, int x, int y) { SDL_Surface *teksti = TTF_RenderText_Solid(fontti, merkkijono, vari); SDL_Rect alue; alue.x = x; alue.y = y; SDL_BlitSurface(teksti, NULL, naytto, &alue); } int main(int argc, char *argv[]) { SDL_Init(SDL_INIT_VIDEO); TTF_Init(); SDL_WM_SetCaption("Lätkäveikkaus", NULL); SDL_Surface *naytto = SDL_SetVideoMode(1920, 1080, 32, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_RESIZABLE); SDL_Surface *tausta = SDL_LoadBMP("kuvat/tausta.bmp"); SDL_Surface *taustaMaa = SDL_LoadBMP("kuvat/tausta_maa.bmp"); SDL_Surface *taustaTulos = SDL_LoadBMP("kuvat/tausta_tulos.bmp"); SDL_Surface *valiviiva = SDL_LoadBMP("kuvat/valiviiva.bmp"); TTF_Font *arial = TTF_OpenFont("fontit/arial.ttf", 15); SDL_Color musta = {0, 0, 0}; int xH = 0, yH = 0, nappainH; Uint8 *nappain; bool poistu = false; char koordinaattiX[30]; char koordinaattiY[30]; SDL_Event tapahtuma; while(poistu == false) { SDL_PollEvent(&tapahtuma); nappain = SDL_GetKeyState(NULL); SDL_GetMouseState(&xH, &yH); if (nappain[SDLK_ESCAPE]) { poistu = true; } if (tapahtuma.type == SDL_QUIT) { poistu = true; } if (nappain[SDLK_a]) { MessageBox(NULL, "Liian monta numeroa tuloskentässä!", "ERROR", MB_OK); } piirraKuva(tausta, naytto, 0, 0); //---------------------------------------------------------- piirraKuva(taustaMaa, naytto, 50, 200); piirraKuva(taustaMaa, naytto, 50, 250); piirraKuva(taustaTulos, naytto, 270, 200); piirraKuva(taustaTulos, naytto, 270, 250); piirraKuva(valiviiva, naytto, 317, 213); // Vasen laita. piirraKuva(valiviiva, naytto, 317, 263); piirraKuva(taustaMaa, naytto, 350, 200); piirraKuva(taustaMaa, naytto, 350, 250); piirraKuva(taustaTulos, naytto, 570, 200); piirraKuva(taustaTulos, naytto, 570, 250); //---------------------------------------------------------- piirraKuva(taustaMaa, naytto, 685, 200); piirraKuva(taustaMaa, naytto, 685, 250); piirraKuva(taustaTulos, naytto, 905, 200); piirraKuva(taustaTulos, naytto, 905, 250); piirraKuva(valiviiva, naytto, 952, 213); // Keskirivi. piirraKuva(valiviiva, naytto, 952, 263); piirraKuva(taustaMaa, naytto, 985, 200); piirraKuva(taustaMaa, naytto, 985, 250); piirraKuva(taustaTulos, naytto, 1205, 200); piirraKuva(taustaTulos, naytto, 1205, 250); //---------------------------------------------------------- piirraKuva(taustaMaa, naytto, 1320, 200); piirraKuva(taustaMaa, naytto, 1320, 250); piirraKuva(taustaTulos, naytto, 1540, 200); piirraKuva(taustaTulos, naytto, 1540, 250); piirraKuva(valiviiva, naytto, 1587, 213); // Oikea laita. piirraKuva(valiviiva, naytto, 1587, 263); piirraKuva(taustaMaa, naytto, 1620, 200); piirraKuva(taustaMaa, naytto, 1620, 250); piirraKuva(taustaTulos, naytto, 1840, 200); piirraKuva(taustaTulos, naytto, 1840, 250); //---------------------------------------------------------- sprintf(koordinaattiX, "Hiiren x-koordinaatti: %d", xH); sprintf(koordinaattiY, "Hiiren y-koordinaatti: %d", yH); piirraTeksti(arial, koordinaattiX, musta, naytto, 0, 0); piirraTeksti(arial, koordinaattiY, musta, naytto, 0, 20); SDL_Flip(naytto); } SDL_FreeSurface(tausta); SDL_FreeSurface(taustaMaa); SDL_FreeSurface(taustaTulos); SDL_FreeSurface(valiviiva); void TTF_CloseFont(TTF_Font *arial); SDL_Quit(); TTF_Quit(); return 0; }
Mainittakoon vielä, että ohjelma on pahasti puolitiessä ja esimerkiksi tuota "pelitulos" nimistä funktiota ei edes kutsuta missään vaiheessa. Ohjelman tarkoitushan on joskus tulevaisuudessa (ellei homma jää tähän) laskea käyttäjän syöttämien oikeiden pelitulosten ja veikattujen pelitulosten pisteitä.
Kiitän suuresti, jos joku edes vaivautuu yrittää auttaa ongelmani kanssa.
Yhteensattuma. Huono näytönohjain.
Siis tokihan ohjelma voi rikkoa rautaa jos rauta ja sen laiteohjain on alunperin virheellisesti suunniteltu, ei siinä mitään. Silloin ongelman pitäisi mennä takuun pikkiin. Jos takuu on jo mennyt niin pitäisi mennä virhevastuun piikkiin, joskin siinä tapauksessa päässee tappelemaan.
Eri asia sitten jos esim. ylikellottaa näytönohjainta. Silloin menee melko pitkästi omalla vastuulla kaikki mitä tapahtuu.
Offtopic:
koodari kirjoitti:
void TTF_CloseFont(TTF_Font *arial);
Kai tiedät, että tämä rivi ei tee mitään? Katsopa ylemmistä riveistä mallia, miltä funktion kutsuminen näyttää: ei ole paluuarvon eikä parametrien tyyppejä.
Metabolix kirjoitti:
Kai käsität, että tämä rivi ei tee mitään? Katsopa ylemmistä riveistä mallia, miltä funktion kutsuminen näyttää.
Jostain internetin syövereistä löysin jonkinlaisen esimerkin, jossa tuolla tavalla tehtiin. Olisihan tuo kaiketi pitänyt älytä, mutta sen kummempia miettimättä vaan lätkäisin sen siihen.
Noh, täytynee koettaa huomenissa palata ohjelman pariin. Toivon suuresti, että koodi ei riko mitään komponentteja...
Ei kelvollinen, uusi näyttis kyllä 300 euroa maksa. 100 euroa jos haluaa uusinta tekkiä tukevan eikä maksa törkyistä "tämän vuoden versio"-ylihintaa. Parikymppiä jos vanhempi käytetty kelpaa.
Teoriassa on toki mahdollista, että ohjelman aiheuttama kuormitus on sattumalta hajoittanut muutenkin huonosti suunnitellun näytönohjaimen, mutta se on oikeasti näytönohjaimen eikä ohjelman vika. Mitä todennäköisimmin et saa koodattua yhtään mitään, mikä rikkoisi ehjiä, hyvin suunniteltuja komponentteja.
Tzaeru kirjoitti:
Ei kelvollinen, uusi näyttis kyllä 300 euroa maksa. 100 euroa jos haluaa uusinta tekkiä tukevan eikä maksa törkyistä "tämän vuoden versio"-ylihintaa. Parikymppiä jos vanhempi käytetty kelpaa.
Tämä sattuu olemaan pelikone, niin 100€ hintaan ei kovin montaa fps saa, ikävä kyllä. Edellinen näyttis oli Radeon HD 6970, eli ei mikään ihan paska näyttis ollut kyseessä. Liekkö sitten ikä painanut päälle, en nyt muista kuinka vanhaksi tuo kerkesi elää.
Olethan katsonut koneen sisälle ja poistanut pölyt? Itselläni tuli jokunen viikko sitten pari kertaa bsod ja kun avasin koneen kyljen, niin ihme että edes näyttiksen tuuletin pyöri!
Hennkka kirjoitti:
Olethan katsonut koneen sisälle ja poistanut pölyt? Itselläni tuli jokunen viikko sitten pari kertaa bsod ja kun avasin koneen kyljen, niin ihme että edes näyttiksen tuuletin pyöri!
Koneessa on lähes jatkuvasti toinen kylki auki, josta voi mainiosti tuijotella sisuskaluja. Pölyä siellä ei ole juuri nimeksikään. Ja AMD:n omasta näyttiksen hallintapaneelista olen tarkkaillut grafiikkakortin lämpöjä ja siinä 50°C paikkeilla on pysytellyt, eikä kädelläkään kokeilemalla kuumalta tunnu.
Aihe on jo aika vanha, joten et voi enää vastata siihen.