Pääteohjaus 4


Tässä ohjauksessa harjoitellaan osiinjaetun tiedoston kääntämistä ja itse valmiiksi kirjoitettujen aliohjelmakirjastojen käyttöä.

Projekti

    Mene omaan hakemistoosi KOVALEVYLLÄ ja luo sen alle hakemisto nimeltä KERHO ja vaihda itsesi sinne.

    Kopioi KERHO-ohjelma omaan hakemistoosi:
    C:\MyTemp\ohj\vesal\KERHO>copy n:\kurssit\cpp\kerho\etsilaj.5\*.*[RET]
    

    Käynnistä Borland-C (BC[RET]).

    Aloita uusi projekti ([Alt-P] ja Open Project).

    Anna projektin nimeksi KERHO.

    Avaa tiedosto kerhomai.cpp ja laita projektiin ne tiedostot, jotka tiedoston kerhomai.cpp kommenteissa pyydetäään laittamaan projektiin (lisäämistä varten paina [Ins]):
    tulkitse esim CPP\ALI\MJONOT.C =>  N:\KURSSIT\CPP\ALI\MJONOT.C
    

    Katso, että kohdan Options|Directories kohdassa Include Directories lukee (älä hävitä rivin alkua!):
    ....INCLUDE;N:\KURSSIT\CPP\ALI
    
    Jollei lue, niin lisää viimeinen hakemisto.

    Kokeile ajaa ohjelmaa (valmiina on kerho KELMIT). Toimiiko kuten suunniteltu?

Breakpoint

Otetaan lyhyt debuggerin kertausharjoitus. Debuggerilla ohjelmaa pystyttiin ajamaan mm. askel kerrallaan. Oikeassa ohjelmassa kukaan ei jaksa kahlata koko ohjelmaa tällä tavoin läpi. Pitää keskittyä vain olennaisuuksiin.

Tämän vuoksi debuggerissa on mahdollisuus laittaa keskeytyskohtia, eli paikkoja joihin tultaessa pysähdytään, muuten ohjelmaa ajetaan normaalisti. Keskeytyskohtia voidaan laittaa myös ehdollisesti hyvinkin monipuolisesti. Kaikkein hienoimmissa systeemeissä keskeytys saadaan jonkin tietyn muuttujan saadessa tietyn arvon (tai yleensä muuttuessa) missä tahansa kohti ohjelmaa.

    Epäilet, että metodi cNaytto::kysy_tiedot ei toimi. Toimimattomuus ilmenee (ilmenisi esimerkiksi, koska nyt toimii) jotenkin henkilön lisäämisessä. Epäilet erityisesti aliohjelmaa kysy_kentta (NAYTTO.CPP).

    Avaa tiedosto NAYTTO.CPP (esimerkiksi näyttämällä tiedoston nimeä projekti-ikkunassa tai painamalla [F3]).

    Etsi aliohjelma kysy_kentta ([Ctrl-Q]F kysy_kentta[RET]). Mikäli ei löydy 1. yrittämällä, niin [Ctrl-L] etsii uudelleen.

    Siirry aliohjelmassa riville jolla lukee
        if ( paluu < OLETUS ) return TOIM_LOPETA;
    
    ja laita riville keskeytyskohta (breakpoint, joko [Ctrl-F8] tai [Alt-D] ja Toggle breakpoints).

    Lisää watch-ikkunaan aliohjelman kannalta mielenkiintoisia arvoja:
    paluu
    toim
    apu
    jono
    viesti
    

    Aja ohjelma [Ctrl-F9] siten, että yrität lisätä jotakin tietoa. Kun ohjelma pysähtyy, aja askel kerrallaan joko suorittaen tai ylittäen aliohjelmat. (Huom! Koska mjonot.c tiedostoa ei kannata debuta, pitää sinne kuuluvat kutsut ajaa [F8]-nappulalla!). Seuraa muuttujien arvon käyttäytymistä. Kun olet "steppaillut" ulos epäilemästäsi aliohjelmasta paina taas [Ctrl-F9]. Jatka tätä kunnes "Olet saanut vian selville". Sitten voit poistaa keskeytyskohdan vastaavasti kuin sen asetitkin. Huom! Keskeytyskohtia voi olla useitakin.

    Kokeile joitakin muita kohtia vastaavasti (mielellään sellaisia, joista itse olet kiinnostunut, esimerkiksi metodia lue_tiedostosta tiedostossa kerho.cpp ).

    Näin voit aina menetellä, mikäli ohjelmastasi löytyy toimimattomia (tai epäilyttäviä) kohtia jonkin pitkän rämeikön takaa. Muista sitten joskus lopuksi myös poistella keskeytyskohdat!

