差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
odin:procedures [2025/05/20 12:16] freemikanodin:procedures [2025/06/13 10:03] (現在) – [プロシージャ] Set link to odin top page for logo image freemikan
行 1: 行 1:
 ====== プロシージャ ====== ====== プロシージャ ======
 +[[odin:|{{:odin:odin_logo.svg?200|Odin}}]]
 +
 何かの仕事を行うプログラムの一部分をまとめて、繰り返し利用できるようにしたり、コードの構造を整理したりするために、プロシージャを用います。 何かの仕事を行うプログラムの一部分をまとめて、繰り返し利用できるようにしたり、コードの構造を整理したりするために、プロシージャを用います。
 プロシージャとは手続きという意味です。 プロシージャとは手続きという意味です。
行 5: 行 7:
 Pascal言語などのように、値を返すかどうかによって関数とプロシージャに呼び分けれている場合もありますが、Odinではどちらもプロシージャと呼びます。 Pascal言語などのように、値を返すかどうかによって関数とプロシージャに呼び分けれている場合もありますが、Odinではどちらもプロシージャと呼びます。
  
 +
 +===== 基本 =====
 すでにひとつプロシージャが登場しています。 すでにひとつプロシージャが登場しています。
 mainプロシージャです。 mainプロシージャです。
行 39: 行 43:
 ''(a: int, b: int)'' とすることもできますが、通常はまとめてしまった方が良いでしょう。 ''(a: int, b: int)'' とすることもできますが、通常はまとめてしまった方が良いでしょう。
  
 +===== 名前付き戻り値 =====
 戻り値に名前をつけることができます。 戻り値に名前をつけることができます。
  
行 47: 行 52:
 </code> </code>
  
-複数の値を返すことができます。+===== 複数の値を返す ===== 
 +プロシージャは複数の値を返すことができます。
  
 <code odin> <code odin>
行 60: 行 66:
 </code> </code>
  
 +===== 名前付き引数 =====
 引数を名前で渡すことができます。 引数を名前で渡すことができます。
  
行 79: 行 86:
 </code> </code>
  
 +===== パラメーターのデフォルト値 =====
 +パラメーターのデフォルト値を設定することができます。
  
 +<code odin>
 +Rect :: struct {
 + x, y:          int,
 + width, height: int,
 +}
 +
 +make_square :: proc(x, y: int, size := 100) -> Rect {
 + // sizeのデフォルト値を100とします。
 + // 100という数値に特に意味はありません。
 +
 + return Rect{x = x, y = y, width = size, height = size}
 +}
 +
 +main :: proc() {
 + r := make_square(10, 20)
 + assert(r.x == 10 && r.y == 20 && r.width == 100 && r.height == 100)
 +}
 +</code>
 +
 +===== オーバーロード =====
 +プロシージャのオーバーロード、すなわちパラメーターが異なる同じ名前のプロシージャを複数定義することが可能です。
 +ただし、C++などのように、単に同じ名前のプロシージャを定義すれば良いだけではなく、明示的にオーバーロードすることを記述しなければなりません。
 +1ステップ追加の作業が必要になります。
 +
 +<code odin>
 +Vector2i :: struct {
 + x, y: int 
 +}
 +
 +Vector3i :: struct {
 + x, y, z: int
 +}
 +
 +dot2 :: proc(a, b: Vector2i) -> int {
 + return a.x * b.x + a.y * b.y
 +}
 +
 +dot3 :: proc(a, b: Vector3i) -> int {
 + return a.x * b.x + a.y * b.y + a.z * b.z
 +}
 +
 +// 明示的なプロシージャのオーバーロード
 +dot :: proc{dot2, dot3}
 +
 +main :: proc() {
 + a := Vector2i{x = 1, y = 1}
 + b := Vector2i{x = 10, y = 10}
 + assert(dot(a, b) == 20)
 +
 + c := Vector3i{x = 1, y = 1, z = 1}
 + d := Vector3i{x = 10, y = 20, z = 30}
 + assert(dot(c, d) == 60)
 +}
 +</code>
  
文書の先頭へ