Kirjoittelin tuossa ncurses-oppaan viimeisen esimerkin koodin editoriin, ja käänsin ohjelman. Kääntäjä ei sanonut mitään, mutta kun sen yrittää ajaa, komentoriville tulee "Liukulukupoikkeus" ja ohjelman suoritus jää siihen. Sitten kokeilin suoraan copypasteta esimerkin koodin editoriin, tallentaa sen ja kääntää luomuksen, ja yllättäen se toimi kuten pitääkin. Pistän tässä nyt molemmat koodit, yrittäkää bongata mahdolliset virheet. Itse en siihen pystynyt.
Ensin alkuperäinen esimerkin koodi
/* Ohjelma tulostaa konsoliin satunnaisiin kohtiin satunnaisia merkkejä satunnaisilla väreillä. Käyttäjä pystyy putsaamaan konsolin milloin haluaa kuten myös poistumaan siitä. */ #include <ncurses.h> #include <ctime> #include <cstdlib> int main(int argc, char** argv) { // Alustetaan satunnaislukugeneraattori. srand((unsigned int)time((time_t *)NULL)); initscr(); noecho(); raw(); curs_set(0); start_color(); int ch = 0; // Looppikerrat const int loopKerrat = 10000; // Arpomista varten int valittuVari = 0; char valittuMerkki = 0; int valittuPaikkaX = 0, valittuPaikkaY = 0; // Ovatko värit käytettävissä? bool varitKaytossa = has_colors(); // Konsolin tämän hetkinen koko. int ikkunaKokoX = 0, ikkunaKokoY = 0; getmaxyx(stdscr,ikkunaKokoY,ikkunaKokoX); // Tehdään niin kauan, kunnes kierroksia tulee loopKerrat verran täyteen. int count = 0; while(count < loopKerrat) { // Valitaan XY sijainti valittuPaikkaX = rand()%ikkunaKokoX; valittuPaikkaY = rand()%ikkunaKokoY; // Valitaan tulostettava merkki // väliltä 32-127 ASCII-taulukosta. valittuMerkki = rand()%95+32; // Jos värit ovat käytettävissämme, // Laitamme ohjelmaan väriä! if(varitKaytossa == true) { // Mustaa ei oteta mukaan (väri nro. 0) valittuVari = rand()%7+1; // Teemme uuden väriparin. // Parin numero on sama kuin kirjaimen värin numero, jottei tulisi sekaannusta. init_pair(valittuVari,valittuVari,COLOR_BLACK); } // Tulostetaan kirjain värin kanssa. mvaddch(valittuPaikkaY,valittuPaikkaX,valittuMerkki|COLOR_PAIR(valittuVari)); count += 1; // Näytetään stdscr:n sisältö joka kierroksen jälkeen. refresh(); } endwin(); return 0; }
Ja sitten meikäläisen tehtailema
#include <ncurses.h> #include <ctime> #include <cstdlib> int main ( int argc, char** argv ) { srand ( (unsigned int) time ( (time_t * ) NULL ) ); initscr(); noecho(); raw(); curs_set(0); start_color(); int ch = 0; const int loopKerrat = 1000; int valittuVari = 0; char valittuMerkki = 0; int valittuPaikkaX = 0, valittuPaikkaY = 0; bool varitKaytossa = has_colors(); int winSizeX = 0, winSizeY = 0; getmaxyx ( stdscr, winSizeY, winSizeY ); int count = 0; while ( count < loopKerrat ) { valittuPaikkaX = rand() % winSizeX; valittuPaikkaY = rand() % winSizeY; valittuMerkki = rand() % 95 + 32; if ( varitKaytossa == true ) { valittuVari = rand() % 7 + 1; init_pair ( valittuVari, valittuVari, COLOR_BLACK ); } mvaddch ( valittuPaikkaY, valittuPaikkaX, valittuMerkki|COLOR_PAIR ( valittuVari ) ); count++; refresh(); } endwin(); return 0; }
No, kaikkien silmät eivät ole puusta :) Kirjoittamassasi koodissa on seuraava virhe:
getmaxyx ( stdscr, winSizeY, winSizeY );
eli kirjoitit yhden merkin väärin. Ja koska winSizeX:lle ei koskaan anneta arvoa, se saattaa olla ihan mikä tahansa jollojin rand8)%-lauseissa x-koordinaatti saa arvoja joilla se menee muistialueiden yli -> liukulukupoikkeus.
Oho, niinpä näkyy :)
Kiitoksia todella paljon, nyt voin nukkua ensi yön rauhassa :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.