lue_jono_oletus

HUOM!: Kannattaa ehkä tehdä seuraavna kohdan (string-luokka) ohjelma

Kokeillaan lue_jono_oletus aliohjelman toimintaa.
    Sulje kaikki ikkunat.

    Aloita uusi projekti nimellä lue.

    Lisää projekti-ikkunaan vielä kirjoittamaton tiedosto lue.c.

    Lisää myös n:\kurssit\cpp\ali\mjonot.c (voit myös kopioida aliohjelmat omaan hakemistoosi ja laittaa vain mjonot.c).

    Kirjoita seuraava pääohjelma tiedostoon lue.c:
    #include <stdio.h>
    #include "mjonot.h"
    

    int main(void) { char nimi[40]="Minä"; int paluu;

    paluu = lue_jono_oletus("Anna nimesi",17,33,nimi,nimi,sizeof(nimi));

    if (paluu == OLETUS) printf("Et muuttanut nimeä!\n"); printf("Nimesi oli %s\n",nimi);

    return 0; }


    Jos ohjelma ei käänny, niin tarkista että kohdan Options|Directories kohdassa Include Directories lukee:
    ....INCLUDE;N:\KURSSIT\CPP\ALI
    
    Jollei lue, niin lisää viimeinen hakemisto.

    Kokeile käyttää ohjelmaa siten, että kirjoitat joskus uuden nimen ja joskus vastaat pelkän [RET].

    Muuta ohjelmaa siten, että nimi muutetaan isoiksi kirjaimiksi ennen tulostamista ja kokeile.

    Muuta ohjelmaa siten, että nimi muutetaan alku-isoiksi kirjaimiksi ennen tulostamista ja kokeile.

    Muuta ohjelmaa siten, että kaikki turhat välilyönnit poistetaan ja kokeile.

    Kokeile mitä merkitystä on parametrien 17 ja 33 muuttamisella.

    Kokeile korvata ensimmäinen kutsussa oleva nimi-parametri vakiolla "Kalle".

    Poistu käyttöjärjestelmään ja kopioi hakemiston n:\kurssit\cpp\ali sisältö omaan hakemistoosi.

    Käynnistä jälleen Borland-C ja luo nyt uusi projekti nimelle lue2.

    Lisää projektiin tiedostot lue.c ja mjonot.c (ei tarvitse nyt polkua).

    Käännä ohjelma. Siis aliohjelmakirjastot voi joko kopioida omaan hakemistoon tai käyttää tietystä hakemistosta. Levyaseman nimeä ei kuitenkaan mielellään saa laittaa polkuihin!


string-luokka

    Tee uusi projekti luecpp, lisää siihen lue.cpp:
    #include <iostream.h>
    #include "mjonotpp.h"
    

    int main(void) { string nimi("Minä"); int paluu; paluu = lue_jono_oletus("Anna nimesi",17,33,nimi);

    if (paluu == OLETUS) cout << "Et muuttanut nimeä!\n"; cout << "Nimesi oli " << nimi << endl;

    return 0; }


    Lisää vielä projektiin mjonot.c ja mjonotpp.cpp (sekä string.cpp jos käytät jotakin vanhempaa kääntäjää < BC 4.5?)

    Muuten tee samat tehtävät kuin edellisessä kohdassa.

