ページ 11

関数に関数名を渡す際の記述の仕方について教えてください。

Posted: 2013年4月19日(金) 21:45
by いちこ
こんばんは、プログラミングで困っています。
初心者です。
アドバイスおねがいします。

関数の引数として別の関数の名前をわたしたとき、引数をうけとる関数はどのように記述すればよいのでしょうか。

プログラム全体の動作は簡単で、メイン関数内の配列xに格納された値にそれぞれ10を足して出力させます。
メイン関数で関数funcを呼び出す際、引数として関数plusの名前をわたします。

※メイン関数はこのままで、関数plusとfuncだけを改善したいです。
関数のポインタについて調べていたのですが、よくわからなかったので質問させていただきます。

下は、自分なりに作ったプログラムです。
特に「*****」の部分をどう記述すればよいのか、解説をいただけるとうれしいです。
宜しくお願いします。

コード:

#include <stdio.h>

int plus(int);
void func(int *,int,*****);

int main(void)
{
	int i;
	int x[5]={0,1,2,3,4};

	func(x,5,plus);

	for(i=0; i<5; i++){
		printf("x[%d]=%d\n",i,x[i]);
	}
	return 0;
}

int plus(int a)
{
	return a+10;
}

void func(int *a,int b,*****)
{
	int i;
	for(i=0; i<b; i++){
		a++;
	}
}

Re: 関数に関数名を渡す際の記述の仕方について教えてください。

Posted: 2013年4月19日(金) 21:47
by みけCAT
qsortの書き方を参考にするといいかもしれません。
http://9cguide.appspot.com/r_lib.html#S2

Re: 関数に関数名を渡す際の記述の仕方について教えてください。

Posted: 2013年4月19日(金) 21:57
by いちこ
>>みけCATさん
返信ありがとうございます。
int(*compar)(const void *x, const void *y)
のところですよね。
ありがとうございます、少し考えてきます!

Re: 関数に関数名を渡す際の記述の仕方について教えてください。

Posted: 2013年4月19日(金) 22:15
by いちこ
みけCATさんのアドバイスを参考にもう一度考えなおしたところ、
次のようなプログラムを作成することができました。
実行は成功しました、ありがとうございます(><)

コード:

#include <stdio.h>

int plus(int);
void func(int *,int,char *);

int main(void)
{
	int i;
	int x[5]={0,1,2,3,4};

	func(x,5,plus);

	for(i=0; i<5; i++){
		printf("x[%d]=%d\n",i,x[i]);
	}
	return 0;
}

int plus(int a)
{
	return a+10;
}

void func(int *a,int b,char *c)
{
	int (*p)(int)=c;
	
	int i;
	for(i=0; i<b; i++){
		*a=p(*a);
		a++;
	}
}
改善できる点がありましたら、引き続きアドバイスをいただけるとうれしいです。
宜しくお願いします。

Re: 関数に関数名を渡す際の記述の仕方について教えてください。

Posted: 2013年4月19日(金) 22:41
by みけCAT
なぜわざわざ関数の引数をchar*型にしたのですか?
普通に関数ポインタを引数にすればいいと思います。

Re: 関数に関数名を渡す際の記述の仕方について教えてください。

Posted: 2013年4月19日(金) 22:42
by nil
char*に暗黙のキャストをするよりも
関数ポイントとして引数を定義したほうが明示的でわかりやすいと思います。

コード:

 
int plus(int);
void func(int *,int,int (*p)(int a));
 
int main(void)
{
    int i;
    int x[5]={0,1,2,3,4};
 
    func(x,5,&plus);
 
    for(i=0; i<5; i++){
        printf("x[%d]=%d\n",i,x[i]);
    }
    return 0;
}
 
int plus(int a)
{
    return a+10;
}
 
void func(int *a,int b,int (*p)(int a))
{    
    int i;
    for(i=0; i<b; i++){
        *a=p(*a);
        a++;
    }
}

Re: 関数に関数名を渡す際の記述の仕方について教えてください。

Posted: 2013年4月20日(土) 08:12
by いちこ
>>みけCATさん
返信ありがとうございます。
言われてみるとそうですね(><)
ご指摘ありがとうございます!

>>涼雅さん
返信ありがとうございます。
なるほどです!
解説してくださってありがとうございます(><)

解決しました!お二方ともありがとうございました!