49499


c言語では関数を引数にとる関数を定義できて、

[code]

    double calc1(double a);
    double calc2(double func(double),double a){
        return func(a);
    }
    
[/code]

のようにすれば、

[code]

    calc2(calc1,a);
    
[/code]

という計算ができますが、calc1が2変数関数だったときに、

[code]

    double calc1(double a,double b);
    
[/code]

「calc1のaにある変数を代入した関数」をcalc2に渡すことはできますか？


CC BY-SA 4.0
2018-10-21T08:12:08.583
49497
2018-10-21T11:11:54.253
2018-10-21T11:04:30.610
29754
question
c
関数を引数とする関数について


ご質問のように多引数の関数の一部の引数に値を与えて、より引数の少ない関数を得ることを「部分適用」と言ったりしますが、C言語そのものには部分適用を簡単に表現する機構はありません。(特殊なABIを採用するコンパイラで、比較的簡単にそんなことができるものもあるようですが。)

別に1引数の中間関数を定義する必要があるでしょう。

[code]

    double calc1(double a, couble b);
    
    double calc1partial5(double b) {
        return calc1(5.0, b);
    }
    
    calc2(calc1partial5, a);
    
[/code]

「calc1のaにある変数を代入」の「ある変数」がローカル変数だったりすると、通常のC言語の関数として構成するのは無理だろうと思います。


CC BY-SA 4.0
2018-10-21T09:06:33.650
49499
2018-10-21T09:06:33.650
13972
49497
answer


GCC の [Nested Function](https://gcc.gnu.org/onlinedocs/gcc/Nested-
Functions.html) を使う方法もあるのかなと思ったのですが、

[code]

    #include <stdio.h>
    
    double calc1(double a, double b) {
      return a + b;
    }
    
    double (*calc2(double func(double, double), double a))(double){
      double calc3(double b) {
        return func(a, b);
      }
      return calc3;
    }
    
    int main () {
      double x = 1;
      double y = 2;
      double (*f)(double) = calc2(calc1, x);
      printf("%f\n", f(y));
    }
    
[/code]

[Nested Function](https://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html)

> If you try to call the nested function through its address after the
> containing function exits, **all hell breaks loose**.

まぁ、当然そうなりますよね。。。

参考にはなりませんけど、なんだかもったいない様な気がするのでので回答？として上げておきます。


CC BY-SA 4.0
2018-10-21T11:00:50.357
49502
2018-10-21T11:11:54.253
2018-10-21T11:11:54.253
49497
answer