2013-01-11 13 views
0

當我嘗試使用頭文件添加函數RK4時,我嘗試運行以下代碼時出現以下錯誤消息。將函數傳遞給函數並使用頭文件時出錯

C:\文件\ C代碼\ 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; 

} 

回答

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 
+0

謝謝,太好了!我從來沒有想過這件事。 – user1968603

+0

沒問題。它困擾了我一段時間,但是當您將原型放入主源文件而不是使用標題時,您提供了一個關於它的工作正常的關鍵提示。快樂編碼=) – paddy

1

這似乎是有點問題 types Vector2dVectorXd

編輯:good catch @Paddy。由於它仍然有效,所以將其餘的答案留在這裏。

此外,您聲明addRK4.h犯規在RK4.cpp定義匹配。這將是您將要解決的下一個錯誤