関数を関数の引数で渡し、その引数を実行したい場合どの用にすれば良いでしょうか?
(XPでC言語です)
例
void a();
void setb(void * func);関数を引数で貰う関数
void main()
{
setb(a);
}
みたいな感じで関数ポインタを渡すことは可能でしょうか??
可能な場合、関数ポインタを実行する場合どのようにすれば良いでしょうか?
(可能か分かりませんが、私の考えたのが、直接プログラムカウンタをいじくることです。不可能かも(TT))
どうかよろしくお願いします。
関数を引数に。
Re:関数を引数に。
サンプルソースです。
#include <stdio.h> typedef void (*PFUNC)(void); void hoge(PFUNC pfunc) { (*pfunc)(); } void hogehoge(void) { printf("hoge---!!\n"); } int main(void) { hoge(hogehoge); return 0; }
Re:関数を引数に。
お早い回答ありがとうございます。
私の勉強不足で申し訳ないのですが、
int *funcA[10];グローバルの関数アドレス格納変数
void a();
void setb(void * func)
{
int i;
for(i = 0;i<10;i++)
{
if(funcA == 0)
{
funcA = func;関数のアドレスをグローバルの配列に格納
}
}
}
void main()
{
memset(funcA,0,sizeof(funcA));0初期化
setb(a);
}
この場合に funcAの関数を実行する時にも同じ方法でよろしいのでしょうか?
あとtypedef void (*PFUNC)(void);の意味も教えていただけないでしょうか(TT)勉強不足ですみません。
私の勉強不足で申し訳ないのですが、
int *funcA[10];グローバルの関数アドレス格納変数
void a();
void setb(void * func)
{
int i;
for(i = 0;i<10;i++)
{
if(funcA == 0)
{
funcA = func;関数のアドレスをグローバルの配列に格納
}
}
}
void main()
{
memset(funcA,0,sizeof(funcA));0初期化
setb(a);
}
この場合に funcAの関数を実行する時にも同じ方法でよろしいのでしょうか?
あとtypedef void (*PFUNC)(void);の意味も教えていただけないでしょうか(TT)勉強不足ですみません。
Re:関数を引数に。
Mistさんありがとうございます。出来ました。
出来たには出来たのですが今ひとつtypedef void (*PFUNC)(void);が分からない部分があるので
もし時間があれば教えてください。
ありがとうございました。
出来たには出来たのですが今ひとつtypedef void (*PFUNC)(void);が分からない部分があるので
もし時間があれば教えてください。
ありがとうございました。
Re:関数を引数に。
関数ポインタの宣言は「戻り値 (*)(引数)」です。
この形でないとだめです。
> void setb(void * func)
こう書いた場合の引数はvoidのポインタというだけです。
void setb(void (*func)(void))
というふうに書かないとだめです。
そのため、関数アドレスの格納変数も
void (*pfunctbl[10])(void)
というふうに宣言しないといけません。
> typedef void (*PFUNC)(void);
これは毎回毎回「void (*)(void)」と書くのはめんどくさいので、PFUNCという文字に置き換えますという宣言です。
そのため、
「PFUNC pfunc」は「void (*pfunc)(void)」と書くのと等価になります。
見た目が普通の変数を宣言するのと変わらなくなるため私はこうしています。
サンプル改
この形でないとだめです。
> void setb(void * func)
こう書いた場合の引数はvoidのポインタというだけです。
void setb(void (*func)(void))
というふうに書かないとだめです。
そのため、関数アドレスの格納変数も
void (*pfunctbl[10])(void)
というふうに宣言しないといけません。
> typedef void (*PFUNC)(void);
これは毎回毎回「void (*)(void)」と書くのはめんどくさいので、PFUNCという文字に置き換えますという宣言です。
そのため、
「PFUNC pfunc」は「void (*pfunc)(void)」と書くのと等価になります。
見た目が普通の変数を宣言するのと変わらなくなるため私はこうしています。
サンプル改
#include <stdio.h> //typedef void (*PFUNC)(void); void (*pfunctbl[10])(void); // 関数アドレス格納配列 // PFUNC pfunctbl[10]; // typedefしている場合はこういう宣言ができる void hoge(void (*pfunc)(void)) { //void hoge(PFUNC pfunc) { pfunctbl[0] = pfunc; (*pfunctbl[0])(); } void hogehoge(void) { printf("hoge---!!\n"); } int main(void) { hoge(hogehoge); }
Re:関数を引数に。
関数ポインタの宣言は「戻り値 (*)(引数)」覚えておきます。
かなり参考になりました。(答えを教えてもらっただけかもしれませんが自分の為になったと思います)
ありがとうございました。また分からない事が出来たときにお願いします。
(プログラムカウンタを直接いじるのは馬鹿ですね笑)
かなり参考になりました。(答えを教えてもらっただけかもしれませんが自分の為になったと思います)
ありがとうございました。また分からない事が出来たときにお願いします。
(プログラムカウンタを直接いじるのは馬鹿ですね笑)
Re:関数を引数に。
>toyoさん
>関数ポインタも関数なので
関数ポインタはその関数へのポインタであり、
関数そのものではありません。
pfが関数ポインタのとき、
(*pf)();
と書くべきところを
pf();
と簡略化できる、というだけです。
>関数ポインタも関数なので
関数ポインタはその関数へのポインタであり、
関数そのものではありません。
pfが関数ポインタのとき、
(*pf)();
と書くべきところを
pf();
と簡略化できる、というだけです。