Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Dev-C++ ilmoittaa virheestä

Sivun loppuun

MIB [16.09.2009 15:09:56]

#

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?

vehkis91 [16.09.2009 15:11:50]

#

koitas Code::blocksia on paljon parempi kuin dev-cpp.

Edit: laita se virheilmoitus.

jyrama [16.09.2009 15:11:52]

#

Onko sulla varmasti kaikki header-filut myös miniläppärissä?

MIB [16.09.2009 15:23:43]

#

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...

jyrama [16.09.2009 15:44:17]

#

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

MIB [16.09.2009 15:48:05]

#

#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

vehkis91 [16.09.2009 15:54:36]

#

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?

Deffi [16.09.2009 15:59:43]

#

Aika masentava ohjelma sulla... Joo, käytä inttiä.

MIB [16.09.2009 16:06:48]

#

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...

Legu [16.09.2009 16:13:41]

#

Kun näköjään koodi on noin purkkaa, ja muutenkin käytetty Windows-spesifisiä toimintoja, niin vastaus on

while (valinta == 'k') {
    // ...
    system("PAUSE");
}

MIB [16.09.2009 16:15:13]

#

Tuon tiesinkin, mutta kun se tulosti sen jännän tekstin.. No, system("PAUSE > NUL") toimi :) Kiitos teille avusta.

Metabolix [16.09.2009 16:20:24]

#

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).

Jalmari91 [16.09.2009 16:37:48]

#

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 =)

MIB [16.09.2009 16:45:00]

#

No, sattu vaan unohtumaan se sinne.

Jalmari91 [16.09.2009 17:05:06]

#

Juu tiedän ettei tämä ole chatti, mutta unohtui näköjään aika moneen paikkaan ;D

MIB [16.09.2009 17:19:23]

#

Jeps. Muuten, miten saan katsottua, että onko merkkijonossa pelkästään numeroita? Ohjelma sekoaa, jos syöttää kirjaimen...

Jaska [16.09.2009 17:28:49]

#

Koitapa ctype.h:n funktiota isdigit().

Jalmari91 [16.09.2009 17:29:51]

#

#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;
}

Metabolix [16.09.2009 17:30:14]

#

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.

MIB [17.09.2009 09:50:48]

#

Kysyn vielä, että miten saa tämän päivämäärän tietoon? Pitää ainakin includettaa time.h?

Teuro [17.09.2009 10:09:03]

#

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ä

MIB [17.09.2009 15:10:46]

#

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...

trilog [17.09.2009 15:34:08]

#

Gotohan siis hyppää johonkin kohtaan ohjelmassa eli suoritus jatkuu siitä minne se hyppää.

MIB [17.09.2009 15:37:10]

#

Miten saisin lopetettua ohjelman suorittamisen? PHP:ssä on die ja exit, mutta mitä C++:ssa?

Jalmari91 [17.09.2009 16:47:15]

#

Menet esimerkiksi main-funktion loppuun? =)

Teuro [17.09.2009 17:20:36]

#

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.

hunajavohveli [17.09.2009 18:15:38]

#

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");
}

MIB [17.09.2009 19:28:03]

#

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");
}

Blaze [17.09.2009 20:20:44]

#

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?

Jalmari91 [17.09.2009 20:31:49]

#

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).

Metabolix [17.09.2009 20:34:14]

#

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!

goala [18.09.2009 09:47:09]

#

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.

Torgo [18.09.2009 09:57:41]

#

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.

Metabolix [18.09.2009 16:44:22]

#

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.

koo [18.09.2009 22:35:07]

#

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.


Sivun alkuun

Vastaus

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

Tietoa sivustosta