将一个函数传递给另一个函数并使用头文件时出错

Error when passing a function to a function and using a header file

本文关键字:函数 出错 文件 另一个 一个      更新时间:2023-10-16

当我尝试使用头文件添加函数RK4时,当我尝试运行以下代码时,我得到以下错误消息。

C:DocumentsC codeRK4addRK4.h|7|error: expected ')' before '(' token ' |

之后还有一堆其他错误信息,但我认为它们不重要。我不知道哪里出了问题,特别是当我在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;
}

符号冲突

#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

Vector2dVectorXd类型似乎有问题

编辑:抓得好@Paddy。把答案的其余部分留在这里,因为它仍然有效。

此外,您的声明addRK4.h 不匹配RK4.cpp中的定义。这将是下一个要修复的错误