質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

749閲覧

C言語の関数ポインタの使用例のついて

kazato

総合スコア5

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2023/01/23 15:45

前提

C言語を学習していますが、関数ポインタについての理解がいまいちです。そこで、関数ポインタの使用例とそのコードを教えていただけると幸いです。

例 加減乗除のプログラム

C

1double add(double p, double q); 2double minus(double p, double q); 3double multi(double p, double q); 4double divi(double p, double q); 5 6int main(int argc, char *argv[]){ 7 double a, b, out; 8 char *operation; 9 double (*op)(double x, double y); 10 11 a=atof(argv[1]); 12 operation = argv[2]; 13 b=atof(argv[3]); 14 if(strcmp(operation, "tasu")==0){ 15 op=add; 16 }else if(strcmp(operation, "hiku")==0){ 17 op=minus; 18 }else if(strcmp(operation, "kakeru")==0){ 19 op=multi; 20 }else if(strcmp(operation, "waru")==0){ 21 op=divi; 22 }else{printf("Invalid operation.\n"); exit(-1); 23 } 24 out = op(a, b); 25 printf("result = %f\n", out); 26}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2023/01/23 19:02 編集

> 関数ポインタの使用例とそのコードを教えていただけると幸いです。 呈示されたそのコードのどこがわからんですか? 他のサンプルをお望みですか?
kazato

2023/01/23 21:55

提示されたサンプル自体は理解出来るのですが、関数ポインタ double (*op)(double x, double y);を用いるメリットが分からないです。 また、別のサンプルがあれば拝見してみたいです。
dameo

2023/01/24 00:00

多分ググればすぐ出てくる関数ポインタの例を書けと言われると、課題であることを疑われてしまっているんじゃないかと思いますね。 これは例えばですが、特殊な並びの計算機とか書けますよ。 どんな文字列が入力になるかは解析してみてください(一部伏せ字)。 typedef double (*operatorp)(double, double); operatorp get_op(char ch) { static const char symbols[] = {'+', '-', '*', '/'}; static const operatorp funcs[] = {&add, &minus, &multi, &divi}; operatorp op = NULL; for (int i = 0; i < sizeof(symbols)/sizeof(symbols[0]); ++i) { if (ch == symbols[i]) { op = funcs[i]; break; } } return op; } char* calc(char* p, double* result) { double data[2]; operatorp op = get_op(*p++); if (op == NULL) return NULL; for (int data_idx = 0; data_idx < 2;) { if (get_op(*p) != NULL) { if ((○ = calc(○, &✕[△++])) == NULL) return NULL; } else { // cannot detect error data[data_idx++] = strtod(p, &p); } if (data_idx == 1 && *p == ',') ++p; } *result = op(data[0], data[1]); return p; }
kazato

2023/01/24 01:21

丁寧にありがとうございます。 関数ポインタの例は多く掲載されていますが、そのメリットがイマイチ理解出来なかったためこういった質問をさせていただきました。
guest

回答3

0

例としては qsort 関数とかだと「メリット」が分かりやすいんじゃないでしょうか.
(以降の説明は省略.ググってもらった方が早いし正確でしょうから.)

投稿2023/01/24 01:01

fana

総合スコア11673

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazato

2023/01/24 01:22

少し理解が深まりました。ありがとうございます。
guest

0

ベストアンサー

ファンクタとして合成する(とかカスタマイゼーションポイントを提供する)目的であれば、qsortやbsearchの比較関数とか。
コールバック(何か起きたときに呼び出して欲しい)として典型なのは、シグナルハンドラとしての登録(signal)とかも。
いわゆるインターフェースで使う、ということであればCOM/OLEのvtblとかLinuxのfile_operationsとか。( https://github.com/torvalds/linux/blob/master/include/linux/fs.h#L2091 )

投稿2023/01/23 22:54

matukeso

総合スコア1594

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazato

2023/01/24 01:23

様々な利点を教えていただきありがとうございました。 大して使われてないと思っていたのですが、身近な使用例もあるのですね。
guest

0

double (*op)(double x, double y);を用いるメリットが分からないです。

メリットは全く無いです。

out = op(a, b);

これがなにをしてるか理解しよう、ってだけのはなしですよ

投稿2023/01/23 22:10

y_waiwai

総合スコア87784

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazato

2023/01/23 22:34

回答ありがとうございます。 関数ポインタが有効活用されているコード例等ありましたら教えて頂けると幸いです。
dodox86

2023/01/24 00:17

様々な意見、捉え方は有ると思いますが、メリットが”全く”無いは言い過ぎだと思います。実行部分を集約することができますし、提示のコード例でもそれが表現出来ています。。良くある状態遷移テーブルに対応した関数マトリクステーブルなどの利用例があります。
y_waiwai

2023/01/24 00:27

この程度の動作を行うためのコードとしては、関数ポインタを使うのは全くの悪手だと思いますよ。 おっしゃるような状態遷移に使うならまだしも、これではデメリットしか見えません。 #そりゃ説明のためのサンプルだ、ってはなしなんですが、これからメリットなるものを汲み取ろうというのは無意味ですわな
Zuishin

2023/01/24 02:17

サンプルは基礎なので、そのコードそのものではなく、そこから応用できる可能性からメリットを感じ取らなければいけません。 高階関数は非常に有用な技術であり、そのメリットははかりしれません。 デメリットしか見えないとしたら、それはその人がろくにコードを書かないからでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問