Luentokalvot - Muuttujat ja tietotyypit
Transcription
Luentokalvot - Muuttujat ja tietotyypit
*x++=*y++ 815338A Ohjelmointikielten periaatteet 2014 - 2015 IV.1 Imperatiivinen ohjelmointi – muuttujat ja tietotyypit *x++=*y++ Sisältö 1. 2. 3. 4. 5. 6. 7. 8. Yleistä muuttujista Sidonta Tyypin tarkistus Näkyvyysalue Yleistä tietotyypeistä Primitiiviset tietotyypit Rakenteelliset tietotyypit Osoitintyyppi Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 2 *x++=*y++ IV.1.1 Yleistä muuttujista Imperatiivisen ohjelmoinnin keskeisimpiä käsitteitä Muuttuja mallintaa tietokoneen muistipaikkaa Muuttujaan liittyy 1. Nimi (name) Tapa yksilöidä muuttuja 2. Osoite (address) Muistiosoite, jossa muuttujan arvo sijaitsee 3. Arvo (value) Data joka kulloinkin on muuttujan osoitteen osoittamassa muistipaikassa Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 3 *x++=*y++ IV.1.1 Yleistä muuttujista (2) Muuttujan ominaisuuksia 1. Tyyppi (type) Muuttujan tietorakenteen nimi 2. Näkyvyysalue (scope) Se ohjelman osa, jossa muuttuja on käytettävissä 3. Elinaika (lifetime, extent) Muuttujan muistinvaraamisen ja muistinvapauttamisen välinen aika Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 4 *x++=*y++ IV.1.1.1 Muuttujan nimi Merkkijono, jota käytetään tunnistamaan muuttuja FORTRAN77: max. kuuden merkin mittaiset nimet FORTRAN 90 käyttää 31 merkin rajoitusta C-kieli: Nimen erottelupituutena vähintään 31 ensimmäistä merkkiä Nykyään useimmissa kielissä (C++, Java) mielivaltaisen pitkät nimet Useimmiten nimen alettava kirjaimella (tai alaviivalla) Isojen/pienien kirjainten erottelu Pascal, FORTRAN ei eroa Useimmiten erotetaan (C, Java jne) Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 5 *x++=*y++ IV.1.1.1.1 Erikoissanat Erottavat kielen kontrollirakenteita kuvaavat sanat muuttujista Varatut sanat (reserved words) Ei voi käyttää muuten kuin sille varattuun tarkoitukseen Avainsanat (keywords) Avainsana on erikoismerkityksessä ainoastaan tietyissä yhteyksissä Nykykielissä yleensä ainoastaan varattuja sanoja FORTRAN käyttää avainsanoja Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 6 *x++=*y++ IV.1.1.2. Muuttujan osoite Muuttujaan liittyvän fyysisen muistiosoitteen arvo Yleensä ilmaistaan heksalukuna Ei yleensä staattinen, muuttujan osoite saattaa vaihdella ohjelman suorituksen aikana Usein käytetään nimitystä l-value (left value) Osoite tiedettävä, kun muuttuja sijaitsee sijoituslauseen vasemmalla puolella Moninimisyys, aliasing Kaksi erinimistä muuttujaa viittaa samaan muistipaikkaan Yleensä muodostaminen ei suotavaa Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 7 *x++=*y++ IV.1.1.3. Muuttujan tyyppi Määrittelee 1. Muuttujan arvoalueen 2. Minkälaisia operaatioita tyypin muuttujalle voidaan tehdä Esimerkki: Java-kielessä Suurin kokonaisluku: Integer.MAX_VALUE 2147483647 pienin: Integer.MIN_VALUE -2147483648 Muuttujiin voidaan soveltaa perusaritmetiikan operaatioita. Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 8 *x++=*y++ IV.1.1.4. Muuttujan arvo Muuttujan muistiosoitteen kulloinenkin sisältö Tässä muistiosoite = sellainen muistialue, johon koko muuttujan data mahtuu Esimerkki: Javan double-tyyppinen muuttuja kahdeksan tavun kokoinen -> muuttujan osoite kahdeksan tavun kokoinen muistialue, jossa säilytetään muuttujan arvoa. Usein nimitetään r-valueksi (right value) Tarvitaan sijoituslauseen oikealla puolella. Huom! Jotta päästäisiin käsiksi r-valueen, on l-value aina määritettävä ensin Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 9 *x++=*y++ IV.1.2. Sidonta Yksi keskeisimmistä muuttujiin liittyvistä käsitteistä Jonkin ominaisuuden liittämistä ohjelman itsenäiseen kokonaisuuteen Muuttujan tapauksessa tyypinsidonta tai muistinsidonta Tyypinsidonta liittää muuttujaan jonkin tietotyypin Muistinsidonta liittää muuttujaan muistiosoitteen (varaa riittävästi muistia, jotta muuttujan arvo voidaan tallentaa) Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 10 *x++=*y++ IV.1.2. Sidonta (2) Sidonta-aika (binding time) = milloin tietty sidonta tehdään Varhainen sidonta lisää tehokkuutta Myöhäinen sidonta lisää joustavuutta Staattinen sidonta (static binding) ennen ohjelman ajoa – ei muutu ajon aikana Dynaaminen sidonta (dynamic binding) = ajonaikainen sidonta Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 11 *x++=*y++ IV.1.2.1. Tyypinsidonta Muuttujaan on liitettävä tietotyyppi ennen kuin sitä voi ohjelmassa käyttää Voidaan tehdä: 1. Staattisesti i. eksplisiittisellä tai ii. implisiittisellä esittelyllä 2. Dynaamisesti Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 12 *x++=*y++ IV.1.2.1.1 Tyypin staattinen sidonta Eksplisiittinen esittely: ohjelmalauseessa määritellään muuttuja tietyn tyyppisiksi, esimerkiksi C:ssä float f1; Useimmissa staattista tyypinsidontaa käyttävissä kielissä pakollinen Implisiittinen esittely liittää muuttujaan tietotyypin jonkin sopimuksen mukaan ilman erillistä esittelyä Esim. FORTRANissa muuttuja INTEGER-tyyppinen jos nimi alkaa I, J, K, L, M tai N-kirjaimella; muuten REAL -tyyppinen Haitta: Esittelyn poisjäänti vahingossa voi johtaa hankalasti löydettäviin virhetoimintoihin Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 13 *x++=*y++ IV.1.2.1.2 Tyypin dynaaminen sidonta Tyyppi määrittyy ohjelman suorituksen aikana sijoituslausetta suoritettaessa Dynaamista tyypinsidontaa käyttävät kielet eroavat voimakkaasti staattiseen tyypinsidontaan perustuvista Joustavia ja geneerinen ohjelmointi yksinkertaista Esim. 1960-luvun APL ja SNOBOL Esimerkki. JavaScript: xz = [1.5, 2.2, 3.7] // Nyt xz taulukko xz = 234 // Nyt xz kokonaisluku Haittoja tehokkuuden menetys ja koodin luotettavuuden heikkeneminen Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 14 *x++=*y++ IV.1.2.2. Muistin sidonta Muuttujan tietotyyppi on määrätty -> voidaan varata muistista alue (osoite) muuttujan arvon tallentamiseen Muistin varaaminen = allokointi (allocation) Allokoinnin käänteisprosessi on varatun muistin vapauttaminen = deallokointi (deallocation) Ohjelman muistialue: Staattinen eli globaali alue Pinomuisti Varaamatonta muistia Kekomuisti Yleensä pinomuisti ja kekomuisti kasvavat toisiaan kohti Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 15 *x++=*y++ IV.1.2.2.1. Muuttujan elinikä 1. 2. 3. 4. Muuttujan käyttämän muistin varaamisen ja vapauttamisen välinen aika Muuttujat eliniän perusteella: Staattiset, Pinodynaamiset, Kekodynaamiset (explicit heap dynamic) ja Implisiittisesti kekodynaamiset (implicit heap dynamic) Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 16 *x++=*y++ IV.1.2.2.1.1 Staattiset muuttujat Sidotaan muistiosoitteeseen ennen ohjelman suoritusta, säilyvät sidottuna samaan osoitteeseen ohjelman päättymiseen saakka Käyttö tuo tehokkuutta Aiheuttaa joustamattomuutta Rekursiivisten aliohjelmien toteuttaminen mahdotonta FORTRANin varhaisemmissa versioissa kaikki muuttujat staattisia C:ssä static-määreellä muuttuja staattiseksi Pascal-kielessä ei staattisia muuttujia Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 17 *x++=*y++ IV.1.2.2.1.2. Pinodynaamiset muuttujat Tyyppi staattisesti sidottu, mutta muistiosoite sidotaan ajonaikaisesti esittelylausetta suoritettaessa Perua Algol 60-kielestä: paikallisten muuttujien muisti varattu pinomuistista dynaamisesti Näin toimivat yleisimmät imperatiiviset nykykielet Mahdollistavat rekursion Aliohjelman muuttujalle varataan jokaisella kutsulla kohti uusi muistiosoite Säästää muistia - yhteinen muistialue kaikkien aliohjelmien paikallisille muuttujille Dynaaminen muistinvaraus hidastaa vähän suoritusta Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 18 *x++=*y++ IV.1.2.2.1.3. (Eksplisiittisesti) Kekodynaamiset muuttujat Yleisimmin kekomuistista varattavat muuttujat Varataan kekomuistista ohjelmoijan käskystä ajonaikaisesti Voidaan viitata ainoastaan osoitinmuuttujan tai viitetyypin muuttujan avulla Voidaan varata 1. Operaattorilla (Java ja C++: new) tai 2. Kirjastofunktiolla (C: malloc()) Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 19 *x++=*y++ IV.1.2.2.1.3. (Eksplisiittisesti) Kekodynaamiset muuttujat (2) Muistin vapauttaminen Jotkin kielet: Automaattinen roskien keruu (garbage collection) (esim. Java) Joissakin kielissä ohjelmoijan vastuulla: C++: operaattori delete C: funktio free() Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 20 *x++=*y++ IV.1.2.2.1.3. (Eksplisiittisesti) Kekodynaamiset muuttujat (3) Esimerkki. Kekodynaamisen muuttujan varaaminen (ja vapauttaminen) C ja C++ -kielissä. C: C++: int *pnewint; int *pnewint; pnewint = malloc(sizeof(int)); pnewint = new int; *pnewint = 10; *pnewint = 10; free(pnewint); delete pnewint; Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 21 *x++=*y++ IV.2.2.1.4. Implisiittisesti kekodynaamiset muuttujat Sidotaan kekomuistiin vasta sijoituslauseen yhteydessä Käyttö sallii hyvin joustavan ohjelmoinnin ja erittäin geneerisen koodin kirjoittamisen Monissa skriptikielissä (Perl, JavaScript) merkkijonomuuttujat ja taulukot Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 22 *x++=*y++ IV.1.3. Tyypin tarkistus (type checking) Varmistetaan että ohjelman operaatioissa käytettävien muuttujien tyypit ovat yhteensopivat Dynaaminen tarkistus: tyypit tarkistetaan ajonaikaisesti Staattinen tarkistus: viimeistään käännösaikana Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 23 *x++=*y++ IV.1.3.1. Tyyppiyhteensopivuus (type compatibility) 1. 2. Nimityypin yhteensopivuus (name type compatibility) Muuttujat yhteensopivaa tyyppiä ainoastaan, jos ne on määritelty samannimisen tyyppisiksi Rakennetyypin yhteensopivuus (structure type compatibility) Toteutuu, jos muuttujien rakenne on identtinen Yleensä tyypintarkistukseen käytetään jotain välimuotoa Nimityypin tarkistus liian rajoittava Rakennetyypin tarkistus liian hankala toteuttaa Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 24 *x++=*y++ IV.1.3.1. Tyyppiyhteensopivuus (2) Esimerkki. Pascal-kielisessä määrittelyssä TYPE MYINT = INTEGER; var a: INTEGER; var ma:MYINT; muuttujat a ja ma eivät nimityyppiyhteensopivat, mutta ovat rakennetyyppiyhteensopivat Pascal-kielessä ei käytetä nimityypin yhteensopivuutta, sijoitus ma := a; on laillinen Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 25 *x++=*y++ IV.1.3.1. Tyyppiyhteensopivuus (2) Esimerkki. C: typedef struct { int x; int y; } myStruct; typedef struct { int xx; int yy; } myOtherStruct; myStruct str1; myOtherStruct str2; str1 = str2 ei sallittu: C-kielessä muuten rakenneyhteensopivuus paitsi tietueiden (struct) ja unionien (union) suhteen C++ ja Java käyttävät nimityyppiyhteensopivuutta C++: typedefillä samat tyypit Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 26 *x++=*y++ IV.1.3.2. Vahvasti tyypitetty (strongly typed) kieli 1. Jokaisella muuttujalla oltava hyvin määritelty tyyppi 2. Tyyppivirheet havaitaan aina Pidetään tavoittelemisen arvoisena piirteenä Estää ohjelmointivirheet, jotka johtuvat 1. Vääräntyyppisen muuttujan sijoittamisesta tai 2. Käyttämisestä parametrina aliohjelmakutsussa Varsin harvat kielet täyttävät, jos sovelletaan tiukasti Muunnossäännöt (coercion) Vaikuttavat tyypintarkistukseen Vahvasti tyypitetyssäkin kielessä esim. aritmeettisille operaatioille sääntöjä, jotka rikkovat periaatteessa tyypitystä vastaan Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 27 *x++=*y++ IV.1.3.2. Vahvasti tyypitetty (strongly typed) kieli (2) Pascal vaihtelevia tietueita lukuun ottamatta C:ssä monia tapauksia, joissa tyyppivirhe voi jäädä havaitsematta -> C ei niin vahvasti tyypitetty kuin Pascal C++: tyypintarkistus vahvempi kuin C:ssä, ei vahvasti tyypitetty Ada, Java ja C# (lähes) vahvasti tyypitettyjä Tyyppivirhe voi syntyä ohjelmoijan itse pakottamana Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 28 *x++=*y++ IV.1.4. Näkyvyysalue (scope) Niiden ohjelman lauseiden kokonaisuus, joiden alueella muuttuja on näkyvä (visible), t.s. käytettävissä. Globaali (global) muuttuja: koko ohjelma Paikalliset eli lokaalit (local) muuttujat (ohjelmalohkon tai muun vastaavan yksikön) määritelty kyseisessä yksikössä Ei-paikalliset (nonlocal) muuttujat: Lohkon sisällä näkyvät lohkon ulkopuolella määritellyt muuttujat Voi määräytyä Staattisesti ennen ohjelman suoritusta tai Dynaamisesti ohjelman suorituksen aikana Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 29 *x++=*y++ IV.1.4.1. Staattinen näkyvyysalueen määräytyminen Yleisin menetelmä imperatiivisissa kielissä Muuttujien näkyvyysalueet määräytyvät ennen ohjelman suoritusta ohjelman rakenteen perusteella Rakenteet voivat olla toisilleen alisteisia -> näkyvyysalueiden sisäkkäisyys Aliohjelmalla useimmiten oma näkyvyysalue Nykykielissä voidaan muodostaa uusia näkyvyysalueita määrittelemällä ohjelmalohkoja (blocks) C: aaltosulkujen välinen osa on lohko Kootun lauseen (compound statement) sisällä ei voida esitellä uusia muuttujia (kuten lohkossa) Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 30 *x++=*y++ IV.1.4.1. Staattinen näkyvyysalueen määräytyminen Jos sisemmissä näkyvyysalueissa esitellään samannimisiä muuttujia kuin alueen sisältävässä lohkossa, on ulomman alueen muuttuja piilotettava sisemmässä lohkossa Pascalissa BEGIN … END –pari määrittelee kootun lauseen -> Pascalissa ei lohkoja, aliohjelmilla oma näkyvyysalue ja aliohjelmat voivat olla sisäkkäisiä Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 31 *x++=*y++ IV.4.2. Dynaaminen näkyvyysalueen määräytyminen Hyvin harvat ohjelmointikielet käyttävät Esim. APL, SNOBOL, Perlissä mahdollinen Perustuu aliohjelmien suoritusjärjestykseen -> aktiivisen aliohjelman muuttujat näkyvät kaikille aliohjelmille, joita kutsutaan kyseisen aliohjelman käynnistämisen jälkeen Ongelmia: Koodin luettavuus huononee Ohjelman luotettavuus heikkenee Etu: Aliohjelmien tiedonvälityksen helpottuminen Haitat suuremmat -> ei juuri käytetä Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 32 *x++=*y++ IV.1.5. Yleistä tietotyypeistä Tietotyyppi (data type): Joukko arvoja, joihin liittyy joukko näihin arvoihin sovellettavia operaatioita Keskeinen käsite ohjelmoinnissa, koska luokittelee ohjelman datan Primitiivinen tietotyyppi (primitive data type): määrittelemiseen ei käytetä muita tietotyyppejä Lähes jokaisessa kielessä määritellään joukko primitiivisiä tietotyyppejä valmiiksi Louden: yksinkertainen (simple) tietotyyppi: tietotyyppi, jolla ei ole muuta rakennetta kuin sisäänrakennettu aritmeettinen tai peräkkäinen rakenne Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 33 *x++=*y++ IV.1.6. Primitiiviset tietotyypit Jaetaan tyypillisesti numeeriseen, loogiseen ja merkkitietoon Useissa varhaisissa ohjelmointikielissä ainoat primitiiviset tietotyypit numeerisia Alkuperäisessä BASIC-kielessä ainoastaan liukulukutyyppi Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 34 *x++=*y++ IV.1.6.1. Numeeriset tyypit Kokonaislukutyyppi yleisin numeerinen primitiivinen tietotyyppi Pituus voi vaihdella; 32 bittiä nykyään yleisin Liukulukutyyppi (floating-point type) Esittää reaalilukuja (likimääräisesti) tietokoneessa Esitetään useimmiten IEEE:n standardilla 754 Diskreettien rakenteiden kurssissa esityksestä tarkemmin Desimaalityyppi Tietynmittaisille desimaaliluvuille tarkka esitys Rajoittaa esitettävien lukujen kokoa Käytössä C#-kielessä (decimal), pituus 128 bittiä Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 35 *x++=*y++ IV.6.2. Looginen tietotyyppi (boolean, logical type) Periaatteessa tietotyypeistä yksinkertaisin - tarvitsee vain arvot tosi ja epätosi Esitystapa vaihtelee C: mikä tahansa nollasta poikkeava lukuarvo tulkitaan todeksi ja nolla epätodeksi. Yleensä mahdollisuus saada arvot true ja false Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 36 *x++=*y++ IV.1.6.3. Merkkityypit Merkkitieto esitetään tietokoneen sisäisesti numeerisina koodeina. Aiemmin yleisin koodauskäytäntö ASCII (American Standard Code for Information Interchange) Nykyään UNICODE (2 tavua/merkki) yleistyy, esimerkiksi Java, C#: char kahden tavun kokoinen Merkkijonotyyppi (character string type) Useimmiten ei ole primitiivinen FORTRANissa (77 jälkeen) ja BASICissä primitiivisiä Monessa kielessä valmiiksi määriteltyjen perustietotyyppien joukossa Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 37 *x++=*y++ IV.1.6.3. Merkkityypit (2) Merkkijonomuuttujien tyypit: Staattisen pituuden merkkijonot: aina täynnä merkkejä. Jos lyhempi merkkijono sijoitetaan pitempään, loppu täytetään tyhjillä merkeillä Pituudeltaan dynaamiset, mutta rajoitetut: merkkejä voi olla mielivaltainen määrä, mutta sitä rajoittaa varattu tila Pituudeltaan dynaamiset: vaihtelevan pituisia ilman ylärajaa Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 38 *x++=*y++ IV.1.6.3. Merkkityypit (3) C-kielen merkkijono Merkkiin ’\0’ päättyvä yksiulotteinen merkkitaulukko Voidaan käyttää myös C++:ssa, suositeltavampaa käyttää standardikirjaston string-luokkaa Pituudeltaan dynaaminen, mutta rajoitettu Merkkijono-operaatiot kirjastofunktioilla Pascal –kielen merkkijonot Merkkien muodostamia taulukoita Staattisia pituudeltaan Vain samanpituisten merkkijonojen järjestystä voidaan vertailla relaatio-operaattoreilla Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 39 *x++=*y++ IV.1.6.3. Merkkityypit (4) FORTRANin merkkijonot Primitiivinen tyyppi, esittely (FORTRAN77) CHARACTER*10 JONO Staattisia pituudeltaan Javan merkkijonot Object-luokasta periytyvän String-luokan ilmentymiä, joten jossakin mielessä primitiivinen tyyppi Oikeastaan ei kieleen sisäänrakennettu tyyppi, vaan määritellään java.lang-paketissa Dynaamisia pituudeltaan Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 40 *x++=*y++ IV.1.6.4. Ordinaalityyppi (ordinal type) Arvot voidaan yhdistää positiivisiin kokonaislukuihin luonnollisella tavalla Useissa kielissä käyttäjän määrittelemiä ordinaalityyppejä; eivät täytä primitiivisen tyypin määritelmää, ovat kuitenkin yksinkertaisia tietotyyppejä Luetellut tyypit (enumeration types) Rajoitetut tyypit (subrange type) Luetellun tyypin muuttujien arvot määritellään luettelemalla symbolisiksi vakioiksi Tyyppiin liittyy järjestys -> arvoja voidaan vertailla Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 41 *x++=*y++ IV.1.6.4. Ordinaalityyppi (2) Esimerkki. Viikonpäivät lueteltuna tyyppinä Pascalilla: TYPE paiva = (su,ma,ti,ke,tor,pe,la); Sama C-kielellä: enum paiva {su, ma, ti, ke, tor, pe, la}; Vertailu Pascalissa: var ps,pt:paiva; begin ps:=su; pt:=tor; if pt > ps then begin (* lauseet *) end; end. Ari Vesanen, Tietojenkäsitttelytieteiden laitos Vertailu C –kielessä: enum paiva x = su,y = tor; if(x < y) { // Lauseet } 815338A Ohjelmointikielten periaatteet, Muuttujat 42 *x++=*y++ IV.1.6.4. Ordinaalityyppi (3) Luetellun tyypin etuja Määritellyt tyypit ovat helposti tulkittavissa Rajojen ylityksen virhemahdollisuudet poistuvat mikäli tarkistetaan lueteltujen tyyppien yhteensopivuus Ellei lueteltua tyyppiä, on käytettävä numeerisia muuttujia kuvaamaan lueteltuja tyyppejä -> Tähän verrattuna: 1. Koodin luettavuus paranee 2. Luotettavuus paranee: Kahden eri tyypin muuttujat eivät voi erehdyksessä sotkeutua toisiinsa, muuttujilla ei voida tehdä aritmeettisia operaatioita Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 43 *x++=*y++ IV.1.6.4. Ordinaalityyppi (4) Javassa versiosta 1.5 lähtien enum-tyyppi Esim. enum Paiva { SUNNUNTAI, MAANANTAI, TIISTAI, KESKIVIIKKO, TORSTAI, PERJANTAI, LAUANTAI } Vakiot olioita -> monipuolisempi kuin aiemmin mainitut Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 44 *x++=*y++ IV.1.6.4.1 Rajoitettu tyyppi Jonkin ordinaalityypin peräkkäisten arvojen osajono Ensimmäiseksi Pascalissa Voidaan käyttää myös Adassa Pascalissa: TYPE allesata = 1..100; pienetkirjaimet = ’a’..’z’; Käyttäminen lisää luotettavuutta mikäli kääntäjä tarkistaa virheelliset operaatiot Ei käytetä muissa yleisissä kielissä Pascalin ja Adan lisäksi Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 45 *x++=*y++ IV.1.7. Rakenteelliset tietotyypit 1. 2. 3. 4. Koostuvat yhdestä tai useammasta yksinkertaista tai rakenteista tyyppiä olevasta komponentista Taulukot Tietueet Unionit Pascal-kielen joukkotyyppi Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 46 *x++=*y++ IV.1.7.1. Taulukot Yleisimmin käytettyjä tietorakenteita Kiinteä määrä samaa tyyppiä olevia tietoalkioita, jotka sijaitsevat peräkkäin yhtenäisessä muistialueessa -> Käyttö tehokasta, koska minkä tahansa alkion muistiosoite voidaan suoraan laskea Alkiot mitä tahansa tietotyyppiä, joko primitiivistä, kielessä määriteltyä tai ohjelmassa määriteltyä Alkioihin viitataan taulukon nimellä ja alkion indeksillä taulukossa C –pohjaisissa kielissä indeksit alkavat nollasta Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 47 *x++=*y++ IV.1.7.1. Taulukot (2) Esimerkki: Kokonaislukutaulukko eri kielissä C: int lukutaulu[50]; lukutaulu[10] = 34; Pascal: VAR lukutaulu: ARRAY [0..49] OF INTEGER; begin lukutaulu[10] := 34; FORTRAN: INTEGER LTAULU(0:49) LTAULU(10) = 34; Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 48 *x++=*y++ IV.1.7.1.1 Taulukkojen tyypit Neljä tyyppiä indeksien rajojen sidonnan ja muistin allokoinnin tapahtuma-ajan perusteella 1. Staattiset taulukot (static arrays) Rajat sidotaan staattisesti, taulukon muisti varataan staattisesti Suoritusajan tehokkuus 2. Kiinteät pinodynaamiset taulukot (fixed stackdynamic arrays) Rajat sidotaan staattisesti, muisti varataan ajonaikaisesti pinomuistista Muistin käyttö tehokkaampaa kuin staattisilla taulukoilla Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 49 *x++=*y++ IV.1.7.1.1 Taulukkojen tyypit (2) 3. Pinodynaamiset taulukot (stack-dynamic arrays) Rajat sidotaan dynaamisesti, muisti varataan pinomuistista. Molemmat pysyvät vakioina taulukon elinajan Taulukon kokoa ei tarvitse tietää etukäteen -> lisää joustavuutta 4. Kekodynaamiset taulukot (heap-dynamic array) Rajat sidotaan dynaamisesti, taulukon muisti varataan dynaamisesti kekomuistista Taulukon rajat ja varattu muisti voivat muuttua sen elinaikana -> joustavin tyyppi Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 50 *x++=*y++ IV.1.7.1.2. Taulukkotyypit eri kielissä Staattiset taulukot FORTRANin taulukot (versio 77 ja ennen) REAL REAALILUVUT(4) C/C++-kielessä taulukko voidaan esitellä staticmääreellä staattiseksi Kiinteät pinodynaamiset taulukot Yleisimmin pinosta varattavat taulukot, esim. C, C++ (aiemmat versiot), Pascal Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 51 *x++=*y++ IV.1.7.1.2. Taulukkotyypit eri kielissä (2) Pinodynaamiset taulukot Aiemmin harvinaisia imperatiivisissa kielissä Adassa alusta saakka AR_LEN := 25; declare AR: array(1..AR_LEN) of INTEGER; C/C++-kielissä uusimmissa versioissa sallittu int i,koko = 15; for(i=5; i < 10; i++){ int taulu[koko]; // Nykyään käy C/C++:ssa } Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 52 *x++=*y++ IV.1.7.1.2. Taulukkotyypit eri kielissä (3) Kekodynaamiset taulukot Javan, C#:n kaikki taulukot int[] lukutaulu = new int[50]; C/C++ -kielissä varataan kuten muutkin dynaamiset muuttujat C:ssä malloc C++:ssa new int *lukutaulu; lukutaulu = malloc(50*sizeof(int)); lukutaulu[10] = 34; free(lukutaulu); Ari Vesanen, Tietojenkäsitttelytieteiden laitos int[] lukutaulu; lukutaulu = new int[50]; lukutaulu[10] = 34; delete[] lukutaulu; 815338A Ohjelmointikielten periaatteet, Muuttujat 53 *x++=*y++ IV.1.7.1.3. Moniulotteiset taulukot Tarvitaan useampia indeksejä viittaamaan taulukon alkioihin Yleensä tarkoittaa sitä että taulukon ensimmäisen indeksin alkiot (n-1) ulotteisia taulukoita jne. Esimerkki: Pascalissa ARRAY[1..6,3..21,0..3] OF INTEGER on sama kuin ARRAY[1..6] OF ARRAY[3..21] OF ARRAY[0..3] OF INTEGER Yleensä dimensioille ei ylärajaa Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 54 *x++=*y++ IV.1.7.1.4. Taulukon alustaminen Pascalissa ei mahdollista alustaa taulukkoa sen esittelyn yhteydessä FORTRANissa voidaan alustaa DATA –lauseella: REAL REAALILUVUT(4) DATA REAALILUVUT/1.1,2.5,99.3,12.2234/ C, C++, C#, Java: Mahdollista esitellä ja alustaa taulukko luettelemalla sen alkiot ilman dimensioiden määrittelemistä, esimerkiksi int vektori[] = {2,4,6,8}; luo nelipaikkaisen taulukon Altistaa virheille Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 55 *x++=*y++ IV.1.7.1.4. Taulukon alustaminen Useampiulotteinen taulukko C/C++ -kielessä ainoastaan niin, että vain yksi dimensio jätetään vapaaksi: int matriisi[][4] = {{1,2,3,4},{2,3,4,5}}; Javassa sallittu int matrix[][] = {{1,2,3,4},{2,3,4,5}}; C# -kielessä onnistuu, kirjoitettava int[,] matriisi = {{1,2,3,4},{2,3,4,5}}; Javassa luotu taulukko aina alustettu oletusarvoilla, C/C++: voi sisältää satunnaista dataa Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 56 *x++=*y++ IV.1.7.1.5. Taulukko-operaatiot Yleensä kielissä ei juuri operaatioita, jotka käsittelevät taulukkoa itsenäisenä yksikkönä Tavallisesti toteutettu kirjastofunktioina tai sisällytetty luokkakirjastoihin FORTRAN 90: Sisältää taulukko-operaatioita, esimerkiksi taulukkojen summan (alkioittain) Ada: Mahdollista viitata taulukon osiin indeksirajoilla -> voidaan käsitellä matriisin rivejä tai sarakkeita vektoreina Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 57 *x++=*y++ IV.1.7.1.5. Taulukko-operaatiot (2) APL Laaja kokoelma kieleen rakennettuja vektori- ja matriisioperaatioita Suunniteltu tällaisten tehtävien ohjelmoimiseen Sisältää operaattorit mm. matriisin transponointiin, käänteismatriisin etsimiseen, vektoreiden piste- ja ristituloille Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 58 *x++=*y++ IV.1.7.2.Tietueet (records) Erityyppisten tietoalkioiden kooste, jossa tiettyyn alkioon eli kenttään (field) viitataan sen nimellä Muodostetaan loogisia kokonaisuuksia, jotka koostuvat erilaisista tietoalkioista Aiemmin sisältynyt kaikkiin yleisiin kieliin Paitsi FORTRANiin Oliokielissä ei tarvetta (C++:ssa mukana) Muisti varataan peräkkäisistä muistipaikoista Yleisarvio: Käyttökelpoisia tietotyyppejä Toteutus varsin suoraviivainen eikä sisällä ongelmia yleensä missään ohjelmointikielessä Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 59 *x++=*y++ IV.1.7.2.Tietueet (2) Esimerkki. C-kielessä määrittely struct Asiakas { char nimi[25]; int tilinro; }; esittely ja käyttö (varataan pinosta): varataan dynaamisesti : struct Asiakas a; strcpy(a.nimi,"Huijari"); a.tilinro = 21; Ari Vesanen, Tietojenkäsitttelytieteiden laitos struct Asiakas* pa; pa = malloc( sizeof(struct Asiakas)); strcpy(pa->nimi,"Huijari"); pa->tilinro = 21; 815338A Ohjelmointikielten periaatteet, Muuttujat 60 *x++=*y++ IV.1.7.2.Tietueet (3) Pascal-esimerkki TYPE asiakas = RECORD nimi: PACKED ARRAY[0..24] OF CHAR; tilinro: INTEGER; END; VAR a:asiakas; BEGIN a.nimi := 'Huijari'; a.tilinro := 21; Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 61 *x++=*y++ IV.1.7.3. Unioni Vastaa tietotyyppien unionia Muuttujassa vain yksi kenttä, joka voi olla tyypiltään jokin annetuista tietotyypeistä -> muuttujan sisältämä tiedon tyyppi voi vaihdella ohjelman suorituksen aikana Käyttö voi olla hyödyllistä esimerkiksi kirjoitettaessa koodia, jonka on tarkoitus toimia eri ympäristöissä Esim. kokonaisluku voi olla 16-, 32- tai 64-bittinen Voidaan kirjoittaa koodia, jossa tehdään eistandardimaisia tyypinmuunnoksia -> Riski: voi aiheuttaa monia ongelmatilanteita Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 62 *x++=*y++ IV.1.7.3. Unioni (2) Tyypintarkistusta tyyppiin liitettävä tietokenttä, jonka perusteella päätellään, mikä kulloinkin talletettu tyyppi Valitsinkenttä (tag field, discriminant) C ja C++ -kielissä ns. vapaa unioni (free union). Ei valitsinkenttää kertomassa, minkä tyyppinen tieto on tallennettu muuttujaan Muuttujalle varataan tila suurimman mahdollisen tietotyypin mukaan Ei tyypintarkistusta -> ohjelmoija vapaa muuntamaan tietotyypin miksi tahansa vaihtoehdoista Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 63 *x++=*y++ IV.1.7.3. Unioni (3) Pascal-kielessä kutsutaan vaihtelevaksi tietueeksi Tietueessa kiinteä ja vaihteleva osa. Kiinteä osa aina samanlainen, vaihteleva osa voi sisältää eri tietotyypin arvoja Adassa samankaltainen vaihtuvan tietueen tyyppi kuin Pascalissa Parannettu: Valitsinkenttää ei voi muuttaa muuttamatta koko tietuetta-> unionityypin toteutuksen tulisi olla turvallinen Ongelmallisuuden vuoksi jätetty toteuttamatta monissa kielissä Esim. Java, C# Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 64 *x++=*y++ IV.1.7.3. Unioni (4) C-kielinen esimerkki union IntMerkki { int myInt; char myChar; }; int arvo; union IntMerkki imer; imer.myChar = 'A'; arvo = imer.myInt; // arvo satunnainen Ari Vesanen, Tietojenkäsitttelytieteiden laitos imer.myInt = 5432; jolloin imer.myChar == ’8’; Mahdollista kiertää C-kielen tyypintarkistus -> turvallisuus jää ohjelmoijan vastuulle Neuvo: Käytä unioneja C/C++ ohjelmassa aina tarkasti harkiten 815338A Ohjelmointikielten periaatteet, Muuttujat 65 *x++=*y++ IV.1.7.4. Joukkotyyppi (set) Tyypin muuttujat voivat sisältää järjestämättömän kokoelman jonkin ordinaalityypin muuttujan erillisiä arvoja -> mallinnetaan matemaattista joukkoa Yleisistä (imperatiivisista) ohjelmointikielistä ainoastaan Pascalissa Kirjastoluokkana C++:ssa, C#:ssa ja Javassa Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 66 *x++=*y++ IV.1.7.4. Joukkotyyppi (2) Esimerkki (Pascal) TYPE paiva = (su,ma,ti,ke,tor,pe,la); paivaset = SET OF paiva; VAR joukko:paivaset; BEGIN joukko := [ma,pe,ke]; IF pe IN joukko THEN WRITELN('PAIVA OLI JOUKOSSA') ELSE WRITELN('PAIVA EI OLLUT JOUKOSSA'); Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 67 *x++=*y++ IV.1.8. Osoitintyyppi (pointer type) Muuttujien arvot muistiosoitteiden arvoja ja lisäksi erityinen arvo null (tai nil) Muuttujia kutsutaan yleensä osoittimiksi (pointers) Tarvitaan käsittelemään dynaamisia muuttujia ja erityisesti dynaamisia tietorakenteita Lähes kaikissa imperatiivisissa ohjelmointikielissä mahdollista käyttää osoittimia Poikkeus FORTRAN: tietorakenteiden käsittely hankalaa Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 68 *x++=*y++ IV.1.8. Osoitintyyppi (2) Muuttuja sisältää muistiosoitteen -> muuttujana aina samantyyppinen Ohjelmoinnin kannalta tiedettävä osoitinmuuttujan tarkoitetyyppi (reference type) = minkälaiseen muuttujaan osoittaa Muuttuja, johon osoitinmuuttujan arvo kulloinkin viittaa, on sen tarkoitemuuttuja Osoitinmuuttuja voi viitata mihin tahansa tietotyyppiin, myös toiseen osoittimeen Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 69 *x++=*y++ IV.1.8. Osoitintyyppi (3) Osoitin esitellään kirjoittamalla tarkoitetyyppi ja sen jälkeen tyyppioperaattori ennen muuttujan nimeä C/C++ -kielessä * Pascalissa ^ Adassa access Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 70 *x++=*y++ IV.1.8.1. Osoittimien tärkeimmät operaatiot 1. Sijoitus (assignment) Sijoittaa osoitinmuuttujan arvoksi jonkin muistipaikan 2. Muistipaikan sisältöön viittaaminen (viittauksen purkaminen, dereferencing) Toteutetaan yleensä jollakin sisältö-operaattorilla 3. Muuttujien vertailu, ts. sen vertaaminen osoittavatko ne samaan muistipaikkaan Pascalissa ainoat sallitut operaatiot osoittimille Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 71 *x++=*y++ IV.1.8.1. Osoittimien tärkeimmät operaatiot (2) Esimerkki. C-kielisessä ohjelmassa voisi kokonaislukumuuttuja luku olla muistipaikassa 9876 ja sen arvo olla 1000. Olkoon toinen kokonaislukumuuttuja toinenluku esitelty ohjelmassa. Tällöin koodi int *ptr; ptr = 9876; toinenluku = *ptr; kopioi muistipaikasta 9876 arvon 1000 muuttujan toinenluku arvoksi, ts. tekee sijoituksen toinenluku = luku; Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 72 *x++=*y++ IV.1.8.1. Osoittimien tärkeimmät operaatiot (3) Esimerkki. Pascal: VAR r:REAL; VAR pr,prtoka:^REAL; (* Osoittimia *) BEGIN NEW(pr); (* Varataan muisti *) NEW(prtoka); (* Varataan muisti *) pr^ := 21.1; (* Sijoitetaan arvo *) prtoka^ := 11.1; (* Sijoitetaan arvo *) r := pr^; (* Nyt r saa arvon 21.1 *) prtoka := pr;(*Osoittavat nyt samaan paikkaan*) prtoka^ := 33.3;(* pr^ ja prtoka^ kumpikin 33.3 *) Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 73 *x++=*y++ IV.1.8.2. C/C++ -kielten osoittimet Voi käyttää hyvin monipuolisesti -> ohjelmoijalle monenlaisia mahdollisuuksia, mutta virheellinen käyttö helppoa Muuttujan muistiosoite voidaan selvittää ja sijoittaa osoitinmuuttujaan, esimerkiksi int muuttuja = 20; int *pm; pm = &muuttuja; *pm = 55; // Nyt muuttuja == 55 Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 74 *x++=*y++ IV.1.8.2. C/C++ -kielten osoittimet (2) C-kielessä tyypintarkistus väljä: float f = 0.46875; int *pif; float *pf; pif = &f; pf = pif; C:ssä sallittu, mutta ei C++ :ssa Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 75 *x++=*y++ IV.1.8.2. C/C++ -kielten osoittimet (3) Osoitinaritmetiikka sallittu Jos ptr on osoitintyypin muuttuja, ptr+1 osoittaa seuraavan tarkoitetietotyypin muuttujan osoitteeseen. Esimerkiksi: char* ptr; -> ptr+1 osoittaa seuraavaan tavuun int* ptr; -> ptr+1 osoittaa neljän tavun päähän C/C++ -kielissä geneerinen osoitintyyppi void* voi osoittaa minkätyyppiseen muuttujaan tahansa Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 76 *x++=*y++ IV.1.8.2. C/C++ -kielten osoittimet (4) Esimerkki. Taulukon läpikäynti osoittimilla C/C++:ssa char c; int ki; double rl; int index; char merkit[4] = {'a','b','c','d'}; int kokoluvut[4] = {1,2,3,4}; double rluvut[4] = {1.1,2.2,3.3,4.4}; char* pc = merkit; int* pi = kokoluvut; double* pd = rluvut; Ari Vesanen, Tietojenkäsitttelytieteiden laitos for(index=0;index < 4; index++) { c = *(pc + index); ki = *(pi + index); rl = *(pd + index); printf("Merkki on %c, kokonaisluku on %d, reaaliluku on %e\n", c,ki,rl); } 815338A Ohjelmointikielten periaatteet, Muuttujat 77 *x++=*y++ IV.1.8.3. Osoitintyypin ongelmia 1. Moninimisyys Seuraa väistämättä osoittimien sallimisesta Osoittimet voidaan asettaa osoittamaan samaan muistipaikkaan Katsotaan yleensä haitallisiksi 2. Roikkuvat osoittimet Osoittavat jo vapautettuun muistiin Käytettäessä arvo satunnainen Voi johtaa hankalasti löydettäviin virheisiin Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 78 *x++=*y++ IV.1.8.3. Osoitintyypin ongelmia (2) 3. Muistivuoto (memory leakage) Ohjelmassa varattua dynaamista muistia ei vapauteta Syntyy usein hävittämällä viite dynaamiseen muuttujaan Voi johtaa kekomuistin loppumiseen ja ohjelman kaatumiseen Osoitintyypin virheet yleisimpien C/C++ -ohjelmien virheiden joukossa Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 79 *x++=*y++ IV.1.8.4. Viitetyyppi (reference type) Osoitintyypin muuttujien ongelmallisuuden takia ainakin Javassa ja C#:ssa luovuttu niistä ja korvattu viitteillä Aluksi C++ -kieleen lähinnä toteuttamaan viitetyypin parametrinvälitys funktioille Viitetyypin muuttujan avulla voidaan luoda muuttujalle alias Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 80 *x++=*y++ IV.1.8.4. Viitetyyppi (2) C++ -kielen viite: vakio-osoitin, jolle tehdään implisiittinen muistiosoitteeseen viittaaminen On vakio -> alustettava jollakin muistiosoitteen arvolla, viittaa samaan muistiosoitteeseen koko elinaikansa Esimerkki float f; float &ref_f = f; tekee muuttujista f ja ref_f aliaksia -> sijoituslause ref_f = 2.78; sijoittaa muuttujan f arvoksi 2.78. Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 81 *x++=*y++ IV.1.8.4. Viitetyyppi (3) Java yleistänyt viitemuuttujan tyyppiä -> osoittimet voitu korvata viitteillä Kaikki luodut oliot Javassa varataan dynaamisesti kekomuistista, olion nimi on viite olioon Osoitinaritmetiikka ei sallittua Eivät ole vakio-osoittimia, viite voidaan asettaa osoittamaan toiseenkin olioon Muistivuotojen estämiseksi Javassa roskien keruu (garbage collection) huolehtii siitä, että oliot vapautetaan, kun niihin ei enää ole viittauksia Ari Vesanen, Tietojenkäsitttelytieteiden laitos 815338A Ohjelmointikielten periaatteet, Muuttujat 82