関数を引数に。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
abc

関数を引数に。

#1

投稿記事 by abc » 16年前

関数を関数の引数で渡し、その引数を実行したい場合どの用にすれば良いでしょうか?
(XPでC言語です)


void a();

void setb(void * func);関数を引数で貰う関数

void main()
{
setb(a);
}
みたいな感じで関数ポインタを渡すことは可能でしょうか??
可能な場合、関数ポインタを実行する場合どのようにすれば良いでしょうか?
(可能か分かりませんが、私の考えたのが、直接プログラムカウンタをいじくることです。不可能かも(TT))
どうかよろしくお願いします。

Mist

Re:関数を引数に。

#2

投稿記事 by Mist » 16年前

サンプルソースです。
#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;
}

abc

Re:関数を引数に。

#3

投稿記事 by abc » 16年前

お早い回答ありがとうございます。
私の勉強不足で申し訳ないのですが、
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)勉強不足ですみません。

abc

Re:関数を引数に。

#4

投稿記事 by abc » 16年前

Mistさんありがとうございます。出来ました。
出来たには出来たのですが今ひとつtypedef void (*PFUNC)(void);が分からない部分があるので
もし時間があれば教えてください。
ありがとうございました。

Mist

Re:関数を引数に。

#5

投稿記事 by Mist » 16年前

関数ポインタの宣言は「戻り値 (*)(引数)」です。
この形でないとだめです。

> 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);
}

abc

Re:関数を引数に。

#6

投稿記事 by abc » 16年前

関数ポインタの宣言は「戻り値 (*)(引数)」覚えておきます。
かなり参考になりました。(答えを教えてもらっただけかもしれませんが自分の為になったと思います)

ありがとうございました。また分からない事が出来たときにお願いします。
(プログラムカウンタを直接いじるのは馬鹿ですね笑)

toyo

Re:関数を引数に。

#7

投稿記事 by toyo » 16年前

関数ポインタも関数なので普通の関数の宣言
戻り値 関数名(引数)
の関数名がポインタ変数になるだけ
と覚えればいいでしょう

初級者

Re:関数を引数に。

#8

投稿記事 by 初級者 » 16年前

>toyoさん
>関数ポインタも関数なので

関数ポインタはその関数へのポインタであり、
関数そのものではありません。

pfが関数ポインタのとき、
(*pf)();
と書くべきところを
pf();
と簡略化できる、というだけです。

閉鎖

“C言語何でも質問掲示板” へ戻る