ssa ohjelman käytössä suoritusaikana oleva muisti jakautuu neljään osaan: koodisegmentti datasegmentti pinosegmentti (stack) kasa (heap) ssa ohjelman koodisegmentti sisältää käännetyn ohjelmakoodin sisältö ja koko eivät muutu datasegmentti sisältää globaalit muuttujat koko ei muutu, mutta sisältö yleensä muuttuu pinosegmentissä on tila funktioiden (ml. main) paikallisille muuttujille ja parametreille sekä koko että sisältö muuttuvat myös pinosegmentillä on kiinteä tilavaraus, vaikka vain osa yleensä on käytössä 1 T0004 Olli Hämäläinen www.evtek.fi 2 T0004 Olli Hämäläinen www.evtek.fi ssa kasa on jäljelle jäävä ohjelman käytettävissä oleva muistialue ohjelma voi suoritusaikana varata dynaamisesti tilaa kasa-alueesta kirjastofunktioilla: void *malloc(size_t size); void *calloc(size_t nobj, size_t size); void *realloc(void *p, size_t size); varaus vapautetaan funktiolla void free(void *p); 3 T0004 Olli Hämäläinen www.evtek.fi Esimerkki dynaamisesta varauksesta 1 /*Esimerkki 22.2, Silander */ #include <stdlib.h> int main(void) { int *t; int koko; printf ("Paljonko taulukolle varataan tilaa? "); scanf ("%d",&koko); 4 T0004 Olli Hämäläinen www.evtek.fi Esimerkki dynaamisesta varauksesta 1 t=malloc(koko*sizeof( int)); (t==null) printf ("Tilaa ei ole tarpeeksi"); { (i=0; i<koko; i++){ printf ("\nsy t taulukon %d. alkio :",i+1); scanf ("%d",&t[i]); printf ("\ntaulukossa on luvut :"); (i=0; i<koko; i++) printf ("\n%d",t[i]); free (t); 0; 5 T0004 Olli Hämäläinen www.evtek.fi Linkitetyt merkkijonot: muostetaan linkitetty lista merkkijonoista, joille varataan tilaa sitä mukaa, kun merkkijonoja syötetään. a link a link a link 6 T0004 Olli Hämäläinen www.evtek.fi 1
#include <string.h> #include <stdlib.h> oma_alkio{ char a[127]; oma_alkio *link; Alkio; int main(void) { char puskuri[128]; int jatka=1; Alkio * ketju=malloc(sizeof(alkio)); Alkio * p_a=ketju; strcpy(ketju->a,"tämä on eka"); 7 T0004 Olli Hämäläinen www.evtek.fi /* lukuvaihe */ (jatka){ printf("anna merkkijono: "); fgets(puskuri, 127,stdin); (jatka=strlen(puskuri)-1){ p_a= p_a->link=malloc(sizeof(alkio)); strcpy(p_a,puskuri); 8 T0004 Olli Hämäläinen www.evtek.fi /* tulostus */ p_a=ketju; (p_a!= '\0'){ printf(p_a->a); p_a=p_a->link; 0; -tietorakenne i on kahden tai useamman muuttujan jakama muistialue in määrittely muistuttaa läheisesti tietueen () määrittelyä, mutta sisällössä on oleellinen ero: tietueen kentillä on omat muistialueensa, mutta in kentät (muuttujat) ovat ikään kuin päällekkäin: yhden muuttaminen muuttaa kaikkia in kenttiin viitataan samoin kuin tietuiden kenttiin operaattoreilla. ja -> 9 T0004 Olli Hämäläinen www.evtek.fi 10 T0004 Olli Hämäläinen www.evtek.fi nelikko { testi1; vertaa: tupla4 { testi2; 11 T0004 Olli Hämäläinen www.evtek.fi #include <string.h> #include <time.h> int main(void) { nelikko { testi1; tupla4 { testi2; 12 T0004 Olli Hämäläinen www.evtek.fi 2
printf(" vie tilaa %i\n",sizeof(testi1)); printf("tietue vie tilaa %i\n",sizeof(testi2)); testi2.i = 65; printf("i: %i a: %s\n",testi2.i, testi2.a); testi1.i = 65; printf("i: %i a: %s\n",testi1.i, testi1.a); testi1.a[0] = 'a'; printf("i: %i a: %s\n",testi1.i, testi1.a); testi1.a[1] = 'b'; testi1.a[2] = 'c'; testi1.a[3] = 'd'; printf("i: %i a: %s\n\n",testi1.i, testi1.a); testi2.a[0] = 'a'; printf("i: %i a: %s\n",testi2.i, testi2.a); testi2.a[1] = 'b'; testi2.a[2] = 'c'; testi2.a[3] = 'd'; printf("i: %i a: %s\n",testi2.i, testi2.a); 0; 13 T0004 Olli Hämäläinen www.evtek.fi 14 T0004 Olli Hämäläinen www.evtek.fi Bittioperaatiot Bittioperaatiot bittioperaatioiden avulla voidaan käsitellä kokonaislukumuuttujia bittitasolla koska tietotyyppien esitystapa on järjestelmäriippuvaa, ei bittioperaatioihin perustava ohjelma välttämättä ole siirrettävissä sellaisenaan järjestelmästä toiseen C-kielen bittioperaatiot & - ja: tulos on 1 jos molemmat bitit 1, muuten 0 - tai: tulos on 1, jos jompikumpi bitti 1, muuten 0 ^ - poissulkeva tai: 1, jos eri arvot, 0, jos samat ~ - negaatio: bittien kääntö 1->0 ja 0->1 >> - siirto oikealle << - siirto vasemmalle 15 T0004 Olli Hämäläinen www.evtek.fi Ehllinen lauseke ehllisen lausekkeen avulla voidaan lausekkeen arvo päättää ehn perusteella yleinen muoto: lauseke1? lauseke2 : lauseke_3 toiminta ja tulkinta: lauseke1:n arvo lasketaan ja jos se on tosi, lasketaan lauseke2:n arvo, josta saadaan koko ehllisen lausekkeen arvo; jos taas lauseke1 on epätosi, lasketaan lauseke3 ja siitä tulee koko ehllisen lausekkeen arvo 16 T0004 Olli Hämäläinen www.evtek.fi Ehllinen lauseke Esim. 1: max_x_y = x > y? x:y; muuttuja max_x_y saa arvokseen suuremman x:n ja y:n arvoista Esim. 2: rand()%2? printf( Klaava ): printf( Kruuna ); lantinheiton simulointi Lueteltu tyyppi C-kielessä voidaan määritellä oma tietotyyppi, jolla on äärellinen arvojoukko määrittelyssä luetellaan arvot ja niille tulee samalla määritellyksi myös järjestys esim. viikonpaivat {MA,TI,KE,TO,PE,LA,SU ; toteutuksessa arvot samastetaan oletusavoisesti kokonaislukuihin 0:sta alkaen, mutta ohjelmoija voi antaa myös omat kokonaislukuarvot 17 T0004 Olli Hämäläinen www.evtek.fi 18 T0004 Olli Hämäläinen www.evtek.fi 3
Lueteltu tyyppi, esimerkki /*Esimerkki 30.1, Silander Seuraavassa ohjelmassa k ytet n hyv ksi -vakioita tulostettaessa kuukausien nimet. Huomaa, kuinka vakiolla indeksoidaan sopivasti alustettua merkkijonotaulukkoa. */ kuukaudet{tam=1, HEL, MAA, HUH, TOU, KES, HEI, ELO, SYY, LOK, MAR, JOU; int main(void){ kuukaudet kk; Lueteltu tyyppi, esimerkki char *kk_nimi[]={"","tammikuu", "Helmikuu", "Maaliskuu", "Huhtikuu", "Toukokuu", "Kes kuu", "Hein kuu", "Elokuu", "Syyskuu", "Lokakuu", "Marraskuu", "Joulukuu"; (kk=tam; kk<=jou; kk++) { printf ("%2d %s\n",kk,kk_nimi[kk]); 0; 19 T0004 Olli Hämäläinen www.evtek.fi 20 T0004 Olli Hämäläinen www.evtek.fi Varatut sanat Varatut sanat perustietotyypit auto const uble float int short unsigned auto const uble float int short unsigned long signed void long signed void register sizeof volatile register sizeof volatile char extern static char extern static 21 T0004 Olli Hämäläinen www.evtek.fi 22 T0004 Olli Hämäläinen www.evtek.fi Varatut sanat muuttujien tallennus yms. Varatut sanat omat tietotyypit auto const register sizeof volatile extern static 23 T0004 Olli Hämäläinen www.evtek.fi 24 T0004 Olli Hämäläinen www.evtek.fi 4
Varatut sanat hyppykäskyt Varatut sanat toisto 25 T0004 Olli Hämäläinen www.evtek.fi 26 T0004 Olli Hämäläinen www.evtek.fi Varatut sanat valinta Varatut sanat? 27 T0004 Olli Hämäläinen www.evtek.fi 28 T0004 Olli Hämäläinen www.evtek.fi Makrot ja esikääntäjän ohjaus #define - makron määrittely #include - kirjaston mukaanotto # #el # #end #def #ndef - ehllinen kääntäminen 29 T0004 Olli Hämäläinen www.evtek.fi Parametroidut makrot #define MAKSIMI(a,b) ((a)>(b)?(a):(b)) kutsu: maks=maksimi(sin(x)+1,x*x+y*y); => maks=((sin(x)+1)>(x*x+y*y)? (sin(x)+1) : (x*x+y*y); vertaa: #define MAKS2(a,b) (a>b? a : b) 30 T0004 Olli Hämäläinen www.evtek.fi 5
Parametroidut makrot #define NELIO(a) a*a kutsu: nelio=nelio(x); => nelio=x*x; mutta: nelio2=nelio(x+y); => nelio=x+y*x+y; Esimerkki #include <string.h> #include torso.h" ARVON KOKONAISLUKU PALAUTTAVA FUNKTIO vertaa JONKA_PARAMETRIT_ON NIINKU NOI (MERKIN_OSOITIN a, MERKIN_OSOITIN b); ARVON KOKONAISLUKU PALAUTTAVA FUNKTIO main(tyhja){ ALUKSI NIINKU MAARITELLAAN MERKKI rivi1[128],rivi2[128]; SITTEN TOTA NOIN VAAN KIRJOITTELE ("Anna merkkijono 1!\n" ); 31 T0004 Olli Hämäläinen www.evtek.fi 32 T0004 Olli Hämäläinen www.evtek.fi Esimerkki SEURAAVAKSI LUE_RIVI(rivi1,127,OLETUS_SYOTTO); SITTEN KIRJOITTELE("Anna merkkijono 2!\n" ); LUE_RIVI(rivi2,127,OLETUS_SYOTTO); KIRJOITTELE("Oman vertailun tulos on %d\n", vertaa(rivi1,rivi2)); LOPUKSI KIRJOITTELE ("strcmp-vertailun tulos on %d\n", strcmp(rivi1,rivi2)); IHAN LOPUKSI PALAA_JA_PALAUTA 0; 33 T0004 Olli Hämäläinen www.evtek.fi Esimerkki MAARITELLAAN ARVON KOKONAISLUKU PALAUTTAVA FUNKTIO vertaa JONKA_PARAMETRIT_ON(MERKIN_OSOITIN p, MERKIN_OSOITIN q){ NIIN_KAUAN_KUIN TOI (SISALTO p NIINKU ON_ERI_KUIN '\0' JA TOI SISALTO p ON_SAMA_KUIN SISALTO q) NIIN DUUNAA { p VAAN KASVAA_YHDELLA; q KASVAA_YHDELLA MYOS; SITKU NOI HOMMAT_ON_OHI NIINKU NIIN SITTEN VAAN PALAA_JA_PALAUTA SISALTO p VAHENNETTYNA SISALTO q LLA ; 34 T0004 Olli Hämäläinen www.evtek.fi Esimerkki, <torso.h> (osa) #ndef TORSO #define TORSO #define KOKONAISLUKU int #define KOKONAISLUKUARVON_PALAUTTAVA_FUNKTIO INT #define SAA_ARVON = #define SEURAAVAKSI #define VAAN #define MAARITELLAAN #define ALUKSI #define ARVON --- #end TENTTI 16.12.2003 klo 12:00 Auditoriossa sen jälkeen Hyvää joulua! 35 T0004 Olli Hämäläinen www.evtek.fi 36 T0004 Olli Hämäläinen www.evtek.fi 6