椚座です。 On Thu, 18 Nov 2004 16:58:00 +0900 "Koji Takeuchi" <ktakeuchi@xxxxxxxxxxxxxxxxx> wrote: > void Func_0(void) > { > /* 600番地から始まるループ(関数)に飛びなさい */ > return; > } > > 上のコメント部、/*〜*/をC言語で表現できませんでしょうか? すでに回答が書かれていますが,絶対番地を指定した,極めて複雑な 呼び出しでも,C で記述することは可能です。自分で作る場合の 手順としては,まずただの定数に意味を与えるキャストを考えます。 ご質問の例では,0x600 は関数へのポインタであるので, (void (*)())0x600 というキャストを与えます(戻り値の型がないと関数へのポインタに ならないので,ここでは void とした)。こうすることで,0x600 は 関数と等価なものになるので,これ自体を括弧でくくり,ケツに () を つければ呼び出せるわけです。 ((void (*)())0x600)(); ちなみに,引数がある場合なら ((void (*)(int))0x600)(1234); なんて感じでやります。 このぐらいなら覚えてもいいと思いますが,「関数へのポインタへの ポインタへのポインタ」みたいに,より複雑なものになってくると, 頭で考えるのが困難になってきます。こういうときは,簡単な英語で 述べた内容をCの宣言に変換してくれる cdecl というツールを使う手も あります。この例なら,cdecl に cast x into pointer to function returning void と与えると,希望のキャストが得られます。 cdecl も,慣れていないと使いにくいのですが,手に負えなくなった ときには有用なので,ご参考までに挙げておきます。 椚座 淳介 (Junsuke Kunugiza) E-Mail: jk@xxxxxxx http://www.exp.org/