2017-10-28 8 views
1

3つの関数は配列ポインタODEによってアクセス可能な関数ポインタの配列へのポインタの配列を渡す[3]:C++トラブル以下

double voltage(double v) { 
    return Iapp - (gL*(v - EL)) - (gNa * pow(m, 3) * h * (v - ENa)) - (gK * pow(n, 4) * (v - EK)); 
} 

double hdot(double h) { 
    ah = 0.07*exp(-(v + 58)/20); 
    bh = 1/(exp(-0.1*(v + 28)) + 1); 
    return (phi * (ah*(1 - h) - bh*h)); 
} 
double ndot(double n) { 
    an = -0.01*(v + 34)/(exp(-0.1*(v + 34)) - 1); 
    bn = 0.125 * exp(-(v + 44)/80); 
    return (phi * (an*(1 - n) - bn*n)); 
} 

typedef double(*eqpointer)(void); 
eqpointer ODE[3]; 

そのような別の機能において

ODE[0] = voltage; 
ODE[1] = hdot; 
ODE[2] = ndot; 

midvaluesその,オンスロープおよびk1は配列へのポインタです。

for (int j{ 0 }; j <= eq_num; ++j) k1[j] = dt*(ODE[j]()); 

for (int j{ 0 }; j <= eq_num; j++) midvalues[j] = oneloop[j] + k1[j]/2; 

私はループを実装する:すべての関数ODE [j]は、引数として、対応するポインタmidvalues [j]を取ること

for (int j{ 0 }; j <= eq_num; j++) ODE[j](midvalues[j]); 

は、このような。

私は私が機能するための2つのポインタ、引数を取らず、値を返します 1、すなわち必要な推測している:ODE[j]() と別の引数としてポインタ位置を取り、値を返します。

私は幸運でこれを行う方法を見つけるのに苦労している、どんな助けにも感謝します。事前に 感謝:) C++の

+0

私はあなたのクラスを好む、そしてクラス内のこれらの電圧、HDOTなど '方法' を作るかもしれないと思います。私は思う...あなたの質問を理解するのが苦労している – Grantly

+0

とにかく、関数へのポインタの型は1つしかなく、署名と一致する必要があります。あなたの場合、それらはすべて 'double'パラメータをとり、' double'を返します。したがって、 'double(*)(double)'です。 –

+0

'midvalue [j]'は配列ポインタです。 ODE [j](midvalues [j]); 'それぞれの' ODE [j] 'に、対応する' midvalues [j(= ja = 0); j <= eq_num; j ++) ODE [j]()を使って引数を渡さずにODE [j]を呼び出すこともできます。 –

答えて

0

バリアント:STDと

#include <iostream> 
    using namespace std; 

    double voltage(double v) { 
     return v; 
    } 
    double hdot(double h) { 
     return h * 2; 
    } 
    double ndot(double n) { 
     return n * 3; 
    } 

    typedef double(*eqpointer)(double); 

int main() { 
    eqpointer ODE[] = { voltage, hdot, ndot }; 
    int eq_num = sizeof(ODE)/sizeof(*ODE); // quantity elements in ODE[] 
    double *midvalues = new double[eq_num]; //change to variant (ty M_M) 

    for (int j = 0; j < eq_num; j++) { 
     midvalues[j] = (*ODE[j])((j + 1) * 10)/2; // Value For Example 
     printf("midvalues[%d]: %f\n", j, midvalues[j]); 
    } 
    return 0; 
} 

標準出力

*** midvalues[0]: 5.000000<br> 
*** midvalues[1]: 20.000000<br> 
*** midvalues[2]: 45.000000<br> 

IDEONE

バリアント::ベクトル(@MMにTY)

C上の

IDEONE

バリアント:

#include <stdio.h> 

double voltage(double v) { 
    return v; 
} 
double hdot(double h) { 
    return h * 2; 
} 
double ndot(double n) { 
    return n * 3; 
} 

typedef double(*eqpointer)(double); 

int main() { 
    eqpointer ODE[] = { voltage, hdot, ndot }; 
    int eq_num = sizeof(ODE)/sizeof(*ODE); 

    // declared only for this examle 
    double result; 
    double k1 [eq_num], oneloop[eq_num], midvalues[eq_num]; 
    // or best malloc(eq_num * sizeof(double)); from stdlib 

    for (int j = 0; j < eq_num; j++) { 

     k1[j] = (*ODE[j])((j + 1) * 10); // random arguments ODE for example only 
     oneloop[j] =20 * (*ODE[j])(j + 1); 
     midvalues[j] = (k1[j] + oneloop[j])/2; 
     result = (*ODE[j])(midvalues[j]); 

     printf("*** %d) k1[]: %f, oneloop[]: %f, midvalues[]: %f result: %f\n", 
      j, k1[j], oneloop[j], midvalues[j], result); 
    } 
    return 0; 
} 

#stdout 
*** 0) k1[]: 10.000000, oneloop[]: 20.000000, midvalues[]: 15.000000 result: 15.000000 
*** 1) k1[]: 40.000000, oneloop[]: 80.000000, midvalues[]: 60.000000 result: 120.000000 
*** 2) k1[]: 90.000000, oneloop[]: 180.000000, midvalues[]: 135.000000 result: 405.000000 

IDEONE

+0

'new double'の代わりに' vector'を使用してください –

+0

ありがとうございます!(しかし、この例ではvarables宣言のみです)@Erez Sabranの作成者に質問してください:あなたのプロジェクトはC++かCですか?問題の両方のタグ – Akubik

+0

OPはCで有効ではないコードを使用するので、私はそれがC++だと思います –