90 likes | 276 Views
Mäluhaldus. Risto Heinsar & Ott Madis Ozolit. Mälu olemus. Igal andmetüüp nõuab meilt kindla koguse mälu. Ava http://blue.pri.ee/tty - > prog2 -> koodinaited -> suurused.c T äienda koodi! s izeof () funktsioon abiks !
E N D
Mäluhaldus Risto Heinsar & Ott Madis Ozolit
Mäluolemus • Igalandmetüüpnõuab meilt kindla koguse mälu. • Ava http://blue.pri.ee/tty -> prog2 -> koodinaited -> suurused.c Täienda koodi! • sizeof() funktsioon abiks! • Antud mälumahud võivad varieeruda erinevatel protsessorite arhitektuuridel, kompilaatoritel ja operatsioonisüsteemidel
Mäluolemus • Igalandmetüüpnõuab meilt kindla koguse mälu : • Char – 1 bait • Int – 4 baiti • Float – 4 baiti • Double – 8 baiti • sizeof() funktsioon abiks! • Antud mälumahud võivad varieeruda erinevatel protsessorite arhitektuuridel, kompilaatoritel ja operatsioonisüsteemidel
Dünaamilise mälu kasutamise põhimõtted • Lisame programmile teegi <malloc.h> • Kõiki massiive deklareerime viitadena • Programmeerija küsib igale soovitud andmehulgale vajaliku mälumahu (NB! Peab jälgima, et mitte küsida liiga palju või vähe!) • Küsitud mälus liigume viitasid kasutades • Küsitud mäluhulk vabastatakse, kui seda enam vaja ei ole • Mõneti sarnane failide kasutamise fopen() ja fclose() põhimõttele.
Mälu küsimine mallociga • Mälu küsime funktsiooniga malloc(); • Mallocit kasutades küsime mälu varemalt deklareeritud viidale • malloc() -> abikssizeof() funktsioon • Kõik küsitud mälu tuleb vabastada käsitsi funktsiooniga free(); • viit=(andmetüüp*)malloc(sizeof(andmetüüp)*n); • free(viit);
Malloci realisatsioon koodis • Kõik operatsioonid kolivad viitade peale üle! St nüüdsest me ei deklareeri enam kindla pikkusega massiivi, vaid viida, millele anname vastavalt vajadusele mälu! • Vanasti: intmassiiv[10]; • Nüüd: int*massiiv; massiiv=(int*)malloc(n*sizeof(int));
Pointeraritmeetika #include <stdio.h> #include <malloc.h> intmain(void) { int*p,i; p=(int*)malloc(3*sizeof(int)); *(p+0)=5; *(p+1)=3; *(p+2)=7; for(i=0;i<3;i++) printf("%p, %d\n",(p+i),*(p+i)); free(p); return 0; } *p48F9AC91 5 3 7 *(p+0) *(p+1) *(p+2)
Järgmisest kodutööst • Kodutöö PEAB sisaldama dünaamilist mälujaotust! • Samuti kehtivad eelmise kodutööga sätestatud põhimõtted: funktsioonid, failid, struktuurid, treppimine • Kodutöö variandid: • Valid ise teema, kooskõlastad meiega enne tegemist (nt sõber vajab programmi oma filmikogu haldamiseks) • Kui kohe head ideed pähe ei tule, siis meie käest saad variandi järgmise nädala tunnis. • Tähtaeg: KT2 toimumise aeg! • Kodutöö 2: 15% lõpuhindest
Tunnitöö • Kirjutaprogrammmis: • küsibkasutajaltnnegatiivset täisarvu • salvestab arvud dünaamilist mälujaotust kasutavasse massiivi • sorteerib need arvudkasvavasvõikahanevasjärjekorras • väljastabniialgseseisu,kuikalõpptulemuse,eraldiväljundfailidesse • NB!Kõikelementaarsednõudedtäita (failikontroll, teegid, jne) • NB! Kõik massiiviga teostatavad operatsioonid tuleb teha viitadega!