ページ 11

関数アドレステーブルから各関数アドレスを取り出し、関数アドレス変数に代入する。

Posted: 2015年12月24日(木) 17:29
by imagine
初めておじゃまします。
どうにも解決できないので 申し訳ありませんが、お尋ねします。

[件名]の通り、関数アドレステーブルには、引数の異なる関数のアドレスが入っており、 これをそれぞれの関数アドレス変数に代入したいのですがコンパイルエラーになってしまいます。

// BIOS_Table::関数アドレステーブル
//         +0:引数が、1つの関数アドレス
//         +1:引数が、2つの関数アドレス
// BIOS_00 : 引数が、1つの関数アドレス変数
// BIOS_01 : 引数が、2つの関数アドレス変数

int (*BIOS_Table) [];
int (*BIOS_00) (int);
int (*BIOS_01) (int,int);

BIOS_Table = (void*) swi0x00_function(); //関数アドレステーブルを返すfunction
BIOS_00 = BIOS_Table[0];  <<<< error (関数アドレスを取り出し、変数に入れたい)
BIOS_01 = BIOS_Table[1];  <<<< error (関数アドレスを取り出し、変数に入れたい)


色々キャストしてみたのですが解決できません。 どうぞ宜しくお願いいたします。

Re: 関数アドレステーブルから各関数アドレスを取り出し、関数アドレス変数に代入する。

Posted: 2015年12月24日(木) 18:20
by ISLe
typedefを使うと難しく考えなくて済むと思います。

typedef int (*BIOS_00_PTR) (int);
typedef int (*BIOS_01_PTR) (int,int);
BIOS_00_PTR BIOS_00;
BIOS_01_PTR BIOS_01;
(略)
BIOS_00 = (BIOS_00_PTR)BIOS_Table[0];
BIOS_01 = (BIOS_01_PTR)BIOS_Table[1];

Re: 関数アドレステーブルから各関数アドレスを取り出し、関数アドレス変数に代入する。

Posted: 2015年12月24日(木) 19:03
by imagine
ありがとうございました。  解決しました。
長くやっていても知らないことばかりで、助かりました。

typedef int (*BIOS_00_PTR) (int);
typedef int (*BIOS_01_PTR) (int,int);
typedef int (*BIOS_02_PTR) (int,int,int);
typedef int (*BIOS_03_PTR) (int,int,int,int);

ENTRY uint32_t* BIOS_Table;
ENTRY BIOS_00_PTR BIOS_00;
ENTRY BIOS_01_PTR BIOS_01;
ENTRY BIOS_02_PTR BIOS_02;
ENTRY BIOS_03_PTR BIOS_03;

BIOS_Table = (void*) swi0x00_function();
BIOS_00 = (BIOS_00_PTR) ( BIOS_Table[0] );
BIOS_01 = (BIOS_01_PTR) ( BIOS_Table[1] );
BIOS_02 = (BIOS_02_PTR) ( BIOS_Table[2] );
BIOS_03 = (BIOS_03_PTR) ( BIOS_Table[3] );

Re: 関数アドレステーブルから各関数アドレスを取り出し、関数アドレス変数に代入する。

Posted: 2015年12月24日(木) 22:26
by みけCAT
解決したのでしたら、解決チェックをお願いします。
解決チェックをするには、投稿画面の「送信」ボタンの右側にある「解決!」にチェックを入れた状態で返信を投稿してください。

Re: 関数アドレステーブルから各関数アドレスを取り出し、関数アドレス変数に代入する。

Posted: 2015年12月25日(金) 10:41
by imagine
申し訳ありません。
[クイック返信]で行なったため、[解決]のチェックがありませんでした。