Tutnew työkalu C++:n dynaamisen muistinhallinnan testaamiseen
|
|
- Juha-Pekka Jokinen
- 6 vuotta sitten
- Katselukertoja:
Transkriptio
1 Tutnew työkalu C++:n dynaamisen muistinhallinnan testaamiseen Matti Rintala 29. lokakuuta Johdanto C++ on teollisuudessa erittäin suosittu ohjelmointikieli ja siitä johtuen sitä käytetään myös opetuskielenä suuressa osassa oppilaitoksia. C++ on erittäin tehokas ja varsin monikäyttöinen ohjelmointikieli, mutta sitä ei ole suunniteltu opetuskäyttöön. Tästä johtuen kieli sisältää monia ansoja ja vaaroja, jotka aiheuttavat ylimääräistä päänvaivaa erityisesti aloittelevalle ohjelmoijalle, jolla usein ei ole käsitystä siitä, mistä ja miten ohjelmassa olevaa virhettä kannattaisi etsiä. Toinen ongelma ohjelmoinnin opetuksessa on, että opetuksessa yleensä korostetaan, että ohjelmien tulisi pystyä reagoimaan järkevästi muistin loppumiseen. Tätä on kuitenkin erittäin vaikea testata, koska nykyisissä tietokoneissa muistia on niin paljon, että sen loppuminen on erittäin epätodennäköistä ja usein vaikea saada aikaan. Tutnew on Tampereen teknillisellä korkeakoululla käytössä oleva kirjasto, joka auttaa ohjelmoijaa C++:n dynaamisen muistinhallinnan virheiden huomaamisessa ja paikantamisessa. Lisäksi Tutnew antaa mahdollisuuden simuloida koneen muistin loppumista sekä saada tilastotietoa dynaamisen muistin käytöstä. Tutnew ei pyri korjaamaan muistinhallinan virheitä, vaan mahdollisuuksien mukaan antamaan ohjelmoijalle selkeitä virheilmoituksia, jotka kertovat mitä ja missä on mennyt pieleen. Tutnew pyrkii lisäämään mahdollisuutta, että muistinhallinnan kannalta virheellinen ohjelma toimii virheellisesti ja kaatuu mahdollisimman pian muistinhallintavirheen jälkeen. Koska Tutnew on tarkoitettu myös ohjelmoinnin alkeisopetukseen, on sen käyttö mahdollisimman läpinäkyvää ja helppoa. Käyttääkseen Tutnew tä ohjelmoijan täytyy vain lisätä yksi #include-komento jokaiseen kooditiedostoonsa sekä käskeä kääntäjää linkittämään Tutnew-kirjasto mukaan suoritettavaan ohjelmaan. Tutnew-kirjastoa on käytetty ja testattu TTKK:lla muutaman vuoden ajan ohjelmoinnin perusopetuksessa, jossa siitä on saatu hyviä tuloksia. Tutnew, sen dokumentaatio ja muuta informaatiota on saatavilla sivulta ~bitti/tutnew/ siitä voi kysellä myös tämän artikkelin kirjoittajalta (matti.rintala@iki.fi). 2 C++ ja dynaaminen muistinhallinta Ohjelmoijan kannalta C++-kielessä muistinhallinta jakautuu kahteen osaan. Kaikkien nimettyjen muuttujien sekä kääntäjän itsensä automaattisesti tuottamien väliaikaisolioiden elinkaari määräytyy ohjelman rakenteesta ja ne tuhotaan automaattisesti. Sen sijaan dynaamisesti new-operaattorilla luotujen olioiden elinkaari ei ole käännösaikaisesti määrätty, ja ohjelmoijan täytyy tuhota ne erikseen operaattorilla delete jossain ohjelman vaiheessa. Jos dynaamisesti varattua muistia ei vapauteta missään vaiheessa, tapahtuu muistivuoto. C++-standardi takaa kuitenkin, että kaikki ohjelman dynaamisesti varaama muisti vapautetaan, kun ohjelman suoritus päättyy. Tämän vuoksi dynaamisen muistin vuotoihin ei aina suhtauduta kovin vakavasti. 1 Tämä artikkeli julkaisun [Rintala, 2002] uudelleentaitettu versio. 1
2 Muistivuodot ovat kuitenkin vakava asia ainakin kahdesta syystä. Jos ohjelman suoritus kestää kauan, muistivuodot kuluttavat koneen muistiresursseja. Tämä saattaa aiheuttaa joko muistin ennenaikaisen loppumisen tai ohjelman hidastumisen, kun virtuaalimuistijärjestelmä alkaa käyttää kiintolevyä muistin korvikkeena. Toinen muistivuotojen vaikutus on, että vaikka ohjelman dynaamisesti varaama muisti vapautetaankin ohjelman lopussa, ei kyseiseen muistiin luotujen olioiden purkaja-jäsenfunktioita (engl. destructor) suoriteta. Purkajat puolestaan saattavat sisältää tärkeää toiminnallisuutta kuten muiden resurssien vapautuksia, tiedon päivittämistä kiintolevylle tai tietokantoihin yms. Tämän vuoksi muistivuodot saattavat aiheuttaa muita resurssivuotoja tai ohjelman virheellisen käyttäytymisen. Tyypillisiä dynaamisen muistinhallinnan virheitä ovat myös muistin vapauttaminen useaan kertaan ja muistialueen käyttäminen vielä sen vapauttamisen jälkeen. Näiden virheiden vaikutukset ohjelman toimintaan ovat C++-kielessä määrittelemättömiä. Tyypillisesti ne aiheuttavat joko ohjelman suorituksen keskeytymisen enemmän tai vähemmän selkeään virheilmoitukseen tai ohjelman muistin sotkeentumisen, mikä saattaa aiheuttaa ohjelman virheellisen käyttäytymisen. Monissa ohjelmointikielissä dynaamisen muistinhallinnan virheitä on pyritty estämään erilaisten muistin roskienkeruujärjestelmien (garbage collection) avulla. Nämä vapauttavat ohjelmoijan enemmän tai vähemmän dynaamisen muistinhallinnan suunnittelusta, mikä tietysti helpottaa erityisesti ohjelmoinnin alkeiden opiskelua. C++ ei kuitenkaan sisällä muistin roskienkeruuta. Kielen kehittäjät ovat ilmoittaneet syyksi tähän sen, että C++ on kehitetty erityisesti ohjelmien tehokkuutta silmällä pitäen [Stroustrup, 1994, luku 10.7]. Lisäksi automaattinen roskienkeruu sopii huonosti tilanteisiin, joissa olioiden tuhoutumishetkellä on väliä esimerkiksi sen takia, että olion siivoustoimenpiteet pitää suorittaa tiettyyn aikaan. Tämä on mahdollista, jos siivoustoimenpiteet sisältävät muiden resurssien vapautuksia, luku/tulostus-operaatioita tai käyttöliittymään liittyviä toimenpiteitä [Rintala ja Jokinen, 2000, luku ]. Ohjelman dynaamisessa muistinhallinnassa olevat virheet ovat erityisen hankalia paikantaa. Dynaamisen muistin vapauttamatta jättäminen aiheuttaa muistivuotoja, jotka jäävät yleensä huomaamatta, koska ohjelman muisti vapautetaan kuitenkin ohjelman päättyessä. Niinpä muistivuodot ovat varsin tavallisia jopa tuotantokäytössä olevissa ohjelmissa. Vapautetun muistin käyttäminen vapautuksen jälkeen aiheuttaa myös vaikeita virheitä. Näissä tapauksissa ohjelma saattaa toimia näennäisesti oikein pitkäänkin, kunnes jossain vaiheessa ohjelma ottaa jo vapautetun muistialueen uudelleen käyttöön. Tällöin sama muistialue kuuluu näennäisesti yhtaikaa sekä jo vapautettuun että uuteen olioon, jolloin muistiin yhden olion kautta tehdyt muutokset sotkevat toisen olion muistin. Tällaiset virheet eivät välttämättä edes esiinny joka kerralla, koska muistialueiden uudelleenkäyttämiseen saattavat vaikuttaa koneen fyysisen muistin määrä sekä jopa se, paljonko muita ohjelmia koneessa on käynnissä. Dynaamisen muistinhallinnan testaamiseen on olemassa useita kaupallisia työkaluja, mutta ne ovat yleensä varsin kalliita ja toimivat vain tietyissä käyttöjärjestelmissä ja kääntäjissä. Lisäksi tällaisten työkalujen käyttö vaatii usein sen verran C++-kielen ja ohjelmien testauksen ymmärtämistä, että ne sopivat huonosti ohjelmoinnin alkeisopetukseen. Tutnew n käyttö Tutnew n käyttö on varsin yksinkertaista. Normaalisti siihen liittyy vain kaksi asiaa: Ohjelmassa jokaisen dynaamista muistia käyttävän kooditiedoston tulee lukea sisään Tutnew n otsikkotiedosto. Tämä tapahtuu komennolla #include <tutnew>. Tämän komennon tulee olla tiedostossa heti kaikkien muiden #include-komentojen jälkeen. 1 Lopullista ajettavaa ohjelmabinaaria linkatessa tulee ohjelmaan linkata mukaan Tutnew n kirjasto. Esimerkiksi GCC:n tapauksessa tämä tapahtuu lisäämällä linkityskomennon loppuun optio -ltutnew, jos Tutnew on asennettu systeemikirjastoksi. 1 Syynä tähän vaatimukseen on, että Tutnew määrittelee avainsanat new ja delete makroiksi. 2
3 Edellä mainittuja asioita lukuunottamatta ohjelmaan ei yleensä tarvitse tehdä mitään muutoksia. Listaus 1 sisältää kaksi esimerkkitiedostoa sekä komennot niiden kääntämiseen GCC:llä (käännöskomennoissa on myös mukana muita käännösoptioita, jotka tekevät lisätarkistuksia ohjelmasta). Kun ohjelma on käännetty, valvoo Tutnew automaattisesti ohjelman dynaamista muistinhallintaa ja virheen sattuessa antaa virheilmoituksen. Tutnew n toimintaan voi vaikuttaa käyttäjän valinnan mukaan joko ympäristömuuttujien tai esikääntäjäsymbolien avulla, mutta niitä ei käsitellä tarkemmin tässä artikkelissa. Tutnew on toteutettu C++:n kirjastona, joka on kirjoitettu kielen nykyisen standardin ISO [ISO, 1998] mukaisesti. Se käyttää dynaamisen muistinhallinan testaamiseen vain kielen omia mekanismeja. Niinpä Tutnew pitäisi olla mahdollista kääntää mihin tahansa riittävän uuteen kääntäjäympäristöön käyttöjärjestelmästä ja kääntäjän valmistajasta riippumatta. Tutnew n kehitys on tehty GCC-kääntäjällä [GNU, 2001a], ja se toimii ainakin kääntäjän versioilla , ja.0. Käännös- ja testausympäristöinä ovat olleet Redhat Linux ja Sun Microsystemsin Solariksen eri versiot. Näissä ympäristöissä Tutnew on toiminut erinomaisesti. Tutnew n aikaisempia versioita on käytetty myös Windows-ympäristössä djgpp- ja Borlandkääntäjissä. Uudempia versioita ei enää ole testattu noissa ympäristöissä, mutta tiedossa ei ole mitään syytä, miksei Tutnew toimisi niissäkin ympäristöissä. Artikkelin kirjoittaja ottaa mielellään vastaan kokemuksia Tutnew stä eri ympäristöissä. 4 Tutnew n havaitsemat virheet Seuraavassa on lueteltu kaikki ne virheet, jotka Tutnew pystyy joko havaitsemaan ja raportoimaan tai joiden sattuessa Tutnew pyrkii C++-kielen rajoissa sotkemaan ohjelman toiminnan niin paljon, että virhe ilmenisi mahdollisimman aikaisessa vaiheessa. Tämän artikkelin esimerkeissä Tutnew on konfiguroitu niin, että sen virheilmoitukset tulostuvat suomen kielellä. Oletusarvoisesti Tutnew n tulostuskieli on englanti. Lisäksi kunkin ohjelmaesimerkin koodin oletetaan sijaitsevan tiedostossa nimeltä virheet.cc. 4.1 Muistivuodot Muistivuoto tapahtuu, kun ohjelmoija varaa ohjelmassa muistia dynaamisesti new llä mutta ei vapauta sitä. Tällaiset virheet Tutnew pystyy havaitsemaan ja raportoimaan luonnollisesti vasta ohjelman lopussa. Kun Tutnew havaitsee ohjelman lopussa muistivuodon, se raportoi vapauttamatta jätetyn muistialueen koon sekä sen, millä rivillä ja missä tiedostossa kyseinen muistialue varattiin esimerkki.cc #include <iostream> 2 #include <string> #include "varaus.hh" 4 #include <tutnew> 5 6 int main() 7 { 8 string s("testi"); 9 char* teksti = varaa teksti(s); 10 std::cout << teksti << std::endl; 11 vapauta teksti(teksti); 12 } Käännöskomennot g++ -Wall -W -pedantic -ansi -c esimerkki.cc g++ -Wall -W -pedantic -ansi -o esimerkki esimerkki.o -ltutnew LISTAUS 1: Esimerkki Tutnew n käytöstä
4 Ikävä kyllä Tutnew ei kykene ilmoittamaan sitä, minkä tyyppinen olio muistialueella on aikanaan sijainnut. Useimmissa ohjelmissa yhdellä koodirivillä on kuitenkin vain yksi new-komento, joten rivinumero yksilöi vuodon yksikäsitteisesti. Listauksessa 2 on lyhyt ohjelma, jossa on muistivuoto. Kun tämä ohjelma käännetään ja linkataan Tutnew n kanssa, ohjelma tulostaa ajettaessa seuraavaa: Loppu Tutnew: seuraavia muistilohkoja ei ole vapautettu: Tutnew: 4 tavu(a) varattu new llä rivillä 11 tiedostossa virheet.cc Vaikka tässä esimerkissä Tutnew n virheilmoitus riittää muistivuodon löytämiseen, on todellisissa ohjelmissa tilanne usein hankalampi. Sama new-komento voidaan suorittaa ohjelmassa useita kertoja, joten virheilmoitus ei vielä yksin kerro, milloin muistivuodon aiheuttanut muistialue on varattu eikä sitä, missä se olisi pitänyt vapauttaa. 4.2 Muistin vapauttaminen useamman kerran Tyypillinen vastareaktio muistivuotojen vaaraan on, että ohjelmoija vapauttaa osoittimien päässä olevaa muistia suunnittelematta ohjelman muistinhallintaa mitenkään erityisesti. Tällöin tavallinen virhe on, että sama muistialue vapautetaan useassa ohjelman kohdassa eri osoittimia käyttäen. Tutnew pystyy havaitsemaan virheellisen tuhoamisyrityksen ja antamaan siitä virheilmoituksen heti sen sattuessa. Virheilmoitus kertoo, missä muistialue on varattu, missä se on vapautettu ensimmäisen kerran ja missä sitä yritetään vapauttaa uudelleen. Tällaisessa tilanteessa Tutnew normaalisti keskeyttää ohjelman suorituksen, mutta tähän voi ohjelmoija itse vaikuttaa. Listaus näyttää listauksen 2 ohjelman korjattuna niin, että aiemmin vapauttamatta jätetty muisti yritetään vapauttaa kahteen kertaan. Ohjelman tulostus on seuraava: Tutnew: delete - yritetty uudelleenvapauttaa muistia rivillä 15 tiedostossa virheet.cc. (muisti varattu new llä rivillä 12 tiedostossa virheet.cc ja vapautettu deletellä rivillä 7 tiedostossa virheet.cc) 4. Muistin käyttö tuhoamisen jälkeen Useaan kertaan vapauttamisen lisäksi yleinen muistinhallintaongelma on, että dynaamisesti varattu muisti vapautetaan liian aikaisin ja sitä käytetään vielä vapauttamisen jälkeen (tämä ongelma esiintyy myös staattisesti varatun muistin yhteydessä, mutta sille Tutnew ei kykene 1 #include <iostream> 2 #include <tutnew> 4 void tulosta(int* p) 5 { 6 std::cout << *p << std::endl; 7 } 8 9 int main() 10 { 11 int* p = new int; 12 *p = ; 1 tulosta(p); 14 std::cout << "Loppu" << std::endl; 15 return 0; 16 } LISTAUS 2: Muistivuoto 4
5 1 #include <iostream> 2 #include <tutnew> 4 void tulosta(int* p) 5 { 6 std::cout << *p << std::endl; 7 delete p; 8 } 9 10 int main() 11 { 12 int* p = new int; 1 *p = ; 14 tulosta(p); 15 delete p; 16 std::cout << "Loppu" << std::endl; 17 return 0; 18 } LISTAUS : Muistin vapauttaminen kahdesti tekemään mitään). Koska Tutnew on vain kirjasto, sen mahdollisuudet havaita jo vapautettuun muistiin tapahtuvat viittaukset ovat rajalliset. Kun Tutnew tä käyttävä ohjelma vapauttaa dynaamisesti varaamansa muistin, Tutnew ei todellisuudessa vapauta kyseistä muistialuetta vaan täyttää sen testibittikuviolla ja lisää sen omaan tarkkailukirjanpitoonsa. Tämä auttaa jo vapautetun muistin käytön havaitsemiseen seuraavasti: Jos ohjelma lukee vapautettua muistialuetta, se ei enää löydä sieltä itse kirjoittamaansa dataa vaan Tutnew n testikuvion. 2 Tällöin ohjelma todennäköisesti toimii väärin jo testivaiheessa, ja virhe voidaan etsiä ja korjata. Ohjelman lopussa Tutnew käy läpi kaikki vapautetut muistialueet ja tarkastaa, että testikuvio on ehjä. Jos ohjelma on kirjoittanut jo vapautettuun muistialueeseen, muuttaa kirjoitus erittäin todennäköisesti testikuviota. Tällöin Tutnew huomaa muutoksen ja antaa virheilmoituksen. Valitettavasti molemmissa edellisissä tapauksissa Tutnew kykenee vain edesauttamaan virheen olemassaolon havaitsemista. Sen sijaan virheen aiheuttaneen lukemisen tai kirjoittamisen sijainnista ohjelmassa Tutnew ei pysty kertomaan mitään, vaan virhe on paikannettava perinteisin testauskeinoin. Listauksen 4 ohjelma vapauttaa varaamansa muistin jo rivillä 9, mutta lukee muistialueen sisällön vielä rivillä 10 ja muuttaa muistialuetta rivillä 11. Ohjelma tulostaa ajettaessa seuraavaa: Tutnew: vapautettu muisti sotkettu vapautuksen jälkeen: Tutnew: 4 tavu(a) varattu new llä rivillä 6 tiedostossa virheet.cc ja vapautettu rivillä 9 tiedostossa virheet.cc Kuten tulostuksesta näkee, aiempi muistialueen sisältö 5 on vapautuksen yhteydessä muuttunut selvästi virheelliseksi arvoksi (tämä arvo voi vaihdella ajokerrasta toiseen). Lisäksi Tutnew raportoi muistin virheellisestä muuttamisesta ja kertoo, missä muisti on varattu ja vapautettu. Vapautetun muistin tarkastaminen lisää ohjelman todellista muistinkulutusta, koska Tutnew ei todellisuudessa voi vapauttaa muistia. Lisäksi testikuvioiden tuottaminen ja tutkiminen ohjelman lopussa hidastaa ohjelmaa. Vapautetun muistin käytön testin voi myös halutessaan kytkeä pois päältä. 2 Tämä muistialueen sotkeminen on täysin C++-standardin mukaista, koska vapautettuun muistialueeseen viittaaminen aiheuttaa joka tapauksessa ohjelman määrittelemättömän toiminnon. 5
6 1 #include <iostream> 2 #include <tutnew> 4 int main() 5 { 6 int* p = new int; 7 *p = 5; 8 std::cout << *p << std::endl; 9 delete p; 10 std::cout << *p << std::endl; 11 *p = 8; 12 return 0; 1 } LISTAUS 4: Muistin käyttäminen vapautuksen jälkeen 4.4 Alustamattoman muistin käyttäminen Tyypillisesti monissa ympäristöissä käyttöjärjestelmä alustaa varatun dynaamisen muistin alussa täyteen nollatavuja. Tätä C++-standardi ei kuitenkaan takaa, vaan varatun muistin sisältö on alussa määrittelemätön. C++:ssa perustyyppisiä muuttujia ei automaattisesti alusteta mihinkään arvoon, ja lisäksi nollaa täynnä oleva bittikuvio vastaa useimmissa konearkkitehtuureissa niin kokonaislukua 0, liukulukua 0.0 ja tyhjää NULL-osoitinta. Niinpä alustamattomat muuttujat C++:ssa saavat usein sattumalta arvokseen nolla, mikä tekee niiden havaitsemisen hankalaksi. Tutnew pyrkii helpottamaan alustamattomien muuttujien löytymistä täyttämällä kaikki varatut muistialueet alussa samalla testikuviolla, jota se käyttää vapautetun muistin sotkemiseen. Tämän seurauksena dynaamisessa muistissa olevat alustamattomat muuttujat eivät saakaan arvokseen nollaa, vaan jonkin siitä poikkeavan (todennäköisesti hyvin suuren) arvon. Tämä aiheuttaa suurella todennäköisyydellä ohjelman toiminnassa virheitä, joten virhettä tiedetään etsiä. Samoin kuin vapautetun muistin sotkemisessa Tutnew voi vain pyrkiä saamaan alustamattomia muuttujia käyttävän ohjelman toimimaan väärin. Se ei pysty antamaan tietoa siitä, missä alustaminen on unohtunut. Samoin Tutnew pystyy vaikuttamaan vain dynaamisessa muistissa oleviin alustamattomiin muuttujiin. 4.5 Olemattoman muistin vapauttaminen C++:ssa taulukoita on tyypillistä käydä läpi osoitinaritmetiikkaa käyttäen. Tällöin saattaa käydä niin, että dynaamisesti varattu taulukko yritetään vapauttaa käyttäen osoitinta, joka ei enää osoitakaan taulukon alkuun. Tällöin ohjelman toiminta on määrittelemätön. Samanlainen virhe saattaa syntyä, jos deletelle annetaan alustamaton osoitin tai osoitin, jonka sisältö on aiemman muistinhallintavirheen vuoksi sotkeentunut. Kolmas tyypillinen tilanne on, että deletellä yritetään osoittimen kautta vapauttaa muuttujaa, joka ei ole new llä varattu. Tutnew tarkastaa aina, että deletelle annettu osoitin todella osoittaa jonkin dynaamisesti varatun muistialueen alkuun. Mikäli näin ei ole, antaa Tutnew virheilmoituksen, kuten listauksen 5 tulostus osoittaa: Tutnew: delete[] - yritetty vapauttaa varaamatonta muistia rivillä 7 tiedostossa virheet.cc. 4.6 Dynaamisen taulukon indeksointivirheet Taulukoiden yli- tai ali-indeksointi on tyypillinen ohjelmointivirhe C++:ssa (ja muissakin ohjelmointikielissä). Ikävä kyllä C++-standardi ei määrittele, mitä tapahtuu jos taulukkoa indeksoidaan väärin. Tyypilliset C++ kääntäjät tuottavat koodia, jossa ohjelma yksinkertaisesti lukee 6
7 1 #include <tutnew> 2 int main() 4 { 5 int* p = new int[10]; 6 *(++p) = 5; // p ei enää osoita alkuun 7 delete[ ] p; 8 return 0; 9 } LISTAUS 5: Varaamattoman muistin vapauttaminen muistia taulukon muistialueen jommalta kummalta puolelta. Samanlainen virhe tapahtuu, jos taulukkoa käydään läpi osoitinaritmetiikan avulla, ja osoitin pääsee liikkumaan taulukon ulkopuolelle. Koska nämä virheet eivät suoranaisesti liity dynaamiseen muistinhallintaan, ei Tutnew pysty huomaamaan niitä kovin hyvin. Tutnew pyrkii kuitenkin helpottamaan indeksointivirheiden löytämistä varaamalla pyydetyn muistialueen molemmille puolelle pienen puskurialueen muistia. Tutnew täyttää tämän alueen jo varauksen yhteydessä testikuviolla. Kuten vapautetun muistin käytössäkin, tästä on kaksi hyötyä: Jos ohjelma virheellisesti viittaa taulukon ulkopuolelle indeksointivirheen tai osoitinaritmetiikan takia, ei luettu arvo ainakaan ole nolla vaan testikuvion tuottamaa puppua. Tutnew tarkastaa testikuvion eheyden muistin vapauttamisen ja ohjelman loppumisen yhteydessä. Jos ohjelma on kirjoittanut taulukon ulkopuolelle ja sotkenut testikuvion, antaa Tutnew virheilmoituksen. Seuraavassa on listauksessa 6 näkyvän ohjelman tulostus. Siitä näkyy puskurialueen ja testikuvion vaikutus sekä lukemisen että kirjoittamisen yhteydessä: Tutnew: delete[] - muisti sotkeentunut varatun muistilohkon ympärillä. (muisti varattu new[] llä rivillä 6 tiedostossa virheet.cc delete[] tapahtui rivillä 11 tiedostossa virheet.cc) Yli- ja ali-indeksoinnin havaitsemisessa on sama ikävä puoli kuin vapautetun muistin käytössä Tutnew ei pysty kertomaan, missä päin ohjelmaa virhe on sattunut. Lisäksi on huomattava, että Tutnew n käyttämä puskurialue ei ole kovin suuri (oletusarvoisesti 16 tavua muistialueen molemmilla puolilla), joten suuret yli- ja ali-indeksoinnit jäävät Tutnew ltä huomaamatta. 1 #include <iostream> 2 #include <tutnew> 4 int main() 5 { 6 int* p = new int[10]; 7 int* q = p; 8 p[5] = ; // Ok 9 std::cout << p[10] << std::endl; // Virhe 10 p[10] = 8; // Virhe 11 delete[ ] p; 12 *(--q) = 8; // Tuplavirhe 1 return 0; 14 } LISTAUS 6: Dynaamisen taulukon yli-indeksointi 7
8 4.7 Väärä tuhoamistapa C++ vaatii, että dynaamisesti varatut yksittäiset oliot pitää tuhota komennolla delete ja dynaamisesti varatut taulukot komennolla delete[ ]. Ikävä kyllä kääntäjä ei pysty varmistamaan, että näin todella tehdään, koska dynaamisesti varattua taulukkoa käsitellään täsmälleen samantyyppisen osoittimen avulla kuin yksittäistäkin oliota. Mikäli edellämainittua C++:n sääntöä rikotaan, on ohjelman toiminta määrittelemätön. Tyypillinen virhe on taulukon vapauttaminen tavallisella deletellä. Useissa kääntäjissä C++:n perustyyppien tapauksessa virhe ei aiheuta ongelmia, mutta ohjelmoijan omien tyyppien tapauksessa virheellinen tuhoaminen aiheuttaa erilaisia ongelmia, kuten purkajien kutsumatta jättämisiä tai ohjelman kaatumisen. Tutnew tarkastaa muistin vapauttamisen yhteydessä että käytetty delete on oikein tyyppinen ja antaa virheilmoituksen, jos näin ei ole. Listaus 7 ja sen tulostus ovat esimerkkinä tästä: Tutnew: delete - yritetty vapauttaa muistia rivillä 10 tiedostossa virheet.cc, muisti varattu taulukko-new[] llä rivillä 5 tiedostossa virheet.cc. 5 Tilastotietojen tulostaminen Tutnew kerää tilastoa kaikista muistinvarauksista ja vapauttamisista. Tämän tilastotiedon voi tulostaa joko itse ohjelmasta käsin funktiokutsulla tai ohjelman lopussa sopivan esikääntäjäsymbolin tai ympäristömuuttujan määrittelemällä. Listauksessa 8 on lyhyt ohjelma, jonka päättyessä Tutnew:n muistitilasto näyttää seuraavalta: Tutnew: Käyttäjän tilastotietoja: Tutnew: onnistuneiden new-operaatioiden lukumäärä: 10 Tutnew: onnistuneiden new[]-operaatioiden lukumäärä: 1 Tutnew: epäonnistuneiden new-operaatioiden lukumäärä: 0 Tutnew: epäonnistuneiden new[]-operaatioiden lukumäärä: 0 Tutnew: delete-operaatioiden lukumäärä: 10 Tutnew: delete[]-operaatioiden lukumäärä: 1 Tutnew: varatun muistin kokonaismäärä: 80 tavu(a) Tutnew: vapautetun muistin kokonaismäärä: 80 tavu(a) Tutnew: varatun muistin maksimimäärä: 80 tavu(a) Tutnew: varatun muistin tämänhetkinen määrä: 0 tavu(a) Tilastotulostuksessaan Tutnew kertoo sekä onnistuneiden että epäonnistuneiden muistinvarausten lukumäärän (varaus voi epäonnistua esimerkiksi muistin loppumisen simuloimisen yhteydessä) sekä muistin vapautusten lukumäärät. Esimerkin tapauksessa yhteenlaskettu 80 tavua on varattu ohjelman riveillä 6 ja 14. Lisäksi tulostuksesta käy ilmi kaikkien muistinvarausten yhteenlaskettu muistimäärä ja sama vapautuksille. Tutnew pitää kirjaa myös ohjelman ajon 1 #include <tutnew> 2 int main() 4 { 5 char* p = new char[20]; // Varataan taulukko 6 for (unsigned int i = 0; i < 20; ++i) 7 { 8 p[i] = static cast<char>( A + i); 9 } 10 delete p; // Tuhotaan yksittäisenä 11 return 0; 12 } LISTAUS 7: Väärä new n ja deleten yhdistäminen 8
9 1 #include <vector> 2 #include <tutnew> 4 int main() 5 { 6 int* t = new int[10]; 7 for (unsigned int i = 0; i < 10; ++i) 8 { 9 t[i] = i; 10 } 11 std::vector<int*> v; 12 for (unsigned int i = 0; i < 10; ++i) 1 { 14 v.push back(new int); // Loppuun uusi alkio 15 *v[i] = t[i]; 16 } 17 for (unsigned int i = 0; i < 10; ++i) 18 { 19 delete v.back(); v.back() = 0; 20 v.pop back(); 21 } 22 delete[ ] t; 2 } LISTAUS 8: Useita muistivarauksia tekevä ohjelma aikana kerrallaan varattuna olleen muistin maksimimäärästä ja senhetkisestä varatun muistin määrästä. Jos käytetyn kääntäjän kirjastot ovat standardin mukaisia, tulostaa Tutnew myös tilaston kirjastojen (ja muiden Tutnew tä käyttämättömien ohjelman osien) dynaamisesta muistinkulutuksesta erikseen. Näitä lukuja ei ole sisällytetty käyttäjän tilastoon, vaan se sisältää ainoastaan ne muistinvaraukset, jotka on tehty Tutnew tä käyttävissä kooditiedostoissa. Valitettavasti nykyiset GCC:n (2.95.x ja.0) kirjastot perustuvat Silicon Graphicsin STL-toteutukseen [SGI, 2001], jonka muistinvaraus on epästandardi, eikä Tutnew näin ollen voi pitää siitä tilastoa. Tämä vika tullaan ilmeisesti korjaamaan tulevissa versioissa. [GNU, 2001b] 6 Muistin loppumisen simulointi Lähes kaikkialla ohjelmoinnin perusopetuksessa korostetaan, että dynaamista muistia varattaessa tulee varautua siihen, että muistia ei saadakaan varattua. Usein muistin loppumiseen varautuminen jää kuitenkin teorian asteelle. Ohjelman testaaminen tämän virhetyypin osalta on hankalaa, koska nykyisissä tietokoneissa on yleensä niin paljon muistia (sekä fyysistä muistia että virtuaalimuistia), että sen kuluttaminen loppuun on vaikeaa. Lisäksi muistin todella loppuessa myös testaustyökalujen yms. käyttö voi olla vaikeaa. Tämän vuoksi Tutnew tarjoaa mahdollisuuden rajoittaa ohjelman käytössä olevaa dynaamisen muistin määrää ja näin simuloida muistin loppumista. Muistin loppumiseen reagoimiseen löytyy ohjeita esim. kirjasta Effective C++ [Meyers, 1998, Item 7]. 6.1 Dynaamisen muistin määrän rajoittaminen Ehkä tavallisin tapa simuloida muistin loppumista Tutnew ssä on rajoittaa ohjelman käytössä olevan dynaamisen muistin määrä sopivaan pieneen arvoon. Tämän voi tehdä joko ympäristömuuttujalla, käännösaikana tai kesken ohjelman suorituksen ohjelmasta käsin. Rajoituksen voi 9
10 kytkeä joko vain Tutnew n alaisuudessa tehdyille muistinvarauksille tai koko ohjelman dynaamiselle muistille. Kun muisti loppuu, tulostaa Tutnew oletusarvoisesti varoituksen, jossa se kertoo, minkä new-operaation muistinvaraus epäonnistui. Lisäksi Tutnew tulostaa testauksen helpottamiseksi muistitilaston (ks. kohta 5). Tämän jälkeen ohjelman suoritus jatkuu C++:n sääntöjen mukaan ikään kuin koneen muisti olisi loppunut. Jos varoitusta muistin loppumisesta ei haluta, sen voi kytkeä pois päältä. Listaus 9 sisältää koodin, jonka muistin loppumiseen varautumista halutaan testata. Kun testiympäristössä dynaamisen muistin määrä rajoitettiin yhteen kilotavuun, tulosti ohjelma seuraavaa: Tutnew: varoitus - muisti loppui new ssä rivillä 15 tiedostossa virheet.cc Tutnew: Käyttäjän tilastotietoja: Tutnew: onnistuneiden new-operaatioiden lukumäärä: Tutnew: onnistuneiden new[]-operaatioiden lukumäärä: 1 Tutnew: epäonnistuneiden new-operaatioiden lukumäärä: 1 Tutnew: epäonnistuneiden new[]-operaatioiden lukumäärä: 0 Tutnew: delete-operaatioiden lukumäärä: 0 Tutnew: delete[]-operaatioiden lukumäärä: 0 Tutnew: varatun muistin kokonaismäärä: 1024 tavu(a) Tutnew: vapautetun muistin kokonaismäärä: 0 tavu(a) Tutnew: varatun muistin maksimimäärä: 1024 tavu(a) Tutnew: varatun muistin tämänhetkinen määrä: 1024 tavu(a) Muisti loppui! Tutnew: seuraavia muistilohkoja ei ole vapautettu: Tutnew: 1000 tavu(a) varattu new[] llä rivillä 12 tiedostossa virheet.cc Ikävä kyllä Tutnew pystyy jälleen rajoittamaan vain C++:n new- ja operator new -operaattoreilla varatun muistin määrää, joten muistin loppumista GCC:n versioiden 2.95.x ja.0 STL:n sisällä ei voi simuloida. 1 #include <iostream> 2 #include <cstddef> #include <new> 4 #include <tutnew> 5 6 // HUOM! Tämän ohjelman muistin loppumisen käsittely on virheellinen! 7 int main() 8 { 9 double** p = 0; 10 try 11 { 12 p = new double*[250]; 1 for (unsigned int i=0; i<250; ++i) 14 { 15 p[i] = new double(i); 16 } 17 } 18 catch (std::bad alloc&) 19 { 20 std::cerr << "Muisti loppui!" << std::endl; 21 return EXIT FAILURE; 22 } 2 24 for (unsigned int i=0; i<250; ++i) 25 { 26 delete p[i]; p[i] = 0; 27 } 28 delete[ ] p; 29 return EXIT SUCCESS; 0 } LISTAUS 9: Ohjelma muistin loppumisen simulointiin 10
11 Tutnew: 8 tavu(a) varattu new llä rivillä 15 tiedostossa virheet.cc Tutnew: 8 tavu(a) varattu new llä rivillä 15 tiedostossa virheet.cc Tutnew: 8 tavu(a) varattu new llä rivillä 15 tiedostossa virheet.cc Kuten tulostuksesta näkee, muistin loppuminen aiheutti ohjelmaan muistivuodon. Ohjelman korjaaminen toimivaksi on mainio harjoitustehtävä sellaiselle lukijalle, joka ei ole perehtynyt paljoa virhekäsittelyn koodaamiseen. 6.2 Muistin loppuminen varausten määrän perusteella Joskus saattaa tulla tarve testata muistin loppumisen vaikutusta juuri tietyssä vaiheessa ohjelmaa. Tällöin voi olla vaikea laskea, kuinka paljon ohjelmalle on sallittava muistia, jotta se loppuisi juuri oikeassa kohtaa. Tutnew ssä on mahdollista asettaa raja myös sille, kuinka monen muistinvarauksen jälkeen muistin loppumista simuloidaan. Rajoitus kytketään päälle aiempien rajoitusten tapaan joko ympäristömuuttujalla, esikääntäjäsymbolilla tai funktiokutsulla. 6. Todennäköisyyteen perustuva muistin loppuminen Tutnew antaa myös mahdollisuuden simuloida muistin loppumista satunnaislukugeneraattorin avulla. Tällä tavoin on mahdollista testata muistin loppumista satunnaisessa ohjelman kohdassa. Muistin loppumisen todennäköisyys on mahdollista asettaa aiempien rajoitusten tapaan joko ympäristömuuttujalla, esikääntäjäsymbolilla tai funktiokutsulla. Arvona näille annetaan liukuluku väliltä Arvo 0.0 tarkoittaa, että todennäköisyyssimulointia ei käytetä, 1.0 taas että muisti loppuu joka varauksella varmasti. Täten esim. arvo 0.1 tarkoittaa, että muisti loppuu satunnaisesti keskimäärin joka kymmenennellä varauksella. Jotta tämä simulointi olisi toistettavissa, käyttää Tutnew joka ohjelman ajokerralla samoja valesatunnaislukuja, joten muisti loppuu joka kerralla samoissa kohdissa. Käytettäviä valesatunnaislukuja voi vaihtaa asettamalla satunnaislukugeneraattorin siemenluku halutuksi. Tutnew käyttää valesatunnaislukujen tuottamiseen omaa valesatunnaislukugeneraattoriaan, joten tämän ominaisuuden käyttö ei sotke minkään kirjaston tuottamia valesatunnaislukuja. 6.4 Poikkeusten vuotaminen muistin loppuessa Muistin loppumisesta aiheutuva C++:n poikkeus on tietysti syytä ottaa kiinni ohjelmassa. Jos näin ei tehdä, kutsuu ohjelma funktiota std::terminate() (tai sille funktiolla std::set terminate() määriteltyä korviketta). Tämän funktion täytyy keskeyttää ohjelman suoritus. Tutnew valvoo, että muistin loppumisesta aiheutuva poikkeus todella otetaan kiinni. Jos näin ei käy, eikä ohjelma ole määritellyt omaa korvikettaan funktiolle std::terminate(), tulostaa Tutnew virheilmoituksen. Tutnew tarkkailee myös käyttäjän std::terminate():lle mahdollisesti määrittelemää korviketta ja valvoo, että se tosiaan lopettaa ohjelman suorituksen. Jos näin ei käy, seuraa jälleen virheilmoitus. Samalla tavoin Tutnew käyttäytyy, jos muistin loppumisesta aiheutuva poikkeus ei pääse vuotamaan funktiosta ulos funktion poikkeusmääreen (exception specification) vuoksi. Tällöin ohjelma kutsuu funktiota std::unexpected() tai sille funktiolla std::set unexpected() annettua korviketta. Tutnew tarkkailee näiden käyttäytymistä samoin kuin edellä std::terminate():n tapauksessa. 6.5 Muistin loppuminen ja new_handler Ohjelma voi rekisteröidä oman funktionsa, jota kutsutaan ennen poikkeuksen heittämistä, jos dynaaminen muisti loppuu. Tämä funktio rekisteröidään funktiolla std::set new handler(), ja se voi esim. vapauttaa käyttöön lisää muistia tms. Tämä toimii edelleen Tutnew n tapauksessakin. Myös siinä tapauksessa, että muistin loppumista vain simuloidaan, kutsutaan käyttäjän rekisteröimää funktiota kuten pitääkin. 11
12 7 Kokemuksia Tutnew n käytöstä Tutnew-kirjastoa on käytetty Tampereen teknillisen korkeakoulun kurssien Ohjelmointi 1, Ohjelmointi 2, Laaja ohjelmointi ja Olio-ohjelmointi harjoitustöissä menestyksellä jo vuodesta 1997 alkaen. Tulokset sen käytöstä ovat olleet lähes yksinomaan positiivisia. Koska Tutnew n käyttäminen on helppoa, se ei ole tuottanut juurikaan vaikeuksia edes ohjelmoinnin alkeita opetteleville opiskelijoille. Tutnew on vähentänyt palautetuissa harjoitustöissä havaittujen muistivuotojen määrää oleellisesti. Tärkein hyöty Tutnew stä on kuitenkin ollut, että opiskelijat itse pääsevät testaamaan ohjelmansa muistinkäyttöä. Tällöin suurena apuna on ollut erityisesti se, että Tutnew kertoo jokaisesti vapauttamatta jääneestä muistilohkosta sen, millä rivillä ja missä tiedostossa se on varattu. Samoin hyödylliseksi on koettu se, että muistin kahteen kertaan vapauttamisesta saa virheilmoituksen, josta käy ilmi, missä muisti on alunperin vapautettu. Ehkä yllättävänäkin hyötynä Tutnew n käytöstä on ollut alustamattomien tietorakenteiden paljastuminen (kohta 4.4). Tämä ominaisuus lisättiin Tutnew hyn jälkeenpäin vain siksi, että se oli helppo toteuttaa. Se on kuitenkin osoittautunut yllättävän tarpeelliseksi ohjelmoinnin peruskursseilla, joissa dynaamisten tietorakenteiden käyttöä vasta opetellaan. Suurimpana vaikeutena Tutnew n käytössä on koettu se, että komennon #include <tutnew> täytyy olla kooditiedostoissa viimeisenä #include-komentona (ks. kohta ). Tämän noudattamatta jättämisestä seuraavista virheilmoituksista on aloittelevan ohjelmoijan vaikea päätellä, mikä on mennyt pieleen. Tätä on pyritty estämään sillä, että TTKK:lla käytössä oleva C++-tyylianalysaattori Style++ [Uimonen, 2000] varoittaa, jos Tutnew n #include puuttuu tai on väärässä paikassa. Toinen ongelmakohta on ollut, että ohjelmaa linkitettäessä ohjelmoijan täytyy muistaa linkittää mukaan myös Tutnew n kirjastot. Aloittelijoiden on toisaalta ollut hankalaa muistaa tämä, mutta toisaalta he ovat samalla oppineet valmiiden kirjastojen käyttöä käytännössä. Syksystä 2001 saakka TTKK:lla on ollut myös käytössä GCC -pohjainen kääntäjätyökalu Tutg++, joka (muiden ominaisuuksiensa lisäksi) käyttää Tutnew tä automaattisesti ilman, että ohjelmoijan täytyy tehdä mitään erityistä. Tutg++:n käyttö on vähentänyt Tutnew n käyttöön liittyviä ongelmia oleellisesti. Viitteet [GNU, 2001a] Free Software Foundation. The GCC Home Page, heinäkuu gnu.org/. [GNU, 2001b] Free Software Foundation. Gnatsweb (GCC bug report page), elokuu http: //gcc.gnu.org/cgi-bin/gnatsweb.pl, Problem Report #904. [ISO, 1998] ISO/IEC. International Standard Programming Languages C++, syyskuu [Meyers, 1996] Scott Meyers. More Effective C++. Addison-Wesley, ISBN X. Löytyy myös elektronisessa muodossa osana teosta [Meyers, 1999]. [Meyers, 1998] Scott Meyers. Effective C++ 2nd edition. Addison-Wesley, ISBN Löytyy myös elektronisessa muodossa osana teosta [Meyers, 1999]. [Meyers, 1999] Scott Meyers. Effective C++ CD. Addison-Wesley, ISBN Sisältää teokset [Meyers, 1998] ja [Meyers, 1996] elektronisessa muodossa. [Rintala ja Jokinen, 2000] Matti Rintala ja Jyke Jokinen. Olioiden ohjelmointi C++:lla. Satku- Kauppakaari, ISBN [Rintala, 2002] Matti Rintala. Tutnew työkalu C++:n dynaamisen muistinhallinnan testaamiseen. Tietojenkäsittelytiede, (17):8 2, toukokuu
13 [SGI, 2001] Silicon Graphics, Inc. Standard Template Library Programmer s Guide, heinäkuu [Stroustrup, 1994] Bjarne Stroustrup. The Design and Evolution of C++. Addison-Wesley, ISBN [Uimonen, 2000] Toni Uimonen. Tyylin automaattinen arviointi ohjelmistoissa. Diplomityö, Tampereen teknillinen korkeakoulu, Ohjelmistotekniikan laitos,
4.2 Muistinhallintaa avustava kirjasto Tutnew
48 Harjoitustöiden laadun kehittäminen [5] Edison Design Group. 2000. Compiler Front Ends for the OEM Market, http://www.edg.com/cpp.html/, 21.8.2001. [6] Henricson, M., & Nyquist E. 1992. Programming
Lisätiedot812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä
812347A Olio-ohjelmointi, 2015 syksy 2. vsk X Poikkeusten käsittelystä Sisältö 1. Yleistä poikkeusten käsittelystä 2. Poikkeuskäsittelyn perusteita C++:ssa 3. Standardissa määritellyt poikkeukset 4. Poikkeusvarmuus
Lisätiedot815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset
815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 3 vastaukset Harjoituksen aiheena ovat imperatiivisten kielten muuttujiin liittyvät kysymykset. Tehtävä 1. Määritä muuttujien max_num, lista,
LisätiedotKääntäjän virheilmoituksia
OHJ-1101 Ohjelmointi 1e 2008-09 1 Kääntäjän virheilmoituksia Kun progvh2 ohjelma käännetään antaa tutg++ seuraavat virheilmoitukset ja varoitukset: proffa> tutg++ progvh2.cc progvh2.cc:29:13: warning:
LisätiedotOsoitin ja viittaus C++:ssa
Osoitin ja viittaus C++:ssa Osoitin yksinkertaiseen tietotyyppiin Osoitin on muuttuja, joka sisältää jonkin toisen samantyyppisen muuttujan osoitteen. Ohessa on esimerkkiohjelma, jossa määritellään kokonaislukumuuttuja
LisätiedotDynaaminen muisti. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät 2017.
C! Dynaaminen muisti 9.2.2017 Agenda Kertausta merkkijonoista Dynaaminen muisti Valgrind-perusteet ja esimerkkejä Seuraava luento to 2.3. Ei harjoituksia arviointiviikolla 13.2. 17.2. 2 Palautetta merkkijonoihin
LisätiedotC-ohjelmoinnin peruskurssi. Pasi Sarolahti
C! C-ohjelmoinnin peruskurssi Pasi Sarolahti Mitä haluan oppia C-kurssilla? ja miksi? Tutustu lähimpään naapuriin Keskustelkaa miksi halusitte / jouduitte tulemaan kurssille 3 minuuttia è kootaan vastauksia
LisätiedotOhjelmoinnin perusteet Y Python
Ohjelmoinnin perusteet Y Python T-106.1208 2.3.2009 T-106.1208 Ohjelmoinnin perusteet Y 2.3.2009 1 / 28 Puhelinluettelo, koodi def lue_puhelinnumerot(): print "Anna lisattavat nimet ja numerot." print
LisätiedotC++11 lambdat: [](){} Matti Rintala
C++11 lambdat: [](){} Matti Rintala bool(*)(int) Tarve Tarve välittää kirjastolle/funktiolle toiminnallisuutta Callback-funktiot Virhekäsittely Käyttöliittymät Geneeristen kirjastojen räätälöinti STL:n
LisätiedotSisältö. 22. Taulukot. Yleistä. Yleistä
Sisältö 22. Taulukot Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko metodin parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 22.1 22.2 Yleistä
Lisätiedot8. Näppäimistöltä lukeminen 8.1
8. Näppäimistöltä lukeminen 8.1 Sisällys Arvojen lukeminen näppäimistöltä Java-kielessä. In-luokka. In-luokka, käännös ja tulkinta Scanner-luokka. 8.2 Yleistä Näppäimistöltä annettujen arvojen (syötteiden)
LisätiedotConcurrency - Rinnakkaisuus. Group: 9 Joni Laine Juho Vähätalo
Concurrency - Rinnakkaisuus Group: 9 Joni Laine Juho Vähätalo Sisällysluettelo 1. Johdanto... 3 2. C++ thread... 4 3. Python multiprocessing... 6 4. Java ExecutorService... 8 5. Yhteenveto... 9 6. Lähteet...
LisätiedotOlion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();
Sisällys 7. Oliot ja viitteet Olio Java-kielessä. Olion luominen, elinikä ja tuhoutuminen. Viitteiden käsittelyä: sijoitus, vertailu ja varautuminen null-arvoon. Viite metodin paluuarvona.. 7.1 7.2 Olio
LisätiedotPERL. TIE Principles of Programming Languages. Ryhmä 4: Joonas Lång & Jasmin Laitamäki
PERL TIE-20306 Principles of Programming Languages Ryhmä 4: Joonas Lång & Jasmin Laitamäki 1. Johdanto Perl on ohjelmointikielten perhe, johon kuuluu Perl 5 ja Perl 6. Kielet ovat kuitenkin erilliset ohjelmointikielet
LisätiedotOperaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta
C++ - perusteet Java-osaajille luento 5/7: operaattoreiden ylikuormitus, oliotaulukko, parametrien oletusarvot, komentoriviparametrit, constant, inline, Operaattoreiden ylikuormitus Operaattoreiden kuormitus
LisätiedotHarjoitustyö: virtuaalikone
Harjoitustyö: virtuaalikone Toteuta alla kuvattu virtuaalikone yksinkertaiselle olio-orientoituneelle skriptauskielelle. Paketissa on testaamista varten mukana kaksi lyhyttä ohjelmaa. Ohjeita Noudata ohjelman
LisätiedotSisältö. 2. Taulukot. Yleistä. Yleistä
Sisältö 2. Taulukot Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko operaation parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 2.1 2.2 Yleistä
LisätiedotAS-0.1103 C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin
AS-0.1103 C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin Raimo Nikkilä Aalto-yliopiston sähkötekniikan korkeakoulu - Automaation tietotekniikan tutkimusryhmä 17. tammikuuta 2013
Lisätiedot8. Näppäimistöltä lukeminen 8.1
8. Näppäimistöltä lukeminen 8.1 Sisällys Arvojen lukeminen näppäimistöltä Java-kielessä. In-luokka. In-luokka, käännös ja tulkinta Scanner-luokka. 8.2 Yleistä Näppäimistöltä annettujen arvojen (syötteiden)
LisätiedotC-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa.
Taulukot C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa. Taulukon muuttujilla (muistipaikoilla) on yhteinen nimi. Jokaiseen yksittäiseen
LisätiedotChapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen
Chapel TIE-20306 Ryhmä 91 Joonas Eloranta Lari Valtonen Johdanto Chapel on Amerikkalaisen Cray Inc. yrityksen kehittämä avoimen lähdekoodin ohjelmointikieli. Chapel on rinnakkainen ohjelmointikieli, joka
Lisätiedot15. Ohjelmoinnin tekniikkaa 15.1
15. Ohjelmoinnin tekniikkaa 15.1 Sisällys For-each-rakenne. Lueteltu tyyppi enum. Override-annotaatio. Geneerinen ohjelmointi. 15.2 For-each-rakenne For-rakenteen variaatio taulukoiden ja muiden kokoelmien
Lisätiedot5. HelloWorld-ohjelma 5.1
5. HelloWorld-ohjelma 5.1 Sisällys Lähdekoodi. Lähdekoodin (osittainen) analyysi. Lähdekoodi tekstitiedostoon. Lähdekoodin kääntäminen tavukoodiksi. Tavukoodin suorittaminen. Virheiden korjaaminen 5.2
LisätiedotDynaaminen muisti Rakenteiset tietotyypit
C! Dynaaminen muisti Rakenteiset tietotyypit 1.3.2016 Agenda Kertausta Dynaaminen muisti Valgrind-perusteet ja esimerkkejä Yhteenveto tietorakenteista Vilkaisu 3. kierroksen tehtäviin Esim: miten linkitetty
LisätiedotYleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.
2. Taulukot 2.1 Sisältö Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko operaation parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 2.2 Yleistä
LisätiedotOhjelmointi 1 Taulukot ja merkkijonot
Ohjelmointi 1 Taulukot ja merkkijonot Jussi Pohjolainen TAMK Tieto- ja viestintäteknologia Johdanto taulukkoon Jos ohjelmassa käytössä ainoastaan perinteisiä (yksinkertaisia) muuttujia, ohjelmien teko
LisätiedotTietueet. Tietueiden määrittely
Tietueet Tietueiden määrittely Tietue on tietorakenne, joka kokoaa yhteen eri tyyppistä tietoa yhdeksi asiakokonaisuudeksi. Tähän kokonaisuuteen voidaan viitata yhteisellä nimellä. Auttaa ohjelmoijaa järjestelemään
LisätiedotRajapinnat ja olioiden välittäminen
Rajapinnat ja olioiden välittäminen Moduulit/oliot kutsuvat toisiaan kapseloitujen rajapintojen läpi Kutsuissa välitetään usein olioita paikasta toiseen Jos olion omistus (= tuhoamisvastuu) säilyy koko
LisätiedotOhjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan.
Osoittimet Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan. Muistilohkon koko riippuu muuttujan tyypistä, eli kuinka suuria arvoja muuttujan
Lisätiedot7. Oliot ja viitteet 7.1
7. Oliot ja viitteet 7.1 Sisällys Olio Java-kielessä. Olion luominen, elinikä ja tuhoutuminen. Viitteiden sijoitus. Viitteiden vertailu. Varautuminen null-arvoon. Viite metodin paluuarvona. Viite metodin
LisätiedotC++ Ohjelmoijan käsikirja. Johdanto
Johdanto C++ Ohjelmoijan käsikirja Johdanto Tervetuloa Inside C++-kirjan pariin. Tämä on opaskirja standardi C++:n käyttöön. Käsittelemme kirjassa kaikki syntaksin, kieliopin, olio-ohjelmoinnin ja standardikirjastojen
Lisätiedot815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset
815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset Harjoituksen aiheena ovat aliohjelmat ja abstraktit tietotyypit sekä olio-ohjelmointi. Tehtävät tehdään C-, C++- ja Java-kielillä.
LisätiedotTässä tehtävässä käsittelet metodeja, listoja sekä alkulukuja (englanniksi prime ).
Tehtävä 1: Metodit, listat, alkuluvut (4p) Tässä tehtävässä käsittelet metodeja, listoja sekä alkulukuja (englanniksi prime ). Alkuluvut ovat lukuja, jotka ovat suurempia kuin yksi ja jotka ovat jaollisia
Lisätiedot14. Poikkeukset 14.1
14. Poikkeukset 14.1 Sisällys Johdanto. Tarkistettavat ja tarkistamattomat poikkeukset. Poikkeusten tunnistaminen ja sieppaaminen try-catchlauseella. Mitä tehdä siepatulla poikkeuksella? Poikkeusten heittäminen.
LisätiedotSisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä 12.1 12.2 12.3 12.4
Sisällys 12. Näppäimistöltä lukeminen Arvojen lukeminen näppäimistöltä yleisesti. Arvojen lukeminen näppäimistöltä Java-kielessä.. Luetun arvon tarkistaminen. Tietovirrat ja ohjausmerkit. Scanner-luokka.
LisätiedotSisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä
Sisälls 7. Oliot ja viitteet Olio Java-kielessä. Olion luominen, elinikä ja tuhoutuminen.. Viitteiden vertailu. Varautuminen null-arvoon. Viite metodin paluuarvona.. Muuttumattomat ja muuttuvat merkkijonot.
LisätiedotSisällys. 14. Poikkeukset. Johdanto. Johdanto
Sisällys 14. Poikkeukset Johdanto. Tarkistettavat ja tarkistamattomat poikkeukset. Miten varautua poikkeukseen metodissa? Poikkeusten tunnistaminen ja sieppaaminen try-catchlauseella. Mitä tehdä siepatulla
Lisätiedot11/20: Konepelti auki
Ohjelmointi 1 / syksy 2007 11/20: Konepelti auki Paavo Nieminen nieminen@jyu.fi Tietotekniikan laitos Informaatioteknologian tiedekunta Jyväskylän yliopisto Ohjelmointi 1 / syksy 2007 p.1/11 Tämän luennon
Lisätiedot4. Luokan testaus ja käyttö olion kautta 4.1
4. Luokan testaus ja käyttö olion kautta 4.1 Olion luominen luokasta Java-kielessä olio määritellään joko luokan edustajaksi tai taulukoksi. Olio on joukko keskusmuistissa olevia tietoja. Oliota käsitellään
LisätiedotPRINCIPLES OF PROGRAMMING LANGUAGES - DEBUGGER
PRINCIPLES OF PROGRAMMING LANGUAGES - DEBUGGER Group 16 Ville Laatu Henri Myllyoja - i SISÄLLYSLUETTELO 1. DEBUGGERI YLEISESTI... II 1.1 Debuggerin käyttämien... ii 1.2 Debuggerin käynnistäminen... ii
LisätiedotMerkkijono määritellään kuten muutkin taulukot, mutta tilaa on varattava yksi ylimääräinen paikka lopetusmerkille:
Merkkijonot C-kielessä merkkijono on taulukko, jonka alkiot ovat char -tyyppiä. Taulukon viimeiseksi merkiksi tulee merkki '\0', joka ilmaisee merkkijonon loppumisen. Merkkijono määritellään kuten muutkin
LisätiedotTaulukot. Jukka Harju, Jukka Juslin 2006 1
Taulukot Jukka Harju, Jukka Juslin 2006 1 Taulukot Taulukot ovat olioita, jotka auttavat organisoimaan suuria määriä tietoa. Käsittelylistalla on: Taulukon tekeminen ja käyttö Rajojen tarkastus ja kapasiteetti
Lisätiedot14. Poikkeukset 14.1
14. Poikkeukset 14.1 Sisällys Johdanto. Tarkistettavat ja tarkistamattomat poikkeukset. Miten varautua poikkeukseen metodissa? Poikkeusten tunnistaminen ja sieppaaminen try-catchlauseella. Mitä tehdä siepatulla
LisätiedotD-OHJELMOINTIKIELI. AA-kerho, 33. Antti Uusimäki. Arto Savolainen
D-OHJELMOINTIKIELI AA-kerho, 33 Antti Uusimäki Arto Savolainen 2 D-OHJELMOINTIKIELI D-kielen historia alkaa vuodesta 1999, kun Walter Bright aloitti uuden ohjelmointikielen kehittämisen. Ensimmäinen versio
Lisätiedot2 Konekieli, aliohjelmat, keskeytykset
ITK145 Käyttöjärjestelmät, kesä 2005 Tenttitärppejä Tässä on lueteltu suurin piirtein kaikki vuosina 2003-2005 kurssin tenteissä kysytyt kysymykset, ja mukana on myös muutama uusi. Jokaisessa kysymyksessä
LisätiedotTähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python
Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python 31. tammikuuta 2009 Ohjelmointi Perusteet Pythonin alkeet Esittely Esimerkkejä Muuttujat Peruskäsitteitä Käsittely
LisätiedotC++11 Syntaksi. Jari-Pekka Voutilainen Jari-Pekka Voutilainen: C++11 Syntaksi
1 C++11 Syntaksi Jari-Pekka Voutilainen 13.4.2012 2 Range-for Iteroi säiliön kaikki alkiot for-silmukassa. Säiliöltä vaaditaan begin- ja end-iteraattorit. Pätee kaikille C++11 STL-säiliöille, taulukoille,
Lisätiedot811312A Tietorakenteet ja algoritmit , Harjoitus 2 ratkaisu
811312A Tietorakenteet ja algoritmit 2017-2018, Harjoitus 2 ratkaisu Harjoituksen aiheena on algoritmien oikeellisuus. Tehtävä 2.1 Kahvipurkkiongelma. Kahvipurkissa P on valkoisia ja mustia kahvipapuja,
LisätiedotHarjoitustyön testaus. Juha Taina
Harjoitustyön testaus Juha Taina 1. Johdanto Ohjelman teko on muutakin kuin koodausta. Oleellinen osa on selvittää, että ohjelma toimii oikein. Tätä sanotaan ohjelman validoinniksi. Eräs keino validoida
Lisätiedot12. Näppäimistöltä lukeminen 12.1
12. Näppäimistöltä lukeminen 12.1 Sisällys Arvojen lukeminen näppäimistöltä yleisesti. Arvojen lukeminen näppäimistöltä Java-kielessä. In-luokka. Luetun arvon tarkistaminen. Tietovirrat ja ohjausmerkit.
LisätiedotAutomaattinen yksikkötestaus
Teknillinen Korkeakoulu T-76.115 Tietojenkäsittelyopin ohjelmatyö Lineaaristen rajoitteiden tyydyttämistehtävän ratkaisija L models Automaattinen yksikkötestaus Ryhmä Rajoitteiset Versio Päivämäärä Tekijä
LisätiedotMuuttujien roolit Kiintoarvo cin >> r;
Muuttujien roolit Muuttujilla on ohjelmissa eräitä tyypillisiä käyttötapoja, joita kutsutaan muuttujien rooleiksi. Esimerkiksi muuttuja, jonka arvoa ei muuteta enää kertaakaan muuttujan alustamisen jälkeen,
LisätiedotPerusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti
C! Perusteet 19.1.2017 Palautteesta (1. kierros toistaiseksi) (Erittäin) helppoa Miksi vain puolet pisteistä? Vaikeinta oli ohjelmointiympäristön asennus ja käyttö Ei selvää että main funktion pitikin
LisätiedotC-ohjelmoinnin peruskurssi. Pasi Sarolahti
C! C-ohjelmoinnin peruskurssi Pasi Sarolahti 12.1.2017 presemo.aalto.fi/c17 1/12/17 Mikä C? 3 Ken Thompson & Dennis Ritchie http://www.computerhistory.org/fellowawards/hall/bios/ken,thompson/ 4 Mikä C?
LisätiedotSisällys. 14. Poikkeukset. Johdanto. Johdanto
Sisällys 14. Poikkeukset Johdanto. Tarkistettavat ja tarkistamattomat poikkeukset. Poikkeusten tunnistaminen ja sieppaaminen try-catchlauseella. Mitä tehdä siepatulla poikkeuksella? Poikkeusten heittäminen.
LisätiedotKirjoita oma versio funktioista strcpy ja strcat, jotka saavat parametrinaan kaksi merkkiosoitinta.
Tehtävä 63. Kirjoita oma versio funktiosta strcmp(),joka saa parametrinaan kaksi merkkiosoitinta. Tee ohjelma, jossa luetaan kaksi merkkijonoa, joita sitten verrataan ko. funktiolla. Tehtävä 64. Kirjoita
LisätiedotELM GROUP 04. Teemu Laakso Henrik Talarmo
ELM GROUP 04 Teemu Laakso Henrik Talarmo 23. marraskuuta 2017 Sisältö 1 Johdanto 1 2 Ominaisuuksia 2 2.1 Muuttujat ja tietorakenteet...................... 2 2.2 Funktiot................................
LisätiedotTIE Tietorakenteet ja algoritmit 1. TIE Tietorakenteet ja algoritmit
TIE-20100 Tietorakenteet ja algoritmit 1 TIE-20100 Tietorakenteet ja algoritmit TIE-20100 Tietorakenteet ja algoritmit 2 Lähteet Luentomoniste pohjautuu vahvasti prof. Antti Valmarin vanhaan luentomonisteeseen
LisätiedotPythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python
Pythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python 8. marraskuuta 2010 Ohjelmointi Perusteet Peruskäsitteitä Olio-ohjelmointi Pythonin alkeet Esittely Esimerkkejä Muuttujat
Lisätiedot15. Ohjelmoinnin tekniikkaa 15.1
15. Ohjelmoinnin tekniikkaa 15.1 Sisällys For-each-rakenne. Geneerinen ohjelmointi. Lueteltu tyyppi enum. 15.2 For-each-rakenne For-rakenteen variaatio taulukoiden ja muiden kokoelmien silmukoimiseen:
LisätiedotLoppukurssin järjestelyt
C! Loppukurssin järjestelyt 29.3.2018 Ohjelmassa Yhteenvetoa palautteesta Ohjelmontitehtävän järjestelyt Tietokonetentin järjestelyt Kysyttävää / kerrattavaa 10-kierroksen asioista? Aikatauluista 10. kierroksen
LisätiedotDart. Ryhmä 38. Ville Tahvanainen. Juha Häkli
Dart Ryhmä 38 Ville Tahvanainen Juha Häkli 1.LYHYESTI Dart on luokkapohjainen, yksiperintäinen, puhdas olio-ohjelmointikieli. Dart on dynaamisesti tyypitetty. Sovellukset on organisoitu modulaarisiksi
LisätiedotOhjelmointi 2. Jussi Pohjolainen. TAMK» Tieto- ja viestintäteknologia , Jussi Pohjolainen TAMPEREEN AMMATTIKORKEAKOULU
Ohjelmointi 2 Jussi Pohjolainen TAMK» Tieto- ja viestintäteknologia Tietotyypeistä C++ - kielessä useita tietotyyppejä Kirjaimet: char, wchar_t Kokonaisluvut: short, int, long Liukuluvut: float, double
LisätiedotPoikkeustenkäsittely
1 Poikkeustenkäsittely Mitä poikkeustenkäsittely tarkoittaa? Poikkeuksen käsitteleminen Poikkeusluokkien hierarkia Poikkeuksen heittäminen 1 Mitä poikkeustenkäsittely tarkoittaa? Poikkeus (Exception) on
LisätiedotOhjelmoinnin perusteet, syksy 2006
Ohjelmoinnin perusteet, syksy 2006 Esimerkkivastaukset 1. harjoituksiin. Alkuperäiset esimerkkivastaukset laati Jari Suominen. Vastauksia muokkasi Jukka Stenlund. 1. Esitä seuraavan algoritmin tila jokaisen
LisätiedotOhjelmoinnin perusteet Y Python
Ohjelmoinnin perusteet Y Python T-106.1208 1.3.2010 T-106.1208 Ohjelmoinnin perusteet Y 1.3.2010 1 / 36 Monikko Monikko (engl. tuple) muistuttaa listaa, mutta monikon sisältöä ei voi muuttaa sen jälkeen,
LisätiedotMaastotietokannan torrent-jakelun shapefile-tiedostojen purkaminen zip-arkistoista Windows-komentojonoilla
Maastotietokannan torrent-jakelun shapefile-tiedostojen purkaminen zip-arkistoista Windows-komentojonoilla Viimeksi muokattu 5. toukokuuta 2012 Maastotietokannan torrent-jakeluun sisältyy yli 5000 zip-arkistoa,
LisätiedotPerusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti
C! Perusteet 19.1.2017 Palautteesta (1. kierros toistaiseksi) Toistaiseksi helppoa Miksi vain puolet pisteistä? Vaikeinta oli ohjelmointiympäristön asennus ja käyttö Vaikeaa eroavuudet Pythonin ja C:n
LisätiedotOsoittimet ja taulukot
C! ja taulukot 1.2.2018 Tiedotteita Tämän jälkeen taas pari väliviikkoa (tenttiviikko) Seuraava luento 22.2. Laskareita ei tenttiviikolla 12.2. 16.2. 2 ja muisti Muisti Keskusyksikkö Suorittaa muistissa
LisätiedotJava-kielen perusteet
Java-kielen perusteet Tunnus, varattu sana, kommentti Muuttuja, alkeistietotyyppi, merkkijono, literaalivakio, nimetty vakio Tiedon merkkipohjainen tulostaminen 1 Tunnus Java tunnus Java-kirjain Java-numero
LisätiedotLoppukurssin järjestelyt C:n edistyneet piirteet
C! Loppukurssin järjestelyt C:n edistyneet piirteet 30.3.2017 Ohjelmassa Ohjelmontitehtävän järjestelyt Tietokonetentin järjestelyt Esikääntäjä Parametrilistat Funktio-osoittimet Kunniamainintoja Kuura
LisätiedotOsa. Listaus 2.1. HELLO.CPP esittelee C++ -ohjelman osat. 14: #include <iostream.h> 15: 16: int main() 17: {
Osa I 2. oppitunti C++-ohjelman osat Ennen kuin menemme yksityiskohtaisemmin sisälle C++-luokkiin, -muuttujiin jne, katsokaamme ensin, millaisista osista C++-ohjelma koostuu. Tämän tunnin aikana opit seuraavat
Lisätiedot5. HelloWorld-ohjelma 5.1
5. HelloWorld-ohjelma 5.1 Sisällys Lähdekoodi. Lähdekoodin (osittainen) analyysi. Lähdekoodi tekstitiedostoon. Lähdekoodin kääntäminen tavukoodiksi. Tavukoodin suorittaminen. Virheiden korjaaminen 5.2
LisätiedotApuja ohjelmointiin» Yleisiä virheitä
Apuja ohjelmointiin» Yleisiä virheitä Ohjelmaa kirjoittaessasi saattaa Visual Studio ilmoittaa monenlaisista virheistä "punakynällä". Usein tämä johtuu vain siitä, että virheitä näytetään vaikket olisi
LisätiedotTietorakenteet ja algoritmit syksy Laskuharjoitus 1
Tietorakenteet ja algoritmit syksy 2012 Laskuharjoitus 1 1. Tietojenkäsittelijä voi ajatella logaritmia usein seuraavasti: a-kantainen logaritmi log a n kertoo, kuinka monta kertaa luku n pitää jakaa a:lla,
LisätiedotATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014
18. syyskuuta 2014 IDL - proseduurit Viimeksi käsiteltiin IDL:n interaktiivista käyttöä, mutta tämä on hyvin kömpelöä monimutkaisempia asioita tehtäessä. IDL:llä on mahdollista tehdä ns. proseduuri-tiedostoja,
LisätiedotTT00AA12-2016 - Ohjelmoinnin jatko (TT10S1ECD)
TT00AA12-2016 - Ohjelmoinnin jatko (TT10S1ECD) Ohjelmointikäytännöt 21/3/11 Mikko Vuorinen Metropolia Ammattikorkeakoulu 1 Sisältö 1) Mitä on hyvä koodi? 2) Ohjelmointikäytäntöjen merkitys? 3) Koodin asettelu
LisätiedotTAMPEREEN TEKNILLINEN YLIOPISTO Digitaali- ja tietokonetekniikan laitos. Harjoitustyö 4: Cache, osa 2
TAMPEREEN TEKNILLINEN YLIOPISTO Digitaali- ja tietokonetekniikan laitos TKT-3200 Tietokonetekniikka I Harjoitustyö 4: Cache, osa 2.. 2010 Ryhmä Nimi Op.num. 1 Valmistautuminen Cache-työn toisessa osassa
LisätiedotOhjelmoinnin perusteet Y Python
Ohjelmoinnin perusteet Y Python T-106.1208 28.2.2011 T-106.1208 Ohjelmoinnin perusteet Y 28.2.2011 1 / 46 Ohjelmointiprojektin vaiheet 1. Määrittely 2. Ohjelman suunnittelu (ohjelman rakenne ja ohjelman
LisätiedotOhjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:
1 (7) Tiedon lukeminen näppäimistöltä Scanner-luokan avulla Miten ohjelma saa käyttöönsä käyttäjän kirjoittamaa tekstiä? Järjestelmässä on olemassa ns. syöttöpuskuri näppäimistöä varten. Syöttöpuskuri
LisätiedotLuokassa määriteltävät jäsenet ovat pääasiassa tietojäseniä tai aliohjelmajäseniä. Luokan määrittelyyn liittyvät varatut sanat:
1. Luokan jäsenet Luokassa määriteltävät jäsenet ovat pääasiassa tietojäseniä tai aliohjelmajäseniä. Luokan määrittelyyn liittyvät varatut sanat: class luokan_nimi tyypit: enum, struct, class, typedef
Lisätiedot815338A Ohjelmointikielten periaatteet Harjoitus 4 vastaukset
815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 4 vastaukset Harjoituksen aiheena ovat imperatiivisten kielten lauseisiin, lausekkeisiin ja aliohjelmiin liittyvät kysymykset. Tehtävä 1. Mitä
LisätiedotOhjelmointi 1. Kumppanit
Ohjelmointi 1 Kumppanit November 20, 2012 2 Contents 1 Mitä ohjelmointi on 7 2 Ensimmäinen C#-ohjelma 9 2.1 Ohjelman kirjoittaminen......................... 9 A Liite 11 3 4 CONTENTS Esipuhe Esipuhe 5
Lisätiedot7. Näytölle tulostaminen 7.1
7. Näytölle tulostaminen 7.1 Sisällys System.out.println- ja System.out.print-operaatiot. Tulostus erikoismerkeillä. Edistyneempää tulosteiden muotoilua. 7.2 Tulostusoperaatiot System.out.println-operaatio
LisätiedotLyhyt kertaus osoittimista
, syksy 2007 Kertausta Luento 10 12.10.2007 Syksy 2007 1 Lyhyt kertaus osoittimista char *p; /* char, int, jne ilmoittavat, minkä tyyppisiä */ Keskusmuisti int *q; /* olioita sisältäviin muistilohkoihin
LisätiedotTIE PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli
TIE-20306 PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli Seminaariesitelmä ryhmä 24 Markku Ahokas Jani Kuitti i SISÄLLYSLUETTELO 1. YLEISTÄ EIFFELISTÄ... 1 1.1 Historia ja tausta... 1 1.2
LisätiedotIDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit
IDL - proseduurit 25. huhtikuuta 2017 Viimeksi käsiteltiin IDL:n interaktiivista käyttöä, mutta tämä on hyvin kömpelöä monimutkaisempia asioita tehtäessä. IDL:llä on mahdollista tehdä ns. proseduuri-tiedostoja,
LisätiedotOsa III. Olioiden luominen vapaalle muistialueelle
Osa III 10. oppitunti Kehittyneet osoittimet Eräs tehokkaimpia C++ -työkaluja on mahdollisuus käsitellä tietokoneen muistia suoraan osoittimien avulla. Tässä luvussa käsitelläänkin seuraavia aiheita: Kuinka
LisätiedotRakenteiset tietotyypit Moniulotteiset taulukot
C! Rakenteiset tietotyypit Moniulotteiset taulukot 22.2.2018 Agenda Rakenteiset tietotyypit Vilkaisu 6. kierroksen tehtäviin Moniulotteiset taulukot Esimerkki Seuraava luento to 8.3. Ilmoittautuminen ohjelmointikokeeseen
LisätiedotOhjelmointikieli TIE Principles of Programming Languages Syksy 2017 Ryhmä 19
Ohjelmointikieli TIE-20306 Principles of Programming Languages Syksy 2017 Ryhmä 19 Juho Kärnä Ville Mäntysaari 1. Johdanto D on yleiskäyttöinen, strukturoitu, staattisesti tyypitetty, käännettävä ohjelmointikieli
LisätiedotHarjoitus 5 (viikko 48)
Moni tämän harjoituksen tehtävistä liittyy joko suoraan tai epäsuorasti kurssin toiseen harjoitustyöhön. Harjoitustyö edistyy sitä paremmin, mitä enemmän tehtäviä ratkaiset. Mikäli tehtävissä on jotain
LisätiedotITKP102 Ohjelmointi 1 (6 op), arvosteluraportti
ITKP2 Ohjelmointi 1 (6 op), arvosteluraportti Tentaattori: Antti-Jussi Lakanen 17. toukokuuta 219 Yleistä Tentti 1 oli pistekeskiarvon (14,6) perusteella hieman tavanomaista helpompi. Omasta tehtäväpaperista
LisätiedotTAMPEREEN TEKNILLINEN YLIOPISTO
TAMPEREEN TEKNILLINEN YLIOPISTO Digitaali- ja Tietokonetekniikan laitos TKT-3200 Tietokonetekniikka ASSEMBLER: QSORT 11.08.2010 Ryhmä 00 nimi1 email1 opnro1 nimi2 email2 opnro2 nimi3 email3 opnro3 1. TEHTÄVÄ
LisätiedotJReleaser Yksikkötestaus ja JUnit. Mikko Mäkelä 6.11.2002
JReleaser Yksikkötestaus ja JUnit Mikko Mäkelä 6.11.2002 Sisältö Johdanto yksikkötestaukseen JUnit yleisesti JUnit Framework API (TestCase, TestSuite) Testien suorittaminen eri työkaluilla Teknisiä käytäntöjä
LisätiedotOhjelmoinnin jatkokurssi, kurssikoe 28.4.2014
Ohjelmoinnin jatkokurssi, kurssikoe 28.4.2014 Kirjoita jokaiseen palauttamaasi konseptiin kurssin nimi, kokeen päivämäärä, oma nimi ja opiskelijanumero. Vastaa kaikkiin tehtäviin omille konsepteilleen.
LisätiedotHarjoitustyö 3 - Millosemeni
Harjoitustyö 3 - Millosemeni Tampereen kaupunki tarjoaa avoin data -sivuillaan Tampereen joukkoliikenteen aikataulut, reitit sekä rajapinnan joukkoliikenteen reaaliaikaiseen seurantaan. Näinpä erilaisille
Lisätiedot15. oppitunti. Taulukot. Osa. Mikä on taulukko?
Osa IV 15. oppitunti Taulukot Aiemmissa luvuissa on käytetty yksinkertaisia int-, char-, yms. kohteita. Usein on kuitenkin tarvetta käyttää kohteiden kokoelmia, kuten joukkoa, jossa on 20 int-arvoa tai
LisätiedotSisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2
4. Attribuutit 4.1 Sisällys Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2 Yleistä Luokan lohkossa, mutta metodien ulkopuolella esiteltyjä
LisätiedotOlio-ohjelmointi Poikkeusten käsittelystä. 1. Johdanto
Olio-ohjelmointi Poikkeusten käsittelystä Virheiden käsittely liittyy olennaisesti kaikkeen ohjelmointiin. Monissa sovelluksissa virhetilanteiden käsittelemiseen liittyvää koodia on merkittävä osuus koko
LisätiedotITKP102 Ohjelmointi 1 (6 op)
ITKP102 Ohjelmointi 1 (6 op) Tentaattori: Antti-Jussi Lakanen 22. huhtikuuta 2016 Vastaa kaikkiin tehtäviin. Tee jokainen tehtävä erilliselle konseptiarkille! Kirjoittamasi luokat, funktiot ja aliohjelmat
Lisätiedot