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
1 C-kielen ohjelmointi ja toiminta Ohjelman kääntäminen, ajaminen ja debuggaus C-kielen syntaksi ja rakenne 2 Muuttujat ja tietotyypit C-kielessä 3 Kehitystyökalut Käännösaikaiset työkalut Ajonaikaiset työkalut
C-ohjelmointi
Toiminnallisia eroja C-ohjelmat pitää kääntää ja ajaa erikseen C-kielessä on staattinen tyypitys eval toiminnallisuutta ei ole missään muodossaan Käytännössä mahdotonta toteuttaa Kaikki funktion parametrit välitetään arvoina Kaiken ohjelmakoodin on oltava funktioiden sisällä Ainoastaan määritelmät ja esittelyt on sallittu funktioiden ulkopuolella
Kääntäminen Python ohjelmat ajetaan yleensä tulkilla ja C-ohjelmat käännetään C-ohjelma pitää kääntää jokaiselle kohdealustalle erikseen Pythonissa tulkki mahdollistaa hyvän ajonaikaisen virheenkäsittelyn C-ohjelmaa ei voi ajaa kääntämättä C:ssä ei ole hyvää ajonaikaista virheenkäsittelyä Sellainen on kuitenkin mahdollista saavuttaa erillisillä ohjelmilla C-ohjelman kääntämisessä on kolme päävaihetta 1 Esikääntäminen 2 Varsinainen kääntäminen 3 Linkkaus
Ohjelman ajaminen Ohjelma voidaan ajaa kirjoittamalla oikeassa hakemistossa./ohjelma Pythonissa: python ohjelma.py Sellaisenaan, ohjelma ajetaan suoraan käyttöjärjestelmän alla Ajonakainen debuggaus on mahdollista erillisillä ohjelmilla gdb valgrind gcov
Kertaus C-kielen syntaksista Toisin kuin Pythonissa, välilyönnit ja rivinvaihdot ovat hyvin pitkälle pelkkä tyylikysymys C-kielessä Pakollisia ainoastaan muutamassa kohdassa Sisennys on C-kielessä täysin tyyliseikka Kääntäjä ei välitä tai saa välittää sisennyksistä missään osassa koodia Yleisesti, C-kielen syntaksi sisältää enemmän erikoisia merkkejä kuin mitä Pythonissa on Lause ja lohkorajat ilmaistaan niille varatuilla merkeillä
Puolipiste C-kielessä puolipiste lopettaa lauseen Joissain tapauksissa kuten if- ja while-rakenteissa, lause on rajattu sulkujen sisälle Monet syntaksivirheet ovat puuttuvia puolipisteitä tai puolipisteitä kummallisissa paikoissa Puolipisteellä ja kaksoispisteellä ei ole mitään tekemistä keskenään
Lohkot Lohkojen toimintaperiaate on Pythonissa ja C-kielessä hyvin samanlainen Useamman lauseen tai rakenteen kokonaisuus C-kielessä lohkot ilmaistaan aina aaltosulkeilla { ja } Sisennyksellä tai välilyönneillä ei ole mitään merkitystä Lohkossa voi olla yksi tai useampia lauseita C-kielessäkin sisennys yleensä noudattaa lohkorakenteita Lohko voi olla koodissa myös ilman mitään ohjausrakannetta Kaksoispisteellä on oma merkityksensä C-kielessä switch-case-rakenteissa ja goto:n kanssa
Olio-ohjelmoinnista ja olioista C-kielessä Ei ole olioita missään muodossa Ei ole jäsenfunktioita, eli missään asiassa itsessään ei ole toiminnallisuutta mukana C-kielessä tieto ja toiminnallisuus ovat täysin erillään toisistaan Pistettä käytetään tietuiden kenttien ilmaisemiseen Hieman sama ajatus kuin olioilla mutta erittäin merkittävillä eroilla Käsitellään myöhemmin tarkemmin Pistettä ei kannata käyttää vielä mihinkään
Tulosteen muotoilu Python 1 print " Arvo on %d" % 4 2 print "%d+%d=%d" % (1,2,3) 3 print " Liukuluku %.2 f" % (2.0 / 3.0) C 1 printf (" Arvo on %d", 4); 2 printf ("%d+%d=%d", 1,2,3); 3 printf (" Liukuluku %.2 f", 2.0 / 3.0);
Tulosteen muotoiluista Pythonin print ja C-kielen sprintf toimivat näennäisesti samalla tavalla Näissä on kuitenkin merkittäviä eroja: C-kielessä tulosteen muotoilun tekee printf-funktio Pythonissa tulosteen muotoilu on merkkijonon ominaisuus C-kielen merkkijonoissa tällaista toiminnallisuutta ei ole Käytännössä suurin ero on kuitenkin vain syntaktinen Syötteen lukeminen tapahtuu lähes kuten tulostaminen Erona &-merkki parametreissa Tiettyjä eroja muotoilumääreessä
Muuttujien määrittely Python 1 var1 = 17 2 var2 = 4.5 3 var3 = "a string " C 1 int var1 = 17 2 double var2 = 4.5 3 const char * var3 = "a string "
Muuttujien määrittelystä Muuttujilla on C-kielessä aina tyyppi Tyyppi on aina mainittava määrittelyissä ja on muuttumaton C-kielessä alaviivalla ( ) alkavia muuttujannimiä ei yleensä käytetä Täysin tavallisia muuttujia mutta varattu muuhun käyttöön C-kielessä merkkijonot toimivat hyvin eri tavalla kuin Pythonissa Käsitellään myöhemmin Osa tyypeistä on keskenään yhteensopivia mutta suurin osa ei ole Tyyppijärjestelmän voi käsittää palikkatestinä Tyyppimuunnos on mahdollista pakottaa mutta se ei yleensä kannata
Tyyppimuunnokset Python 1 var1 = int (1.4) # 1 2 var2 = float (4) # 4.0 3 var3 = int ("12") # Legal C 1 int var1 = ( int )1.4 2 double var2 = ( double )4 /* Implicit */ 3 int var3 = ( int )"12" /* Legal but will fail */
Tyyppimuunnoksista Syntaktinen ero Python: tyyppi(arvo) C: (tyyppi)arvo Arvon ympärillä voi tarvittaessa olla myös sulut C-kielen tyyppimuunnoksissa ei ole merkittävästi toiminnallisuutta Varsinkaan kokonaisluku-merkkijonomuunnosta ei voi tehdä tyyppimuunnoksilla Kääntäjä päästää muunnoksen läpi mutta lopputulos voi olla yllättävä Yleisesti tyyppimuunnoksia kannattaa välttää
Tietotyypeistä C-kielen perustietotyypeissä ei ole itsessään toiminnallisuutta Käytännössä lukuarvoja ja osoitinmuuttujia Yksinkertainen ajattelutapa on käsittää muuttujat numeroina Kokonaislukuina tai reaalilukuina Toimii tavallaan myös osoitinmuuttujille
Kehitystyökaluista Kurssilla ei käytetä integroitua kehitysympäristöä (IDE) Kokoelma erilaisia työkaluja: Editori koodin kirjoittamiseen Yllättävän merkittävä osa ohjelmointia Kääntäjä Ajonaikaiset työkalut
Yleisimmät tekstieditorit
Tekstieditorin merkitys Tekstieditori kannattaa valita oman maun mukaan Ilman aiempaa kokemusta emacs ja vim kannattaa jättää rauhaan Tärkeimmät tekstieditorin ominaisuudet ohjelmoinnissa Rivinumerointi Koodin värjäys Vastinsulkujen esitys Koodin sisennys Esittelyssä Kate tekstieditori ja sen suositellut asetukset
Kääntäjän merkitys Kääntäjä kannattaa nähdä kaverina eikä vihollisena Varoitukset ovat käytännössä aina virheitä ohjelmassa Ennakoivat ajonaikaisia virheitä Kääntäjän virheilmoitusten laatu vaihtelee merkittävästi Osa on hyvin selkeitä Toiset taas eivät Kaikki käännösvaroitukset kannattaa korjata Esittelyssä Yleisimpien GCC käännösvirheiden tulkinta, syy ja korjaus
Ajonaikaiset työkalut Debuggeri GDB Interaktiivinen työkalu Mahdollistaa ohjelman suoritukset tutkimisen ja muuttamisen Valgrind Valvottu hiekkalaatikko Tuottaa raportin ohjelman suorituksesta GCov Tuottaa kattavuusanalyysin ohjelman suorituksesta U2 yhteydessä on erityinen kehitystyökaluluento Pikaesittelyssä Valgrindin käyttö ja virheiden tulkinta
GCov Kattavuusanalyysi Mitkä ohjelman rivit suoritetaan ajossa Käytetään testauksen apuna ja harjoitustehtävissä Testiohjelman tarkoituksena on testata ohjelman koko toiminnallisuus Suorittaa kaikki ohjelman rivit ainakin kerran Vaatii käännösoptiot: -fprofile-arcs -ftest-coverage Ohjelma pitää myös ajaa kerran gcov <lähdekooditiedosto> tulostaa kattavuusanalyysin Esittelyssä GCov käyttö