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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
いちこ
記事: 62
登録日時: 8年前
連絡を取る:

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

#1

投稿記事 by いちこ » 7年前

こんばんは、プログラミングで困っています。
初心者です。
アドバイスおねがいします。

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

プログラム全体の動作は簡単で、メイン関数内の配列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++;
	}
}

アバター
みけCAT
記事: 6284
登録日時: 9年前
住所: 千葉県
連絡を取る:

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

#2

投稿記事 by みけCAT » 7年前

qsortの書き方を参考にするといいかもしれません。
http://9cguide.appspot.com/r_lib.html#S2
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

いちこ
記事: 62
登録日時: 8年前
連絡を取る:

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

#3

投稿記事 by いちこ » 7年前

>>みけCATさん
返信ありがとうございます。
int(*compar)(const void *x, const void *y)
のところですよね。
ありがとうございます、少し考えてきます!

いちこ
記事: 62
登録日時: 8年前
連絡を取る:

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

#4

投稿記事 by いちこ » 7年前

みけ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++;
	}
}
改善できる点がありましたら、引き続きアドバイスをいただけるとうれしいです。
宜しくお願いします。

アバター
みけCAT
記事: 6284
登録日時: 9年前
住所: 千葉県
連絡を取る:

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

#5

投稿記事 by みけCAT » 7年前

なぜわざわざ関数の引数をchar*型にしたのですか?
普通に関数ポインタを引数にすればいいと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

nil
記事: 428
登録日時: 8年前

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

#6

投稿記事 by nil » 7年前

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

いちこ
記事: 62
登録日時: 8年前
連絡を取る:

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

#7

投稿記事 by いちこ » 7年前

>>みけCATさん
返信ありがとうございます。
言われてみるとそうですね(><)
ご指摘ありがとうございます!

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

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

閉鎖

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