Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++-ohjelma vilahtaa

Sivun loppuun

cool-driver [11.05.2009 22:25:00]

#

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.

Ihme_kala [11.05.2009 22:39:00]

#

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

eq [12.05.2009 06:11:16]

#

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

cool-driver [12.05.2009 06:57:50]

#

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

tgunner [12.05.2009 10:19:46]

#

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.

Ihme_kala [12.05.2009 14:18:16]

#

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.

eq [12.05.2009 14:40:28]

#

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.

os [12.05.2009 15:40:36]

#

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.

groovyb [13.05.2009 12:51:02]

#

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

Blaze [13.05.2009 13:23:37]

#

groovyb kirjoitti:

system("PAUSE");
peuhaa winukalla

https://www.ohjelmointiputka.net/keskustelu/16500-ohjelmointikielistä-cobol-vai-assembly#v130032


Sivun alkuun

Vastaus

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

Tietoa sivustosta