pvm

    Mene komentoriville ja kopioi hakemiston n:\kurssit\cpp\demot sisältö omaan hakemistoosi.

    Käynnistä Borland-C ja luo projekti nimeltä pvm_test. Lisää projektiin tiedostot t_pvm.c ja pvm.c.

    Katso, että tiedosto t_pvm.c on seuraavanlainen seuraavasti (korjaa jollei ole):
    #include <stdio.h>
    #include "pvm.h"
    ...
    int main(void)
    {
    /*  tayta_kk_1(KK_1); */
    

    testaa_kv(); /* testaa_pvm(); */

    return 0; }


    Kokeile ajaa ohjelmaa.

    Korjaa tarvittaessa tiedostoa pvm.c.

    Kokeile tehdä demotehtäviä ja tee niitäkin varten jonkinlainen testipääohjelma.

avustus (help)

    Lue avustuksen käyttämisen ohjeet tiedostosta help.h.

    Tee pieni (alle 10 riviä) testipääohjelma avustuksen testaamiseksi.

    Kirjoita pieni (muutama aihe) avustustiedosto.

    Kokeile ohjelman toimintaa.

Leikkaaminen (cut tai copy) ja liimaaminen (paste)

Aikaisemmissa pääteohjauksessa opeteltiin merkitsemään lohkoja ja siirtämään tai kopioimaan niitä paikasta toiseen.

Helpointahan tämä oli, mikäli käytössä on editori, jolla voidaan pitää useita ikkunoita auki yhtäaikaa.

Tällöin toimittiin seuraavasti:
    Siirry ikkunaan josta haluat leikata.

    Maalaa alue:
      joko alueen alkuun ja [Ctrl-K]B ja alueen loppuun [Ctrl-K]K
      tai alueen alkuun tai loppuun, paina ja pidä [Shift] pohjassa ja siirry alueen toiseen kulmaan

      tai maalaa hiirellä siirtymällä alkuun ja painamalla ja pitämällä näppäin pohjassa siirrytään alueen toiseen kulmaan

    laita lohko leikekirjaan
    [Ctrl-Ins] = kopioi
    [Shift-Del] = leikkaa

    Siirry ikkunaan (tai paikkaan) jonne haluat tuloksen.

    "Liimaa" leikekirjan sisältö haluttuun paikkaan [Shift-Ins]

Mikäli leikekirjaa tai useita ikkunoita ei ole, voidaan aina menetellä seuraavasti:
    Siirry tiedostoon josta haluat palan.

    Merkitse lohko.

    Kirjoita lohko levylle vaikkapa nimelle A. ([Ctrl-K]WA.[RET])

    Siirry tiedostoon jonne haluat tuloksen.

    Lue tiedosto A. levyltä ([Ctrl-K]RA.[RET]).

Samassa tiedostossahan lohko pystyttiin siirtämään tai kopioimaan:
    Merkitse lohko

    Laita lohko leikekirjaan (kopioi tai leikkaa)

    Siirry kohtaan johon haluat lohkon.

    Paina [Shift-Ins] (liimaa).

Tietysti siirto tai kopiointi käy hienosti myös leikekirjan kautta, mikäli leikekirja on olemassa. Leikekirjan käytössä on vielä se etu, että leikekirjan sisältö säilyy muuttumattomana kunnes sinne laitetaan jotain uudestaan.

Merkitse rivin alusta seuraavan rivin alkuun

Yleensä lohkot kannattaa merkitä siten, että alkupaikka merkitään RIVIN ALKUUN ([Home]) ja loppupaikka sen rivin alkuun, jota ei enää lohkoon haluta. Näin merkittynä lohko sisältää mukavasti kaikki tarvittavat rivinsiirrotkin!

Tietysti jos haluat leikata vaan osan riviä (esimerkiksi inhottavan muuttujan nimen), niin silloin merkitään tasan haluttu osa!
@comment(

Oma harjoitustyö

Tee omaa harjoitustyötäsi ja kokeile sen kääntämistä yms. Voit (JA KANNATTAA) leikkailla palasia malliohjelmasta!

Muista edetä vain niin pieni palanen kerrallaan, että se voidaan heti testata toimivaksi.
)