1 / 43

関数,スコープ

関数,スコープ. 拡張 K- 言語 関数呼び出し 変数の有効範囲. ★ K 言語 →  VSM. main() { int a,b; int c; c=a+b; }. 12 PUSHI (0,3) 13 PUSH (0,1) 14 PUSH (0,2) 15 ADD 16 ASSGN 17 REMOVE. ★ K 言語 →  VSM. main() { int a,c; { int c; c=a+25; } }. 12 PUSHI (0,1) 13 PUSH (1,1) 14 PUSHI 25

mercer
Download Presentation

関数,スコープ

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 関数,スコープ 拡張K-言語 関数呼び出し 変数の有効範囲

  2. ★K言語 → VSM main() { int a,b; int c; c=a+b; } 12 PUSHI (0,3) 13 PUSH (0,1) 14 PUSH (0,2) 15 ADD 16 ASSGN 17 REMOVE

  3. ★K言語 → VSM main() { int a,c; { int c; c=a+25; } } 12 PUSHI (0,1) 13 PUSH (1,1) 14 PUSHI 25 15 ADD 16 ASSGN 17 REMOVE

  4. ★K言語 → VSM main() { int a,b,c; { int c; a=c-3; } a=c-3; } 12 PUSHI (0,1) 13 PUSH (0,3) 14 PUSHI 3 15 SUB 16 ASSGN 17 REMOVE

  5. ★K言語 → VSM int func1 (int x,int y) { int wa; wa=x+y; return wa; } main(){ c=func1(12,34); } 2 PUSHI (0,1) 3 PUSH (0,-4) 4 PUSH (0,-3) 5 ADD 6 ASSGN 7 REMOVE 8 PUSH (0,1) 9 RETURN 2

  6. ★K言語 → VSM int func1 (int x,int y) { int wa; wa=x+y; return wa; } main(){ int a,c; c=func1(12,34); } 20 PUSHI (0,2) 21 PUSHI 12 22 POP 23 PUSHI 34 24 POP 25 CALL 1 26 ASSGN 27 REMOVE

  7. K言語 → VSM int func1 (int x,int y) { int wa; wa=x+y; return wa; } main(){ int a,c; c=func1(12,34); } wa 20 PUSH (0,1) 21 RETURN 2 引数の数=2 100 PUSHI (0,2) ???? 105 CALL 1 106 ASSGN 107 REMOVE c = ;

  8. 関数呼び出し int tasu(int x,int y) { int wa; wa=x+y; return wa; } main() { int a; a=tasu(2,3); tasu(5,2); } 関数は 必ず戻り値がある とする mainは 戻り値なし とする REMOVE 戻り値を 使わなくてもよい

  9. 再帰呼び出し:可能 int wa(int n) { if ( n <= 1) return 1; return n+wa(n-1); } main() { wa(3); } 再帰呼び出し

  10. 再帰呼び出し 同じ関数waでも 引数の値が異なる 局所変数の値が異なる wa(3) →wa(2) →wa(1) n=1 n=2 n=3 nを記憶する場所(アドレス)を 一回呼び出す毎に変更しなければならない ↓ 一回呼び出す毎に新しい記憶場所を確保する (フレームと呼ぶ)

  11. Dsegにフレームを積む • wa(3) • wa(2) • wa(1)

  12. フレームの構造:CALL,int waの後 int tasu(int x,int y) { int wa=11; wa=x+y; return wa; } main() { int a=7; a=tasu(2,3); } mainの 固定領域 FP tasuの 固定領域 BP DP

  13. フレームの構造:RETURNの後 int tasu(int x,int y) { int wa=11; wa=x+y; return wa; } main() { int a=7; a=tasu(2,3); } mainの 固定領域 FP= tasuのDL DP= tasuのFP-1 -2(引数の数) BP= tasuのSL

  14. Dsegの使用状況の推移[1] • int func1(int a,int b) • { int wa=15; • wa=a+b; • return wa; • } • int func2(int x,int y) • { int seki=23; • seki=5*func1(x,y); • return seki; • } • main() • { int u=3,v=7,w=61; • w=func2(u,v); • } FP BP DP ここ

  15. Dsegの使用状況の推移[1] BP • int func1(int a,int b) • { int wa=15; • wa=a+b; • return wa; • } • int func2(int x,int y) • { int seki=23; • seki=5*func1(x,y); • return seki; • } • main() • { int u=3,v=7,w=61; • w=func2(u,v); • } DP ここ FP

  16. Dsegの使用状況の推移[1] • int func1(int a,int b) • { int wa=15; • wa=a+b; • return wa; • } • int func2(int x,int y) • { int seki=23; • seki=5*func1(x+1,y+2); • return seki; • } • main() • { int u=3,v=7,w=61; • w=func2(u,v); • } ここ FP BP DP

  17. Dsegの使用状況の推移[1] • int func1(int a,int b) • { int wa=15; • wa=a+b; • return wa; • } • int func2(int x,int y) • { int seki=23; • seki=5*func1(x+1,y+2); • return seki; • } • main() • { int u=3,v=7,w=61; • w=func2(u,v); • } BP DP ここ FP

  18. Dsegの使用状況の推移[1] • int func1(int a,int b) • { int wa=15; • wa=a+b; • return wa; • } • int func2(int x,int y) • { int seki=23; • seki=5*func1(x,y); • return seki; • } • main() • { int u=3,v=7,w=61; • w=func2(u,v); • } FP BP DP ここ

  19. 変数の有効範囲 int x,y; main() { int a,b; } 関数の外で定義=大域変数 すべての関数で有効 関数の内部で定義=局所変数 その関数内部でのみ有効

  20. ブロック構造 大域変数 int x,y; main() { int a,x; { int u,a; a=x+y; { int f,u; f=u+a; } } } 局所変数 ブロック変数 内部のブロック変数 一番近くの定義が有効

  21. ブロック構造:Dsegに番地を確保 int x=3,y=7; main() { int a=11,x=15;<=18 { int u=21,a=29;<=22 a=x+y;a←15+7 { int f=34,<=58u=36; f=u+a;f←36+22 } }   x=a+y; x←11+7 }

  22. ブロック構造:変数表 main() { int a=11,x=15; { int u=21,a=29; a=x+y; { int f=34,u=36; f=u+a; } }   x=a+y; }

  23. ブロック構造:Dsegに番地を確保 int x=3,y=7; main() { int a=11,x=15; { int u=21,a=29; a=x+y; { int f=34,u=36; f=u+a; } }   x=a+y; } FP ここでの Dsegの構造 BP DP

  24. ブロック構造:Dsegに番地を確保 int x=3,y=7; main() { int a=11,x=15; { int u=21,a=29; a=x+y; { int f=34,u=36; f=u+a; } }   x=a+y; } FP ここでの Dsegの構造 BP DP

  25. Dsegの使用状況の推移[2] • int g=42,h=53; • int func(int a,int b) • { int wa=15; • { int sa=75; • sa=b-a; • wa=sa+g; } • if(a<b){ • int sa=82; • sa=a-b; • wa=sa+h; } • return wa; • } • main() • { int u=3,v=7,w=61; • w=func(u,v);} FP BP DP ここ

  26. Dsegの使用状況の推移[2] • int g=42,h=53; • int func(int a,int b) • { int wa=15; • { int sa=75; • sa=b-a; • wa=sa+g; } • if(a<b){ • int sa=82; • sa=a-b; • wa=sa+h; } • return wa; • } • main() • { int u=3,v=7,w=61; • w=func(u,v);} FP ここ BP DP

  27. Dsegの使用状況の推移[2] • int g=42,h=53; • int func(int a,int b) • { int wa=15; • { int sa=75; • sa=b-a; • wa=sa+g; } • if(a<b){ • int sa=82; • sa=a-b; • wa=sa+h; } • return wa; • } • main() • { int u=3,v=7,w=61; • w=func(u,v);} FP ここ BP DP

  28. Dsegの使用状況の推移[2] • int g=42,h=53; • int func(int a,int b) • { int wa=15; • { int sa=75; • sa=b-a; • wa=sa+g; } • if(a<b){ • int sa=82; • sa=a-b; • wa=sa+h; } • return wa; • } • main() • { int u=3,v=7,w=61; • w=func(u,v);} FP ここ BP DP

  29. Dsegの使用状況の推移[2] • int g=42,h=53; • int func(int a,int b) • { int wa=15; • { int sa=75; • sa=b-a; • wa=sa+g; } • if(a<b){ • int sa=82; • sa=a-b; • wa=sa+h; } • return wa; • } • main() • { int u=3,v=7,w=61; • w=func(u,v);} FP BP ここ DP

  30. Dsegの使用状況の推移[2] • int g=42,h=53; • int func(int a,int b) • { int wa=15; • { int sa=75; • sa=b-a; • wa=sa+g; } • if(a<b){ • int sa=82; • sa=a-b; • wa=sa+h; } • return wa; • } • main() • { int u=3,v=7,w=61; • w=func(u,v);} FP BP DP ここ

  31. Dsegの使用状況の推移[2] • int g=42,h=53; • int func(int a,int b) • { int wa=15; • { int sa=75; • sa=b-a; • wa=sa+g; } • if(a<b){ • int sa=82; • sa=a-b; • wa=sa+h; } • return wa; • } • main() • { int u=3,v=7,w=61; • w=func(u,v);} FP BP DP ここ

  32. Dsegの使用状況の推移[3] • int g=42,h=53; • int func(int a,int b) • { • int wa=15; • return wa; • } • main() • { • int u=3,v=7,w=61; • { • int x=31,y=90; • w=func(x+3,v-1); • } • w=u+w; • } FP BP ここ DP

  33. Dsegの使用状況の推移[3] • int g=42,h=53; • int func(int a,int b) • { • int wa=15; • return wa; • } • main() • { int u=3,v=7,w=61; • { • int x=31,y=90; • w=func(x+3,v-1); • } • w=u+w; • } FP DP BP ここ

  34. Dsegの使用状況の推移[3] • int g=42,h=53; • int func(int a,int b) • { • int wa=15; • return wa; • } • main() • { • int u=3,v=7,w=61; • { • int x=31,y=90; • w=func(x+3,v-1); • } • w=u+w; • } FP ここ BP DP

  35. Dsegの使用状況の推移[3] • int g=42,h=53; • int func(int a,int b) • { • int wa=15; • return wa; • } • main() • { int u=3,v=7,w=61; • { • int x=31,y=90; • w=func(x+3,v-1); • } • w=u+w; • } FP DP BP ここ

  36. Dsegの使用状況の推移[3] • int g=42,h=53; • int func(int a,int b) • { • int wa=15; • return wa; • } • main() • { • int u=3,v=7,w=61; • { • int x=31,y=90; • w=func(x+3,v-1); • } • w=u+w; • } FP BP DP ここ

  37. 課題 Dsegの変化を書きなさい. int u; int func1(int x,int y) { int wa; wa=x+y; { int u; u=17; wa=wa+u;} return wa;} main () { int a,b,c; a=12; u=23; { int c,d; d=14; c=func1(a,d); a=u+c; } }

  38. 小テスト

  39. 問1: K言語 → VSM main() { int a,b; int c; c=b+a; } 12 PUSHI (0,3) 13 14 PUSH (0,1) 15 ADD 16 ASSGN 17 REMOVE ①PUSH(0,1) ②PUSHI(0,1) ③PUSH (0,2) ④PUSHI (0,2) ⑤PUSH (0,3) ⑥正解なし 問1

  40. 問2: K言語 → VSM main() { int a,b,c; { int c; c=b+25; } } 12 PUSHI (0,1) 13 14 PUSHI 25 15 ADD 16 ASSGN 17 REMOVE ①PUSHI(1,1) ②PUSH(1,1) ③PUSH (1,2) ④PUSHI (1,2) ⑤PUSH (0,2) ⑥正解なし 問2

  41. 問3: K言語 → VSM main() { int a,b,c; { int c; a=c-3; } a=b-3; } 12 PUSHI (0,1) 13 14 PUSHI 3 15 SUB 16 ASSGN 17 REMOVE ①PUSHI(1,1) ②PUSH(1,1) ③PUSH (0,2) ④PUSHI (0,1) ⑤PUSHI (0,2) ⑥正解なし 問3

  42. 問4 int func1 (int x,int y) { int wa; wa=y+wa; return wa; } main(){ c=func1(12,34); } 2 PUSHI (0,1) 3 4 PUSH (0,1) 5 ADD 6 ASSGN 7 REMOVE ①PUSHI(1,-1) ②PUSH(1,-2) ③PUSH (0,1) ④PUSH (0,-3) ⑤PUSHI (0,-4) ⑥正解なし 問4

  43. 問5 int func1 (int x,int y) { int wa; wa=x+y; return wa; } main(){ int a,b,c; c=func1(12,34); } 20 21 PUSHI 12 22 POP 23 PUSHI 34 24 POP 25 CALL 1 26 ASSGN 27 REMOVE 問5 ①PUSHI(1,2) ②PUSH(1,3) ③PUSH (0,2) ④PUSH (0,3) ⑤PUSHI (0,3) ⑥正解なし

More Related