Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Vanha C++-koodi

timodemus [05.09.2007 19:10:06]

#

Moro,

kirjoitin yhdestä C++ -oppaasta seuraavan ohjelman, mutta en saa sitä toimimaan.

#include <iostream.h>
void main()
{
     enum Paivat { Sunnuntai, Maanantai, Tiistai, Keskiviikko, Torstai, Perjantai, Lauantai };

     Paivat vapaaPaiva;

     cout << "Minka paivan haluat pitaa vapaata (0-6)? ";
     cin >> vapaaPaiva;

     if (vapaaPaiva == Sunnuntai || vapaaPaiva == Lauantai)
        cout << "Viikonloppu on vapaata muutenkin!\n";
     else
         cout << "Ok. pannaan muistiin\n";
}

Kääntäjä pukkaa seuraavat ilmoitukset:

f:\cpp\opetai~1\379e57~1.cpp: In function `int main(...)':
f:\cpp\opetai~1\379e57~1.cpp:9: initializing non-const `int &' with `main(...)::Paivat' will use a temporary
C:\DEV-C_~1\Include\G__~1\iostream.h:206: in passing argument 1 of `istream::operator >>(int &)'

Kun poistan rivin "cin >> vapaaPaiva;", kääntäjän virheilmoitukset häviävät.
Käyttämäni ympäristö on DevC++ 4.
Kertokaa mitä tein väärin?

Legu [05.09.2007 19:24:09]

#

Helpoin tapa on muuttaa vapaaPaiva:n tyypiksi int. Muutenkaan ei taida olla mikään kovin laadukas opas, nimittäin <iostream.h> on vanhentunut ja sen tilalla tulisi käyttää <iostream>:a. void main() ei ole myöskään C++ -standardin mukainen, vaan tulisi käyttää int main():a.

squid [05.09.2007 19:24:37]

#

Ensinäkin, se on std::cout ja std::cin.
Toiseksi, eikös C++:ssa se ole int main() {}?

FooBat [05.09.2007 19:24:49]

#

Ratkaisu on lukea uudenpaa C++ opasta, joka ymmärtää nimiavaruuksia.

Edit: lisätään nyt linkkikin:
http://www.cplusplus.com/doc/tutorial/namespaces.html

squid [05.09.2007 19:25:35]

#

Heh, aikas nopeesti sait kyl monta vastuasta :)

timodemus [05.09.2007 21:00:06]

#

Kiitos kaikille!

Katsoin vähän tarkemmin tuon oppaan tietoja:
Kirja on kirjoitettu vuonna 1994 ja C++ on varmaan "hieman" kehittynyt sen jälkeen...

koo [05.09.2007 22:38:29]

#

Eiköhän perimmäinen syy ole se, että Paivat on oma enum-tyyppinsä ja että istreamin >>-operattoria ei ole määritelty sille tyypille. Tarpeen tullen enum muuntuu automaattisesti sopivaksi kokonaislukutyypiksi, mutta toisin päin homma ei toimi. Muunnos luo yleensä tilapäisen arvon, jota ei voi käyttää viittausparametrina.

Kiertotie on käyttää esimerkiksi intiä enumin sijasta. Mikäli enumin arvoalue on sopiva, enum voidaan aina sijoittaa intiin ja intiä voidaan esmes vertailla enumiin.

Älä lue noin vanhaa C++-opasta. Kieli on ehditty mm. standardoida vuoden 1994 jälkeen ja tuossa esimerkkipätkässä on paljon ei-standardinmukaista tavaraa.

Vastaus

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

Tietoa sivustosta