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 Parkkola Ella Hakala Oskar Tainio Pyry Aalto
Aikatauluista Viikolla 3.4. 7.4. ei harjoituksia (tenttiviikko) Sen jälkeen kaksi viikkoa harjoituksia 10.4. 21.4. 10. tehtäväkierros Apua ohjelmointitehtävään
Ohjelmointitehtävä Neljä vaihtoehtoista aihetta, kullekin valittu yksi Toteuta kokonainen ohjelma tyhjästä Palauta ohjelma MyCoursesiin tiedostopalautuksena Max. 3.c tai.h päätteistä tiedostoa Ohjelman tulee toimia Aallon Linux-järjestelmillä Arviointi pisteytyksellä 0 10 pistettä Kriteerit tehtävänannon yhteydessä Vähintään 5 pistettä vaaditaan Muunnetaan osa-arvosanaksi, paino 20% kokonaisarvosanasta Arviointi ihmisvoimin: myös tyyli ratkaisee
Ohjelmointikoe Järjestetään joukossa mikroluokkia 3.5. 8.5. Muista ilmoittautua! Osallistuminen muuten mahdotonta Ilmoittaudu vain yhteen! Poistamme duplikaatti-ilmoitukset ennen tenttiä Säännöt kuten muissakin tenteissä Kesto kolme tuntia Poistua saa ensimmäisen tunnin jälkeen Tunnin jälkeen koetta ei saa enää aloittaa
Ohjelmointikoe Tehdään selaimella TIM-systeemiin Kysymykset valitaan satunnaisesti Tentin aikana järjestelmään pääsee vain tenttiluokista Erillinen tenttitunnus è ei kotihakemistoja Mikroluokasta yhteydet maailmalle blokattu, paitsi tim.aalto.fi http://en.cppreference.com/w/c Harjoitustentti: https://tim.aalto.fi/view/elec-a7100/kokeet/harjoituskoe Ei automaattista arviointia
Esikääntäjä Käsittelee lähdekoodia ennen varsinaista käännösvaiheetta Tuotos pysyy tekstimuotoisena Esimerkiksi: #include tiedostojen sisällön liittäminen ohjelmaan Kommenttien poisto Erikoismerkkien käsittely (esim. \n ) Esikäännöksen direktiivit alkavat # - merkillä Rivin alusta rivin loppuun ei puolipistettä Pelkän esikäännöksen voi ajaa gcc E komennolla 8
#include Sisällyttää toisen tiedoston osaksi lähdekoodia Funktiorajapintojen määrittelyt Tietotyyppien, vakioiden, ym. määrittelyt #include <tiedosto> Käytetään standardikirjaston otsikkotiedostoihin #include tiedosto Käytetään omiin otsikkotiedostoihin Periaatteessa minkä tahansa tiedoston voi sisällyttää Eivät saa sisältää funktioiden toteutuksia.h - nimeämiskäytäntö 9
#define Määrittelee esikääntäjämakron joka korvataan annetulla tekstillä #define NIMI arvo Esim: #define NULL ((void *)0) Yleinen käytäntö: makrojen nimet isoilla kirjaimilla #include <string.h> #define MAXSTRING 80 int main(void) { char str[maxstring]; strncpy(str, "string", MAXSTRING - 1); } ( arvo voisi olla myös joku merkkijono) 10
#define-makrot parametreilla Makroon voi myös määrätä parametreja Korvautuvat annetulla sisällöllä esikäännösvaiheessa #include <stdio.h> #define PLUS(x,y) (x + y) Huomaa sulkujen käyttö int main(void) { int a = 2 * PLUS(3,4); printf( %d\n", a); } Tulostaa 14 11
#if, #else, #elif #endif Esikäännösvaiheen ehtorakenteet Ehtolausekkeet ja totuusarvot toimivat kuten normaalisti #elif tarkoittaa else if Esimerkiksi kaksi erilaista versiota rajapinnasta #if (VERSION == 1) #include "hdr_ver1.h" #elif (VERSION == 2) #include "hdr_ver2.h" #else #error "Unknown version" #endif #error aiheuttaa käännösvirheen Suoritettavaa ohjelmaa ei tällöin synny 12
Ehto-operaattori Vaihtoehto if-else rakenteelle Kolmiosainen operaattori Muoto: a > b? x : y; Operaattorin tulos on joko x tai y
Parametrilistat Eli: miten printf ja scanf on toteutettu?
Virtuaalimuistin rakenne mm. paikalliset muuttujat 0xFFFF FFFF FFFF FFFF Dynaamisesti varattu muisti Koodi ja vakiomerkkijonot 0x0000 0000 0000 0000 15
Funktio-osoittimet Osoitin voi viitata myös funktioon (eli koodiin) Funktiota voi tällöin kutsua osoittimen kautta Funktio-osoittimen tyyppi koostuu useasta osasta Paluuarvon tyyppi Parametrien tyypit Formaatti: paluuarvo (*nimi)(ptyyppi1, ptyyppi2, ) nimi on muuttujan nimi, johon funktion osoite talletetaan ptyyppi1, jne. Funktion parametrien tyypit Paluuarvo ja parameterit voivat olla myös void 16
Funktio-osoittimien määrittely #include <stdlib.h> int funcadd(int a) { return a + 1; } int main(void) { // The following declares four variables for function pointers int (*add_one)(int) = funcadd; void* (*varaa)(size_t); void (*vapauta)(void *); void* (*varaa_uudestaan)(void *, size_t); // above pointers are now uninitialized } // set the pointers to the addresses of functions in C library varaa = malloc; vapauta = free; varaa_uudestaan = realloc; 17
Funktio-osoittimen käyttö Funktio-osoitinta voi käyttää kuten mitä tahansa muuttujaa Funktion parametreina Funktion paluuarvona Paikallisena muuttujana Osana rakenteista tietotyyppiä Määrittely voi olla syntaktisesti hankalaa joissain yhteyksissä Esim. funktion paluuarvona Funktion kutsu tapahtuu muuttujan nimen kautta (esimerkki verkkomateriaalissa) 18
Esimerkki funktio-osoittimesta parametrina: qsort qsort funktio on määritelty stdlib.h otsakkeessa Järjestää taulukon annettua järjestysfunktiota käyttäen Toimii millä tahansa tietotyypillä (myös rakenteisilla tyypeillä) Järjestysfunktio pitää määritellä itse void qsort (void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)); 19
Luolapeli ja Makefile Make: työkalu, jolla voidaan ohjata käännösprosessia Makefilessä voidaan esimerkiksi määritellä erilaisia esikäännösmakroja tilanteen / tietokoneympäristön mukaan Isoissa projekteissa makefile generoidaan (esim. Cmakella) Käännösohjeet määritelty Makefilessä
Lisää C:tä (ja C++:aa)? ELEC-A7150 C++ Programming Periodit I - II ELEC-C7241 Tietokoneverkot Periodit III IV ELEC-C7310 Sovellusohjelmointi Periodit I II CS-C3100 Computer Graphics Periodit I II (Varmaan joitain muitakin)
Eli: Viikolla 3.4. 7.4. ei harjoituksia (tenttiviikko) Sen jälkeen kaksi viikkoa harjoituksia 10.4. 21.4. 10. tehtäväkierros Apua ohjelmointitehtävään 10. kierroksen deadline 21.4. Ohjelmointitehtävän deadline 21.4. Kokeet 3.5. 8.5. Jos jotain puuttuu kokeen jälkeen, ota yhteyttä