0

ヘッダー ファイルを使用して関数 RK4 を追加しようとして、次のコードを実行しようとすると、次のエラー メッセージが表示されます。

C:\Documents\C code\RK4\addRK4.h|7|エラー: '(' トークンの前に ')' が必要です|

その後、他にもたくさんのエラー メッセージが表示されますが、それらは重要ではないと思います。特に main.cpp で RK4 のプロトタイプを定義すると、すべて問題なく動作するため、何が問題なのかわかりません。関連するコードは以下です。この問題に関するヘルプ (または、私が c++ にかなり慣れていないため、他の提案があれば) をいただければ幸いです。

main.cpp

#include <iostream>
#include <fstream>
#include <Eigen/Dense>
#include "gnuplot.h"
#include "addfitzhough.h"
#include "addRK4.h"

using namespace std;
using namespace Eigen;

int main()
{

//int mydims = 2;

double u = 0;
double *Iion;
double h = .5;

double y1ans[800];
double y2ans[800];
double tans[800];


Vector2d ycurr;

Vector2d Ynot, yplus;

Ynot << .2,
        .1;

y1ans[0] = Ynot(0);
y2ans[0] = Ynot(1);
tans[0] = 0.0;

for(int i = 1;i<800;i++){
tans[i] = tans[i-1] + h;
ycurr << y1ans[i-1],
         y2ans[i-1];
yplus = RK4(fitzhough,tans[i],ycurr,h,u,Iion,2);
y1ans[i] = yplus(0);
y2ans[i] = yplus(1);
}

}

addRK4.h

#ifndef RK4
#define RK4

using namespace Eigen;

VectorXd RK4(VectorXd (*f) (double t, Vector2d Y, double u, double * Iion), double t, VectorXd z, double h, double u, double *Iion, int d);


#endif // RK4

RK4.cpp

#include <Eigen/Dense>

using namespace std;
using namespace Eigen;

Vector2d RK4(Vector2d (*f)(double, Vector2d, double, double*), double t, VectorXd z, double h, double u, double *Iion, int d){

VectorXd Y1(d), Y2(d), Y3(d), Y4(d), Y1buf(d), Y2buf(d), Y3buf(d);

Y1 = z;
Y1buf = (*f)(t,Y1,u, Iion);
Y2 = z + 0.5*h*Y1buf;
Y2buf = (*f)(t+.5*h,Y2,u, Iion);
Y3 = z + 0.5*h*Y2buf;
Y3buf = (*f)(t+.5*h,Y3,u, Iion);
Y4 = z + h*Y3buf;


Vector2d yn = z + (h/6.0)*(Y1buf + 2.0*Y2buf + 2.0*Y3buf + (*f)(t+h,Y4,u, Iion));

return yn;
}

fitzhough.cpp

#include <Eigen/Dense>

using namespace std;
using namespace Eigen;
Vector2d fitzhough(double t, Vector2d Y, double u, double * Iion){

Vector2d dy;

double v = Y(0);
double w = Y(1);

double a = .13;
double b = .013;
double c1 = .26;
double c2 = .1;
double d = 1.0;

dy(0) = c1*v*(v-a)*(1-v)-c2*w*v + u;
dy(1) = b*(v-d*w);

*Iion = dy(0)-u;

return dy;

}
4

2 に答える 2

2

シンボルの衝突があります。

#defineシンボルをRK4指定してから、その名前で関数を作成しようとします。空のマクロとして定義したため、何も置き換えられません。次に、コンパイラはこれを関数宣言として認識します。

VectorXd (VectorXd (*f) (double t, Vector2d Y, double u, double * Iion), double t, VectorXd z, double h, double u, double *Iion, int d);

ヘッダー ケージに文字を追加することをお勧めします。何かのようなもの:

#ifndef RK4__H
#define RK4__H
于 2013-01-11T03:07:57.610 に答える
1

Vector2dとに何か問題があるようですVectorXd

編集:良いキャッチ@Paddy。残りの回答はまだ有効であるため、ここに残します。

また、 の宣言addRK4.h の定義と一致しませんRK4.cpp。これは、修正する次のエラーになります。

于 2013-01-11T03:07:14.240 に答える