ページ「関数ポインタ」と「LUT」の間の差分

提供: MonoBook
(ページ間の差分)
ナビゲーションに移動 検索に移動
 
(ページの作成:「;LUT * ルックアップテーブル (Look-up Table) {{aimai}} {{stub}}」)
 
1行目: 1行目:
'''関数ポインター'''とは、[[関数]]の[[ポインター]]である。
+
;LUT
 
+
* [[ルックアップテーブル]] (Look-up Table)
== 英語読みについて ==
+
{{aimai}}
日本語でいう「[[関数]]」は[[プログラミング言語]]によって「ファンクション(function)」だったり「メソッド(method)」だったりと曖昧なので、英語での呼び方も「function pointers」だったり「method pointers」だったり「functors」だったりと様々である。よって名称・呼称の細かい違いは気にしてはならない。時間の無駄である。
 
 
 
== 概要 ==
 
関数ポインタは[[関数]]を[[変数]]のように扱えてうれしいという物である。
 
 
 
主に絶望的なほど巨大な分岐処理を、関数ポインタの[[LUT]]に置き換えてることで[[ソースコード]]を単純化するなどという場面で使われる。[[ゲーム]]などではよく多用される技法である。
 
 
 
また、[[コールバック関数]]と呼ばれる使われ方もある。たとえば[[Windows]]などのいわゆる[[イベントドリブン]]な[[実装]]では、何かしらの[[イベント]]発生時に関数ポインタ変数が[[NULL]]ではなかったら[[関数]]([[コールバック関数]])を実行する、などという使われ方をしている。
 
 
 
== 記述例 ==
 
=== C言語 ===
 
[[C言語]]系の[[プログラミング言語]]では[[実引数]]の[[型]]が一致していなくても怒られないことが多い。そのため、その扱いには注意を要し、一歩間違えれば[[バグ]]の温床となる。
 
<source lang="c">
 
#include <stdio.h>
 
 
 
static int func(int a)
 
{
 
    printf("func: %d\n", a);
 
    return 2 * a + 3;
 
}
 
 
 
int main(void)
 
{
 
    int (*f1)(int a) = func;
 
    int result = (*f1)(10);
 
 
 
    printf("main: %d\n", result);
 
    return 0;
 
}
 
</source>
 
 
 
=== Pascal ===
 
元祖[[Pascal]]にはそもそも[[ポインタ]]自体がない。よって関数ポインタもない。
 
 
 
=== Turbo Pascal ===
 
[[Turbo Pascal]]にはPointer型という名の[[ポインタ]]が追加されている。
 
<source lang="delphi">
 
program Test;
 
 
 
uses
 
  Classes;
 
 
 
type
 
  TFuncPointer = function(a : Integer):Integer;
 
 
 
function Func(a : Integer):Integer;
 
begin
 
  WriteLn('Func: ', a);
 
  Func := 2 * a + 3;
 
end;
 
 
 
var
 
  ptr : Pointer;
 
  ret : Integer;
 
begin
 
  ptr := @Func;
 
  ret := TFuncPointer(ptr)(10);
 
  WriteLn('Main: ', ret);
 
end.
 
</source>
 
 
 
=== C# ===
 
[[C Sharp|C#]]は見た目こそ[[C言語]]似だが、その実態は[[Turbo Pascal]]の方言であるため、基本は[[Turbo Pascal]]に右に倣えである。
 
 
 
[[C Sharp|C#]]では関数ポインタは[[オブジェクト指向プログラミング言語]]として、同一[[インスタンス]]内の[[フィールド変数]]や[[プロパティ]]を[[参照]]できるなど、若干の改良が加えられており、その名称も「[[デリゲート]]」と改名されている。名称と微妙な機能の差はあるが基本は同じである。
 
<source lang="csharp">
 
using System;
 
 
 
class App
 
{
 
    delegate int FuncDelegate(int a);
 
 
 
    static int Func(int a)
 
    {
 
        Console.WriteLine("func: {0}", a);
 
        return 2 * a + 3;
 
    }
 
 
 
    static void Main()
 
    {
 
        var f1 = new FuncDelegate(Func);
 
        int result = f1(10);
 
 
 
        Console.WriteLine("main: {0}", result);
 
    }
 
}
 
</source>
 
 
 
== 関連項目 ==
 
* [[第一級関数]]
 
* [[高階関数]]
 
* [[クロージャー]]
 
* [[ラムダ式]]
 
 
 
== 参考文献 ==
 
{{reflist}}
 
 
 
 
{{stub}}
 
{{stub}}

2013年4月11日 (木) 04:31時点における最新版

LUT