Näytelmä aliohjelman kutsumisesta
Katso 13.10.2014 esityksen vasemmasta reunasta kuvattu video.
Esitys 13.10.2014
- Vasemmasta reunasta kuvattu + ruutukaappaus HQ .mp4 SD .mp4
- jos ruutukaappauksen laatu ei riitä voi samalla itse debugata koodia tai katsoa ruutukaappausta tai liikkua samaan tahtiin debuggauksen still-kuvissa.
Esitys 14.10.2013
Vuoden 2012 editoitu video:
- Yhdistetty video (mp4) (edit by Tapio Karvo)
- voit yrittää samalla toisessa selainikkunassa liikkua tuossa debuggauksen still-kuvissa jos haluat nähdä koodia tarkemmin.
- voit myös ottaa ohjelmakoodin auki seuraamista varten: Kutsuminen.cs
Vuoden 2013 raakavideot:
- Ruutukaappaus + ääni
- Oikeasta reunasta kuvattu mobiili .mp4
- Vasemmasta reunasta kuvattu (osa 1) .mov .mp4
- Vasemmasta reunasta kuvattu (osa 2) .mov .mp4
- Vasemmasta reunasta kuvattu (osa 3) .mov .mp4
- Vasemmasta reunasta kuvattu (osa 4) .mov .mp4
Kuvat (s2013):
Kuvat (s2012):
Alkuperäiset videot:
Voi yrittää katsoa enemmän tai vähemmän kameran videoita ja ruutukaappausta rinnakkain. Voi myös katsoa noita kameran 1 tai 2 videoita (mp4) ja yrittää samalla liikkua tuossa debuggauksen still-kuvissa. Ääniraita on kuitenkin paras tuossa ruutukaappauksessa.
- kamera 1 (mp4) salin oikeasta reunasta kuvattuna.
- kamera 2 (mp4) salin vasemmasta reunasta kuvattuna.
- Ruutukaappaus 640x480-versio
Rekvisiitta
Tarvitaan yksi Visual Studion käyttäjä (D, Vesa)
Tarvitaan 5 näyttelijää:
- S:
int Suurempi(int a, int b)
- osaa palauttaa suuremman kahdesta luvusta (Simo -2013, Riikka 2014) - N:
new
- osaa varata tilaa ja alustaa nollilla (Paavo rooli) - V:
void VaihdaSuurin(int[] t, int a)
- osaa etsiä suurimman luvun paikan ja korvata sen a:lla (Matti) - W:
void Console.WriteLine(int a)
- osaa tulostaa yhden kokonaisluvun taululle. (Atte) - M:
main
- pääohjelma joka pyytää muita hommiin (Vesa)
Tarvikkeet:
- Yksi tietokone, josta tykillä heijastetaan ruutu
- nippu tyhjiä A4:ia
- väh. 2 kpl paksuja tusseja joilla voi kirjoittaa
- jokaisella näyttelijällä oma nimikyltti kaulassa
- taulu, johon tulee muuttujien "nimet" ja jossa on "ruudukko", josta voidaan varata 4 kokonaislukua
- sinitarraa, jolla lappuja voidaan liimata taululle
askeltaa -linkeistä pääsee katsomaan miltä Visual Studion pitäisi näyttää milläkin hetkellä ja sitten voi palata takaisin. Debuggaukset ovat myös [wiki:s2012/kutsudebug yhdellä sivulla].
Koodi
- Kutsuminen.cs
- Kutsuminen.asm - koodi optimoidusti käännettynä konekielelle)
Koodi näytetään Visual Studiolla tykillä
014 public static void Main(string[] args)
015 {
016 int a = 4, b = 5;
017 int iso;
018
019 iso = Suurempi(a, b);
020 Console.WriteLine(iso);
021
022 iso = Suurempi(iso+1, 7 / 3 + 5 / 2);
023 Console.WriteLine(iso);
024
025 int[] luvut = new int[4];
026 int[] m = luvut;
027
028 luvut[2] = 4;
029 luvut[1] = 6;
030 m[3] = iso+3;
031
032 VaihdaSuurin(luvut, 5);
033
034 Console.WriteLine(String.Join(" ",luvut));
035 }
036
037
052 public static int Suurempi(int luku1, int luku2)
053 {
054 if (luku1 >= luku2) return luku1;
055 return luku2;
056 }
057
058
085 public static void VaihdaSuurin(int[] t, int korvaavaArvo)
086 {
087 int paikka = -1;
088 int suurin = int.MinValue;
089 for (int i = 0; i < t.Length; i++)
090 {
091 int luku = t[i];
092 if (luku > suurin)
093 {
094 suurin = luku;
095 paikka = i;
096 }
097 }
098
099 if (paikka < 0) return;
100 t[paikka] = korvaavaArvo;
101 }
1. Lähtötilanne
Taululle on piirretty tilanne pääohjelman rivillä 15.
Pino Keko Tulostus
-------- --------
agrs | 231 | 231 || 0 ||
-------- --------
a | 0 | 232 | 0 |
-------- --------
b | 0 | 233 | 0 |
-------- --------
iso | 0 | 234 | 0 |
-------- --------
luvut | 0 | 235 | 0 |
-------- --------
m | 0 | 236 | 0 |
-------- --------
237 | 0 |
--------
238 | 0 |
--------
239 | 0 |
--------
- D: Laittaa näkyviin ikkunat: Watch, Locals, Call Stack, Registers. Piilota koodista kommentit.
2. Muuttujien esittely ja tilanvaraus
D: Askeltaa rivit 16-18
016 int a = 4, b = 5; 017 int iso; 018 019 iso = Suurempi(a, b);
M: Muuttaa samalla taululla olevien muistipaikkojen arvoja, lopputilanne:
Pino Keko -------- -------- agrs | 231 | 231 || 0 || -------- -------- a | 4 | 232 | 0 | -------- -------- b | 5 | 233 | 0 | -------- -------- iso | 0 | 234 | 0 | -------- -------- luvut | 0 | 235 | 0 | -------- -------- m | 0 | 236 | 0 | -------- -------- 237 | 0 | -------- 238 | 0 | -------- 239 | 0 | --------
3. Aliohjelman kutsu
D: Askeltaa riville 19
019 iso = Suurempi(a, b);
M: "Nyt pitäisi tietää kumpiko näistä a ja b on suurempi."
S: Vilkuttaa iloisena
M: Meillä näyttää tuolla olevan valmis aliohjelma, joka osaa sen selvittää. Mitähän se haluaa tietää homman tekemiseksi?"
M: Menee lukemaan S:n esittelyriviä. "Ai kaksi kokonaislukua. Ja se näköjään palauttaa kokonaisluvun. Kutsutaampa sitä."
M: Ottaa kolme paperia ja kirjoittaa ensimmäiseen luvun 4 ja pistää sen pöydälle. Kirjoittaa toiseen luvun 5 ja pistää se pöydälle edellisen päälle. Kirjoittaa kolmanteen luvun 19 (rivinumero johon palataan) ja laittaa sen edellisten päälle.
-------- | 4 -------- ------| 5 -------- -------| 19 | --------
M: Ottaa kolmen paperin pinon ja vie sen S:lle.
D: Askeltaa riville 53
052 public static int Suurempi(int luku1, int luku2) 053 {
S: Ottaa pinon vastaan ja liimaa ne järjestyksessä taululle ja antaa niiden viereen liidulla nimet samassa järjestyksessä
Pino Keko Tulostus -------- -------- agrs | 231 | 231 || 0 || -------- -------- a | 4 | 232 | 0 | -------- -------- b | 5 | 233 | 0 | -------- -------- iso | 0 | 234 | 0 | -------- -------- luvut | 0 | 235 | 0 | -------- -------- m | 0 | 236 | 0 | -------- -------- 237 | 0 | -------- -------- 238 | 0 | paluu | 19 | -------- -------- 239 | 0 | luku2 | 5 | -------- -------- luku1 | 4 | --------
D: Askeltaa riville 54
054 if (luku1 >= luku2) return luku1;
S: Pähkäilee luku1:n ja luku2:n kanssa että kumpiko on suurempi. Kun tulos selviää, kirjoittaa suuremman arvon tulospaperille.
D: Askeltaa riville 56 ja näyttää että tulos on EAX-rekisterissä.
056 }
S: Poistaa taululta luku1:n ja luku2:n. Ottaa paluu-lapun, katsoo siinä olevan numeron (näyttää myös yleisölle) ja heittää kaikki kolme alkuperäistä lappua roskiin.
-------- | 5 | --------
S: kävelee M:n luo, sanoo että "jatka riviltä 19 ja tuossa on tulos" ja ojentaa tulos-lapun M:lle.
M: Ottaa tuloslapun, katsoo siinä olevan arvon ja kirjoittaa sen iso-muuttujan arvoksi taululle.
D: Askeltaa riville 19
019 iso = Suurempi(a, b);
S: mene oven luokse, ripustaa nimilapun oven kahvaan, menee oven taakse ja odottaa siellä lisää tehtäviä
Pino Keko Tulostus -------- -------- agrs | 231 | 231 || 0 || -------- -------- a | 4 | 232 | 0 | -------- -------- b | 5 | 233 | 0 | -------- -------- iso | 5 | 234 | 0 | -------- -------- luvut | 0 | 235 | 0 | -------- -------- m | 0 | 236 | 0 | -------- -------- 237 | 0 | -------- 238 | 0 | -------- 239 | 0 | --------
4. Tulostaminen
D: Askeltaa riville 20.
020 Console.WriteLine(iso);
M: Nyt pitäisi tulostaa. Ottaa kaksi lappua, kirjoittaa toiseen "ison" arvon (5) ja toiseen 20 ja antaa ne W:lle.
-------- | 5 -------- -------| 20 | --------
W: piirtää taululle toisen lapun arvon (5) ja katsoo toisesta (ja näyttää yleisölle 20) mistä käskee M:n jatkaa. Heittää laput roskiin.
W: tulee M:n luo ja sanoo: "Jatka riviltä 20"
5. Toisen aliohjelman kutsu
D: Askeltaa riville 22.
022 iso = Suurempi(iso+1, 7 / 3 + 5 / 2);
M: "Nyt pitäisi tietää kumpiko on suurempi iso+1 vai hirvee lasku. Meillä näyttää tuolla olevan valmis aliohjelma joka osaa sen selvittää. Mitähän se haluaa parametriksi. Ai kaksi kokonaislukua. Ja se näköjään palauttaa kokonaisluvun. Kutsutaampa sitä."
M: Ottaa kolme paperia ja laskee iso+1 kirjoitaa sen (6) paperille ja pistää sen pöydälle. Laskee toisen luvun (7/3+5/2 = 2+2 = 4), kirjoittaa toiseen luvun 4 ja pistää se pöydälle edellisen päälle. Kirjoittaa kolmanteen luvun 22 (rivinumero johon palataan) ja laittaa sen edellisten päälle.
-------- | 6 -------- ------| 4 -------- -------| 22 | --------
M: Ottaa kolmen paperin pinon ja työntää sen oven alta S:lle.
S: Kirjoittaa paluu lapulle suuremman arvon (6)
-------- | 6 | --------
S: työntää paluulapun oven alta ja sanoo että jatka riviltä 22 ja tuossa on tulos ja ojentaa tulos-lapun M:lle.
022 iso = Suurempi(iso, 7 / 3 + 5 / 2);
M: Ottaa tuloslapun, katsoo siinä olevan arvon (6) ja kirjoittaa sen iso-muuttujan arvoksi taululle.
S: voi poistua oven takaa
Pino Keko Tulostus -------- -------- 5 agrs | 231 | 231 || 0 || -------- -------- a | 4 | 232 | 0 | -------- -------- b | 5 | 233 | 0 | -------- -------- iso | 6 | 234 | 0 | -------- -------- luvut | 0 | 235 | 0 | -------- -------- m | 0 | 236 | 0 | -------- -------- 237 | 0 | -------- 238 | 0 | -------- 239 | 0 | --------
D: Askeltaa riville 23
023 Console.WriteLine(iso);
M: Nyt pitäisi taas tulostaa. Ottaa kaksi lappua, kirjoittaa toiseen "ison" arvon (6) ja toiseen 23 ja vie ne W:lle.
W: piirtää taululle toisen lapun arvon (6) ja katsoo toisesta mistä käskee M:n jatkaa. Heittää laput roskiin.
W: tulee M:n luo ja sanoo: "Jatka riviltä 23"
D: Askeltaa riville 24
6 Taulukon luominen
D: Askeltaa riville 25
025 int[] luvut = new int[4];
M: "Nyt tarviis saada taulukko."
N: new (vilkuttelee iloisesti)
M: "Haa, new osaa varmaan sen mulle antaa".
M: Ottaa paperin
M: "4 voi olla hyvä koko"
M: kirjoittaa yhdelle paperille 4 ja toiselle 25 ja vie kasan new:lle
-------- | 4 -------- -------| 25 | --------
M: "inttejä tarviisin"
N: ottaa kasan vastaan. Tiirailee taululle. Katsoo koon toisesta lapusta (ja näyttää yleisölle 4).
N: "Vaikka 234 kohdasta näyttäisi olevan 4 paikkaa vapaata"
N: Kehystää taululla 234-238 raamilla. Kirjoittaa uudelle paperille 234. Katsoo alkuperäisistä papereista paluuosoitteen (ja näyttää yleisölle 25) ja heittaa kaksi alkuperäistä paperia roskiin.
N: kävelee M:n luo, ojentaa paperin 234 ja sanoo "jatka riviltä 25".
M: ottaa paperin, kirjoittaa luvut-kohtaan 234 ja heittää paperin roskiin.
Pino Keko Tulostus -------- -------- 5 agrs | 231 | 231 || 0 || 6 -------- -------- a | 4 | 232 | 0 | -------- -------- b | 5 | 233 | 0 | -------- ====== iso | 6 | 234 || 4 || -------- -------- luvut | 234 | 235 || 0 || -------- -------- m | 0 | 236 || 0 || -------- -------- 237 || 0 || -------- 238 || 0 || ====== 239 | 0 | --------
7. Toisen viitteen tekeminen
D: Lisää Watch-ikkunaan
luvut
ja avaa seD: Askeltaa riville 26
026 int[] m = luvut;
M: menee taululle, katsoo luvut kohdassa olevan arvon
M: "234"
M: kirjoittaa 234 m-paikkaan.
Pino Keko Tulostus -------- -------- 5 agrs | 231 | 231 || 0 || 6 -------- -------- a | 4 | 232 | 0 | -------- -------- b | 5 | 233 | 0 | -------- ====== iso | 6 | 234 || 4 || -------- -------- luvut | 234 | 235 || 0 || -------- -------- m | 234 | 236 || 0 || -------- -------- 237 || 0 || -------- 238 || 0 || ====== 239 | 0 | --------
8. Taulukon arvojen laittaminen
D: Askeltaa riville 28
028 luvut[2] = 4;
M: "siis 4 pitäisi laittaa siihen taulukkoon joka alkaa 234:sta ja sen paikkaan 2"
M: laskee paikasta 235 kaksi paikkaa eteenpäin ja päätyy paikkaan 237. Kirjoittaa sinne 4.
D: Askeltaa riville 29
029 luvut[1] = 6;
M: "siis 6 pitäisi laittaa siihen taulukkoon joka alkaa 234:sta ja sen paikkaan 1"
M: laskee paikasta 235 yhden paikan eteenpäin ja päätyy paikkaan 236. Kirjoittaa sinne 6.
D: Askeltaa riville 30
030 m[3] = iso+3;
M: "Kappas, m on paikassa 234, siis tuon laskun tulos pitäisi laittaa siihen taulukkoon joka alkaa 234:sta ja sen paikkaan 3"
M: "lasketaampas: iso+3 = 6+3 = 9, eli 9 pitäisi laittaa sinne"
M: laskee paikasta 235 kolme eteenpäin ja päätyy paikkaan 238. Kirjoittaa sinne 9.
Pino Keko Tulostus -------- -------- 5 agrs | 231 | 231 || 0 || 6 -------- -------- a | 4 | 232 | 0 | -------- -------- b | 5 | 233 | 0 | -------- ====== iso | 6 | 234 || 4 || -------- -------- luvut | 234 | 235 || 0 || -------- -------- m | 234 | 236 || 6 || -------- -------- 237 || 4 || -------- 238 || 9 || ====== 239 | 0 | --------
9. Taulukko-aliohjelman kutsuminen
D: Askeltaa riville 32
032 VaihdaSuurin(luvut, 5);
M: "Nyt pitäisi saada suurin vaihdettua viitokseksi?"
V: vilkuttelee iloisena
M: "Ahaa tuolla on sellainen joka sen osaa, mitäs se haluaa tietoja? Taulukon viitteen ja korvaavanArvon. Selvä!"
M: Kirjoittaa 1. paperille 234, toiselle 5 ja kolmannelle 32.
-------- | 234 -------- ------| 5 -------- -------| 32 | --------
M: Vie paperipinon V:lle.
V: Ottaa pinon ja liimaa ne taululle sekä samalla vielä tekee neljä paikkaa lisäksi:
Pino Keko Tulostus -------- -------- 5 agrs | 231 | 231 || 0 || 6 -------- -------- a | 4 | 232 | 0 | -------- -------- b | 5 | 233 | 0 | -------- ====== iso | 6 | 234 || 4 || -------- -------- luvut | 234 | 235 || 0 || -------- -------- m | 234 | 236 || 6 || -------- -------- 237 || 4 || -------- -------- 238 || 9 || luku | 0 | ====== -------- 239 | 0 | i | 0 | -------- -------- suurin | 0 | -------- paikka | 0 | -------- paluu | 32 | -------- korvaa | 5 | -------- t | 234 | --------
D: Askeltaa riville 86
085 public static void VaihdaSuurin(int[] t, int korvaavaArvo) 086 {
V: "Pitäisi etsiä ensin suurimman paikka että tietää missä vaihdetaan". "Kun ei ole mitään veilä tehty, niin olkoon paikka -1". "Ja kun suurinta ei tiedetä, niin pistetään siihen tosi huono luku"
D: Askeltaa riville 89
089 for (int i = 0; i < t.Length; i++) Pino Keko Tulostus -------- -------- 5 agrs | 231 | 231 || 0 || 6 -------- -------- a | 4 | 232 | 0 | -------- -------- b | 5 | 233 | 0 | -------- ====== iso | 6 | 234 || 4 || -------- -------- luvut | 234 | 235 || 0 || -------- -------- m | 234 | 236 || 6 || -------- -------- 237 || 4 || -------- -------- 238 || 9 || luku | 0 | ====== -------- 239 | 0 | i | 0 | -------- -------- suurin | -2147| -------- paikka | -1 | -------- paluu | 32 | -------- korvaa | 5 | -------- t | 234 | --------
Seuraavaa toistetaan kunnes i >= 4:
V Katsoo i:n arvon ja toteaa että i< 4
D: Askeltaa riville 91
091 int luku = t[i];
V "Pitäisi mennä siis paikasta 234 i pykälää eteenpäin ja ottaa siellä oleva arvo ja laittaa muuttujaan luku."
V Hakee arvon ja kirjoittaa arvon muuttujaan luku
D: Askeltaa riville 92
092 if (luku > suurin)
V Vertailee arvoja ja päättää mitä tehdään
D: Askeltaa riville 96
D: Askeltaa riville 89
089 for (int i = 0; i < t.Length; i++)
V kasvattaa i:n arvoja ja jatkaa silmukkaa
D: Askeltaa riville 96
D: Askeltaa riville 96
D: Askeltaa riville 89
Kun silmukka tehty
Pino Keko Tulostus
-------- -------- 5
agrs | 231 | 231 || 0 || 6
-------- --------
a | 4 | 232 | 0 |
-------- --------
b | 5 | 233 | 0 |
-------- ======
iso | 6 | 234 || 4 ||
-------- --------
luvut | 234 | 235 || 0 ||
-------- --------
m | 234 | 236 || 6 ||
-------- --------
237 || 4 ||
--------
-------- 238 || 9 ||
luku | 9 | ======
-------- 239 | 0 |
i | 4 | --------
--------
suurin | 9 |
--------
paikka | 3 |
--------
paluu | 32 |
--------
korvaa | 5 |
--------
t | 234 |
--------
D: Askeltaa riville 99
099 if (paikka < 0) return;
V "paikka >= 4, ei lähdetä pois"
D: Askeltaa riville 100
100 t[paikka] = korvaavaArvo;
V "Eli pitäisi mennä 234:ta alkavaa taulukkoa 3 eteenpäin ja laittaa sinne arvo 5".
V laittaa 5:n paikkaan 238:
Pino Keko Tulostus -------- -------- 5 agrs | 231 | 231 || 0 || 6 -------- -------- a | 4 | 232 | 0 | -------- -------- b | 5 | 233 | 0 | -------- ====== iso | 6 | 234 || 4 || -------- -------- luvut | 234 | 235 || 0 || -------- -------- m | 234 | 236 || 6 || -------- -------- 237 || 4 || -------- -------- 238 || 5 || luku | 9 | ====== -------- 239 | 0 | i | 4 | -------- -------- suurin | 9 | -------- paikka | 3 | -------- paluu | 32 | -------- korvaa | 5 | -------- t | 234 | --------
D: Askeltaa riville 101
V ottaa omat "muuttujat" pois ja katsoo paluuosoitteen 32
D: Askeltaa riville 32
032 VaihdaSuurin(luvut, 5);
V menee M:n luo ja sanoo "jatka 32".
Pino Keko Tulostus -------- -------- 5 agrs | 231 | 231 || 0 || 6 -------- -------- a | 4 | 232 | 0 | -------- -------- b | 5 | 233 | 0 | -------- ====== iso | 6 | 234 || 4 || -------- -------- luvut | 234 | 235 || 0 || -------- -------- m | 234 | 236 || 6 || -------- -------- 237 || 4 || -------- 238 || 5 || ====== 239 | 0 | --------
D: Askeltaa riville 34
034 Console.WriteLine(String.Join(" ",luvut));
M "nyt pitäisi tulostaa...."
Lisäasioita
mitä jos Suurempi-funktiossa olisi ollut
public static int Suurempi(int luku1, int luku2) int suurin = luku1; if ( luku2 > suurin ) suurin = luku2; luku1 = 99; return suurin; }
niin miten tämä olisi vaikuttanut pääohjelmaan?
oikeasti paramterit ovat tietysti binäärisiä, eli esim:
5 = 0000 0101
ja-1 = 1111 1111
. Aliohjelman int-tarkoittaa että "bittimömmöt" tulkitaan 2-komplementin mukaan. Jos aliohjelmassa olisi ollut(unit luku1, unint luku2)
niin silloin kutsun -1 olisi tulkittu suurimmaksi mahdolliseksi luvuksi (kaikki bitit päällä).
These are the current permissions for this document; please modify if needed. You can always modify these permissions from the manage page.