差分

ナビゲーションに移動 検索に移動

LUT

3,412 バイト除去, 2013年4月11日 (木) 04:31
ページの作成:「;LUT * ルックアップテーブル (Look-up Table) {{aimai}} {{stub}}」
'''関数ポインター'''とは、[[関数]]の[[ポインター]]である。 == 英語読みについて ==日本語でいう「[[関数]]」は[[プログラミング言語]]によって「ファンクション(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(10Look-up Table);  Console.WriteLine("main: {0}", result); }}</source> == 関連項目 ==* [[第一級関数]]* [[高階関数]]* [[クロージャー]]* [[ラムダ式]] == 参考文献 =={{reflistaimai}} 
{{stub}}
匿名利用者

案内メニュー