Eli hain netistä c++ oppaan, mutta ongelamni on se, että kun se on tarkistanut koodin, niin se ikkuna mihin tekstin pitäisi tulla, pysyy siinä vain pari minuuttia.
"Vain pari minuuttia"? Jos meinaat paria sekuntia tai että se vilahtaa niin ongelmaan on monia ratkaisuja, yksi on, että lisäät ohjelmaan esimerkiksi
std::cin.get();
loppuun. std:: -osaa ei tarvitse jos olet alkuun kirjoittanut "using namespace std;". Huomaa että iostream-kirjasto pitää olla sisällytetty. Esimerkki:
#include <iostream> using namespace std; int main () { cout << "Moi!"; cin.get(); return 0; }
Tällöin pitää painaa Entteriä jotta ruutu menee pois.
Niin lyhyt aloitusposti, voi samantien pätkiä vaikka osiin ;-)
cool-driver kirjoitti:
Eli hain netistä c++ oppaan,
OK.
cool-driver kirjoitti:
mutta ongelamni on se,
OK, ei kiirrettä.
cool-driver kirjoitti:
että kun se on
Mikä se? C++-opasko?
cool-driver kirjoitti:
tarkistanut koodin,
Tarkistanut?
cool-driver kirjoitti:
niin se ikkuna mihin tekstin pitäisi tulla,
Mihin ikkunaan tekstin pitäisi tulla?
cool-driver kirjoitti:
pysyy siinä vain pari minuuttia.
Mitä parin minuutin jälkeen tapahtuu? Liikkuuko ikkuna?
Tilannekuvaus ja ongelman kuvaus on ikävästi tiivistetty, vaikkei tilasta olisi ollut pulaa - ja samalla kysymys (yleensä kysytään jotain) on jätetty kokonaan väliin. Aloituspostista ei juuri selvinne liittyykö ongelma varsinaisesti C++:aan (niin kuin otsikosta voisi olettaa), vai tekstissä mainittuun C++-oppaaseen.
Ihme_kala kirjoitti:
(...) Tällöin pitää painaa Entteriä jotta ruutu menee pois.
Ongelmaa yritetään tässä ratkaista väärästä kohdasta, jolloin törmätään vain useampiin ongelmiin jos ohjelma tekee muutakin, kuin tulostaa tekstiä.
Oikea ratkaisu (Ihme_kalan kuvaamaan ongelmaan) on tietysti se, että ohjelmia ei suoriteta konsolissa, joka sulkeutuu ohjelman myötä.
Ihme_kala kirjoitti:
"Vain pari minuuttia"? Jos meinaat paria sekuntia tai että se vilahtaa niin ongelmaan on monia ratkaisuja, yksi on, että lisäät ohjelmaan esimerkiksi
std::cin.get();
Kiitos
Tosiaan kannattaa opetella käyttämään käyttöjärjestelmän konsolia, jossa ohjelma ajetaan. Ihan myöhempien koodailujen vuoksi, sillä on paljon mielekkäämpää lukea tulostetta konsolista kuin lisäillä ohjelman jokaiseen mahdolliseen pysäytyspaikkaan std::cin.get()
, vaikka se aluksi niin helpolta tuntuukin.
Google löytää oppaat ihan mihin vain, mutta oletan, että käytät Windows-järjestelmää, ja annan pienet alkusanat komentorivin käyttöön.
Komentorivin saa käyntiin käynnistä-valikosta (ohjelmat -> apuohjelmat -> komentorivi) tai suorita-valikon kautta syöttämällä siihen "cmd" ilman hipsuja. Mustan ikkunan pitäisi tervehtiä sinua tekstillä:
Microsoft-höpinää. C:\järjestelmäkohtainen polku\käyttäjänimi> _
Tähän voit syöttää haluamiasi komentoja. Niitä on todella paljon, mutta ongelmasi kannalta oleellisia ovat cd
(ilmeisesti change directory?), dir
(listaa kansion sisällön (directory)) ja start
.
Olettaen, ettei ohjelmasi ole heti komentorivin alkuosoitteessa, joudut navigoimaan cd-komennon avulla ohjelmointikansioosi. Se tapahtuu kirjoittamalla komento cd ja parametriksi polun haluamaasi kansioon. Esimerkiksi:
cd "C:\ohjelmointi\harjoitukset\hello world\"
Hipsut siksi, etteivät turhat välilyönnit katkaise syötettä. Jos taas ohjelmointikansiosi on vain yhden kansion päässä oletuksesta (C:\järjestelmäkohtainen polku\ohjelmointikansio), voit kirjoittaa:
cd "..\ohjelmointikansio"
Jolloin "..\" nostaa sinut yhden kansiopuun ylemmäs. Komennon voi myös parsia osiin.
cd "..\" # noustaan ylös cd "ohjelmointikansio" # siirrytään haluttuun kansioon
#-merkin jälkeen tulevat ovat omia kommenttejani. Niitä ei missään nimessä lisätä komentoihin.
Kun ollaan halutussa kansiossa, voidaan dir-komennolla tutkia sen sisältöä ja start-komennolla käynnistää ohjelma (toiseen ikkunaan). Vaihtoehtoisesti voit vain kirjoittaa "hello_world.exe" tai "hello_world" olettaen, että tämä on suoritettavan tiedoston nimi.
Minusta ratkaisuni oli sopiva. Okei, toki on hyvä selostaa tuokin aloittelijalle, mutta aloitusviestistä sain sellaisen kuvan että kyseessä on TODELLA aloittelija ja päätin vastata siten, että ongelma tulee ratkaistua. Minusta tuo cin.get() ei ole mitenkään huono tapa tässä vaiheessa. Katsoin parhaaksi neuvoa todella yksinkertaisen ratkaisun aloittelijan pulmaan.
Omasta mielestäni nimittäin joitakin asioita voi vähän tavallaan skippailla tai ratkaista 'lyhytnäköisesti', jos kyseessä on aloittelija. Otetaanpa esimerkki: Koitat selittää C++:lla toteutetun Hello World ohjelman jokaista riviä henkilölle, joka ei tiedä ohjelmoinnista YHTÄÄN mitään. Alatko selittämään std:: tai using namespacen kohdalla asiaa nimiavaruuksien käytöstä? Et, vaan sanot vaan tylysti että se using namespace on siinä aina kun käytät komentoja jostain kirjastosta. Tämähän voi tosiaankin olla asian skippaamista tai jopa väärin selittämistä, mutta tärkeintä on se, että lähdetään liikkeelle olennaisesta ja niin, että oppijan motivaatio pysyy eikä hänen niskaansa kaadeta liikaa asiaa.
Ihme_kala kirjoitti:
Omasta mielestäni nimittäin joitakin asioita voi vähän tavallaan skippailla tai ratkaista 'lyhytnäköisesti', jos kyseessä on aloittelija.
Kyse ei ole skippailusta tai selityksesi huonoudesta, vaan ylipäänsä ratkaisutavasta. std::cin.get()
ei mitenkään maagisesti velvoita käyttäjää painamaan "entteriä", vaan yksinkertaisesti hakee merkin syötepuskurista: jos ja kun ohjelma pyytää tulostuksen lisäksi myös syötteitä (miten nyt yleensä C++-ohjelmointi aloitetaan), on vain todennäköistä että puskuria ei aina tyhjennetä, jolloin tämä "ratkaisu" lakkaa toimimasta.
Yhdellä lisäkoodirivillä tämäkin ongelma ratkeaisi, mutta purkkaratkaisu se silti on.
Ymmärrän kyllä hyvin Ihme_kalan pointin. Kysyjän ongelma saadaan helpoiten ratkaistua yhdellä mainitunkaltaisella koodirivilla, joten miksi nillittää?
Kannattaa kuitenkin muistaa, että tämä nimenomainen yleinen ongelma ei liity varsinaisesti C++-ohjelmointiin vaan siihen, ettei kysyjän käyttöjärjestelmä-IDE-yhdistelmä (kristallipallo sanoo Windows-Dev-C++) tarjoa toimivaa konsoliratkaisua. "Oikeana ratkaisuna" suosittelisin itse tässä tapauksessa sitä, että buginen Dev-C++ heivataan hevon kuuseen ja tilalle asennetaan Eclipse CDT, joka osaa käsitellä STDINiä ja -OUTtia omassa konsolissaan.
Purkkaratkaisuna konsolin katoamisongelmaan kannattaa tietysti käyttää lausetta system("pause")
, joka näyttää selkeän tekstin, velvoittaa käyttäjän maagisesti painamaan esimerkiksi enteriä, eikä muistaakseni niin välitä syötepuskurin ylimääräisistä merkeistä. Tarkoituksenmukaisuudeltaan ja "porttautuvuudeltaan" se on aivan samaa sarjaa cin.get()
:in, getch()
:in (myös hyvä) ja scanf("%*c")
:n kanssa.
Paras ratkaisu std::
-"ongelmaan" on mielestäni unohtaa using namespace std
-lauseen olemassaolo ja käyttää std::
-etuliitettä alusta asti kiltisti kaikkissa tarvittavissa paikoissa, kuten myös "oikeasti" ja "jatkossa" kuuluu tehdä. Aloittelija voisi esimerkiksi opetella käsittämään std::cin
ja std::string
-tyyliset ilmaukset aluksi kokonaisuuksina ja vasta myöhemmin selvittää, miten kaksoispisteiden liittämä yhdistelmänimi todellisuudessa toimii.
system("PAUSE");
peuhaa winukalla, vaikkei tätäkään kannata käyttää. sillä ei tosin ole kyllä merkitystä jos vaan jotain harjoitustöitä väännetään
groovyb kirjoitti:
system("PAUSE");
peuhaa winukalla
https://www.ohjelmointiputka.net/keskustelu/
Aihe on jo aika vanha, joten et voi enää vastata siihen.