Morjensta
Otin Dev-C++ 5 beta 9:n koneelleni, mutta tämä ei suostu toimimaan. Ohjelma sanoo koodin olevan puutteellinen, ja herjaa viimeistä riviä. Samat koodit toimivat pöytäkoneellani, mutta ei tässä miniläppärissä. Mistä tälläinen johtuu?
koitas Code::blocksia on paljon parempi kuin dev-cpp.
Edit: laita se virheilmoitus.
Onko sulla varmasti kaikki header-filut myös miniläppärissä?
Ei ollut asennusohjelma nähtävästi vetänyt kaikkea läpi, ja johtui siitä että noita laajennuksia (Vai mitä nämä ovat?) puuttui.
Edit. Kysyn vielä, että miten saisin ääkköset toimimaan oletuksellisesti? En haluaisi käyttää aina näitä \x84 sun muita...
en ttiiä ku en oo tota Dev-C++ käyttäny...
Ehdotus:
1. koko hoito ääkkösillä
2. joku replace-toiminto: ä => \x84 ja silleen
EDIT: Niin, eikä eskeippaaminenkaan aina
toimi halutulla tavalla
#include <iostream> using namespace std; //Aloitetaan koko varsinainen systeemi int main() { //Tyhjennetään näyttö sen turhuuksista system("CLS"); //Haluaako käyttäjä pelata std::cout << "Haluatko tietää huomisen horoskooppisi? (k / e)" << std::endl; //Otetaan vastaus talteen char valinta; cin >> valinta; //Jos vastattiin kyllä while(valinta == 'k') { //Tyhjennetään näyttö turhuuksista system("CLS"); std::cout << "Monesko päivä olet syntynyt?" << std::endl; char paiva; cin >> paiva; //Jos päivä on annettu if(paiva > 0) { system("CLS"); std::cout << "Monesko kuukausi olet syntynyt?" << std::endl; char kk; cin >> kk; if(kk > 0) { //Jos päivä ja kuukausi ovat parilliset if(paiva % 2 == 0 && kk % 2 == 0) { std::cout << "Kuolet kivuliaasti" << std::endl; } else { //Jos ne eivät ole parillisia, tai vaan toinen on std::cout << "Elät vielä" << std::endl; } } else std::cout << "Ai, nollantena kuukautena " << paiva << " päivänä?" << std::endl; } else std::cout << "Ai, et ole syntynytkään vielä? :o" << std::endl; } }
Alkaa mennä jo väärälle alueelle nämä kysymykset, mutta en nyt viitsi aloittaa uutta aihetta.
Jos tälle syöttää päivämäärän milloin on syntynyt (esim. 12), niin se heittää takaisin kysymykseen...
Ai, miten tuota replacea käyttäisin?
Mod. edit: siirsin
Jos vaikka laittaisit sen päivän int - muuttujaan...
char paiva -> int paiva
Tosin kyll ton noinki pitäis toimia.
Edit: siis ei mene tuohon kk kysymykseen ollenkaan?
Aika masentava ohjelma sulla... Joo, käytä inttiä.
Jep, int auttoi. :D No, nyt vielä on ongelma: Tulos vaan vilkahtaa tuolla vikan if lauseen sisällä.
Deffi kirjoitti:
Aika masentava ohjelma sulla...
No joo :D Heitin sinne vaan jotain...
Kun näköjään koodi on noin purkkaa, ja muutenkin käytetty Windows-spesifisiä toimintoja, niin vastaus on
while (valinta == 'k') { // ... system("PAUSE"); }
Tuon tiesinkin, mutta kun se tulosti sen jännän tekstin.. No, system("PAUSE > NUL") toimi :) Kiitos teille avusta.
MIB: Lue C++-opasta. Siellä neuvotaan mm. toimivan kehitysympäristön asentaminen (kannattaa käyttää jotain muuta kuin Dev-C++:aa!) ja vilahtamisen syy ja ratkaisu (yllä esitetty PAUSE on lopulta aika huono vaihtoehto).
Miksi tulostat komennolla
std::cout
kun olet kuitenkin tuolla alussa jo kertonut käyttäväsi std nimiavaruutta
using namespace std
Tekee sellaisin vaikutelman ettet ymmärrä omaa koodia hirvittävän hyvin. Sori et kirjottelen aina vaan offtopicia =)
No, sattu vaan unohtumaan se sinne.
Juu tiedän ettei tämä ole chatti, mutta unohtui näköjään aika moneen paikkaan ;D
Jeps. Muuten, miten saan katsottua, että onko merkkijonossa pelkästään numeroita? Ohjelma sekoaa, jos syöttää kirjaimen...
Koitapa ctype.h:n funktiota isdigit().
#include <iostream> int main() { int numero; std::cin >> numero; std::cin.good() ? std::cout << "On numero" : std::cout << "Ei ole numero"; std::cout << std::endl; return 0; }
Jos lukisit sitä opasta, voisit vähitellen löytää kaikenlaisia vastauksia kysymyksiisi. Lisäksi suosittelen, että noin aloittelijana luovut "miten teen" -asenteesta ja opettelet sen sijaan sitä, mitä helpoiten löytyy. On nimittäin aivan turha selittää kaikkia hienoja asioita, kun et ilman pohjatietoja kykene kuitenkaan ymmärtämään, mistä oikeastaan on kyse.
Lukemisen onnistumisen voi tarkistaa metodilla std::cin.good()
, ja virheen jälkeen voi kutsua metodia std::cin.clear()
ja yrittää sitten lukea sen virheellisen merkin vaikka char-muuttujaan.
Kysyn vielä, että miten saa tämän päivämäärän tietoon? Pitää ainakin includettaa time.h?
Vaikka näin:
#include <iostream> #include <ctime> int main (){ time_t raaka_aika; std::time(&raaka_aika); std::cout << std::ctime(&raaka_aika); return EXIT_SUCCESS; }
Nappaistu täältä
Kiitos
______
Jostain syystä tämä tulostaa kaikki lohkot:
#include <iostream> using namespace std; int main() { cout << "Anna luku: "; int luku; cin >> luku; if(luku != 0) { if(luku % 2 == 0) { goto parillinen; } else if(luku % 2 != 0) { goto pariton; } else { goto error; } parillinen: cout << luku << " % 2 == 0!\n"; pariton: cout << luku << " % 2 == " << luku % 2 << "!"; error: cout << "Jotain outoa tapahtui..."; } system("PAUSE > NUL"); }
Tarkoitus olisi tulostaa vain tietty teksti...
Gotohan siis hyppää johonkin kohtaan ohjelmassa eli suoritus jatkuu siitä minne se hyppää.
Miten saisin lopetettua ohjelman suorittamisen? PHP:ssä on die ja exit, mutta mitä C++:ssa?
Menet esimerkiksi main-funktion loppuun? =)
Tuossa siis malliesimerkki, mihin gotoa ei saa käyttää - ohjelman toiminta ei ole loogista. Tuon voi korjata purkalla laittamalla loppu nimiön ohjelman loppuun ja noista edellisistä nimiöistä uusi hyppy loppuun...
Tai sitten pitää suunnitella kokonaan uusi algoritmi tuohon.
Jätä goto pois ja laita tulostukset suoraan ehtolauseeseen. Virhelohkoon ei koskaan päädytä, koska jompikumpi aiemmista ehdoista toteutuu varmasti.
#include <iostream> using namespace std; int main() { std::cout << "Anna luku: "; int luku; std::cin >> luku; if(luku != 0) { if(luku % 2 == 0) { std::cout << luku << " % 2 == 0!\n"; } else { std::cout << luku << " % 2 == " << luku % 2 << "!"; } } system("PAUSE > NUL"); }
Jep, kyllä sen noin olisi voinut tehdä, mutta harjoittelin oppaan asioita, kuten nyt sitä goto juttua.
__________
Edit.
Sain aikaan jonkinlaisen sähellyksen, joka tarkistaa onko luku pariton vai ei. Voisi kyllä aika paljon helpomminkin tehdä...
#include <iostream> using namespace std; int main() { kysy: system("CLS"); cout << "Anna luku joka tarkistetaan: "; int luku; cin >> luku; if (!cin.good()) { system("CLS"); cout << "Luku ei ollut numero tai se oli liian pitk\x84!\n\n"; system("PAUSE"); } alku: system("CLS"); if(luku != 0) { if(luku % 2 == 0) { cout << luku << " % 2 = 0"; } else { cout << "Luku on pariton!\nLuvun " << luku << " jakoj\x84\x84nn\x94s on " << luku % 2; } } cout << "\n\nUudelleen? (k / e)\n"; char valinta; cin >> valinta; if(valinta == 'k') { system("CLS"); goto kysy; } else { return 0; } system("PAUSE > NUL"); }
MIB kirjoitti:
Jep, kyllä sen noin olisi voinut tehdä, mutta harjoittelin oppaan asioita, kuten nyt sitä goto juttua.
Vieläkö joku on sitä mieltä, että oppaassa pitää mainita goto?
Blaze kirjoitti:
MIB kirjoitti:
Jep, kyllä sen noin olisi voinut tehdä, mutta harjoittelin oppaan asioita, kuten nyt sitä goto juttua.
Vieläkö joku on sitä mieltä, että oppaassa pitää mainita goto?
Kyllähän sen voi mainita, mutta samalla vois sanoa, että gotoa ei kannata käyttää vaan kuin hätätilassa (eli jos sillä estää kauhean purkkakoodin).
Blaze kirjoitti:
Vieläkö joku on sitä mieltä, että oppaassa pitää mainita goto?
Lukijan ymmärtämättömyys ei ole syy jättää asioita kertomatta. Eihän tässäkään ongelma johdu viime kädessä gotosta vaan siitä, että MIB ei ymmärrä, että ohjelman rivit suoritetaan järjestyksessä, jolloin tietenkin ensimmäisen tulostuksen jälkeen tulee toinen tulostus ja sitten kolmas, kun ne kerran koodissa ovat peräkkäin ilman mitään ehtoja.
Vieläkö joku on sitä mieltä, että C++:sta pitää kirjoittaa opas? Sillähän voi vaikka aiheuttaa segfaultin!
Metabolix kirjoitti:
Blaze kirjoitti:
Vieläkö joku on sitä mieltä, että oppaassa pitää mainita goto?
Lukijan ymmärtämättömyys ei ole syy jättää asioita kertomatta. Eihän tässäkään ongelma johdu viime kädessä gotosta vaan siitä, että MIB ei ymmärrä, että ohjelman rivit suoritetaan järjestyksessä, jolloin tietenkin ensimmäisen tulostuksen jälkeen tulee toinen tulostus ja sitten kolmas, kun ne kerran koodissa ovat peräkkäin ilman mitään ehtoja.
Vieläkö joku on sitä mieltä, että C++:sta pitää kirjoittaa opas? Sillähän voi vaikka aiheuttaa segfaultin!
Segmentation faultit ovat NIIN 90 -lukua. Kyllä ne nykyajan käyttöjärjestelmän käyttävät pikemminkin sivutusta, kuin segmentointia. Tosin *nix-maailmassa prosessi, joka käsittelee virheellisesti muistiavaruutta, lähettää SIGSEGV -signaalin.
Jalmari91 kirjoitti:
Blaze kirjoitti:
MIB kirjoitti:
Jep, kyllä sen noin olisi voinut tehdä, mutta harjoittelin oppaan asioita, kuten nyt sitä goto juttua.
Vieläkö joku on sitä mieltä, että oppaassa pitää mainita goto?
Kyllähän sen voi mainita, mutta samalla vois sanoa, että gotoa ei kannata käyttää vaan kuin hätätilassa (eli jos sillä estää kauhean purkkakoodin).
Yleensä gotolla saa aikaan spagettikoodia. Ja ainoa purkkakoodia kamalampi asia on spagettikoodi. Tosin joissain hyvin spesiaaleissa tapauksissa goto voi jopa selkeyttää, yksinkertaistaa ja suoraviivaistaa koodia. Niissäkin tapauksissa logiikan rakentaminen hieman toisin on yleensä järkevämpää.
Se että goton voi aina korvata jollain muulla rakenteella tai että sen varomaton käyttö aiheuttaa ongelmia, ei ole syy olla opettelematta miten se toimii. Jo ihan pelkästään senkin takia että siihen voi törmätä ylläpitäessä tai uudelleenkäytettäessä jonkun toisen koodia. Koodia jota ei ymmärrä on hankala lukea ja muokata.
goala kirjoitti:
Segmentation faultit ovat NIIN 90 -lukua. Kyllä ne nykyajan käyttöjärjestelmän käyttävät pikemminkin sivutusta, kuin segmentointia.
Mitähän prosessorin segmenttirekistereihin sitten laitetaan? Monet käyttöjärjestelmät käyttävät vähintäänkin neljää segmenttiä: koodi ja data erikseen, ring 0 ja 3 erikseen. Eri segmenteillä on erilaiset oikeudet, vaikka muistialue olisikin sama.
Myönnän, että prosessoritasolla segmentation faultiksi kutsuttavan virheen aiheuttaminen vaatii hieman enemmän tuuria kuin sen tavanomaisen page faultin: pitää saada aikaan hyppykäsky toiseen (olemattomaan) segmenttiin. :) Kuitenkin näin käyttöjärjestelmää ylemmällä tasolla on jokseenkin sama, kummasta virheestä on kysymys, koska periaate on sama (muistia käytetty väärin) ja lopputulos myös (ohjelma kaatuu).
Sitä paitsi segmentin ei tarvitse tarkoittaa prosessoritason segmenttiä, vaan kyseessä voi olla myös sivutuksen avulla muodostettu looginen segmentti. Esimerkiksi ELF-binaarit sisältävät segmentit mm. koodille, muuttuvalle datalle ja vakiodatalle, ja vakiodatan muuttamisesta voi seurata segmentation fault.
Segmentation faultin syy on muistinosoitusvirhe, kun ohjelma on yrittänyt lukea tai kirjoittaa sellaisessa osoitteessa, johon ei ole oikeuksia. Muistiin ladatussa ohjelmassa (image) voi olla alustettuja ja alustamattomia data-alueita, koodia, readonly-dataa yms., joita on nimitetty segmenteiksi jo paljon ennen 90-lukua.
Näillä ohjelman segmenteillä ei ole mitään tekemistä (Intelin) segmentoivan prosessoriarkkitehtuurin kanssa, paitsi niin päin, että segmenttirekistereitä voi käyttää apuna suojausten yms. toteutuksessa.
Page fault on (sivuttavan) virtuaalisen muistin toteutuksessa käytettävä mekanismi, joka kertoo muistinhallinnalle, että viitattu muistialue ei ole käytettävissä fyysisessä muistissa. Yleensä tämä ei ole ohjelmaa kaatava virhe, vaan käyttis hoitelee tilanteen kaikessa hiljaisuudessa esimerkiksi hakemalla puuttuvan alueen sivutustiedostosta.
Aihe on jo aika vanha, joten et voi enää vastata siihen.