前提
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}
> 関数ポインタの使用例とそのコードを教えていただけると幸いです。
呈示されたそのコードのどこがわからんですか? 他のサンプルをお望みですか?
提示されたサンプル自体は理解出来るのですが、関数ポインタ
double (*op)(double x, double y);を用いるメリットが分からないです。
また、別のサンプルがあれば拝見してみたいです。
多分ググればすぐ出てくる関数ポインタの例を書けと言われると、課題であることを疑われてしまっているんじゃないかと思いますね。
これは例えばですが、特殊な並びの計算機とか書けますよ。
どんな文字列が入力になるかは解析してみてください(一部伏せ字)。
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;
}
丁寧にありがとうございます。
関数ポインタの例は多く掲載されていますが、そのメリットがイマイチ理解出来なかったためこういった質問をさせていただきました。

回答3件
あなたの回答
tips
プレビュー