user1968603
user1968603

Reputation: 17

Trouble with including functions in c++

I am new to c++ and I can't figure out why my headers are not working correctly. If I include the function fitzhough() from the main file, everything works perfectly. However, if I try to add it as a separate file, it gives the error:

obj\Debug\main.o||In function `main':|
C:\Users\Dan\Documents\C code\RK4\main.cpp|83|undefined reference to `fitzhough(double, Eigen::Matrix<double, 2, 1, 0, 2, 1>, double, double*)'|
||=== Build finished: 1 errors, 0 warnings (0 minutes, 0 seconds) ===|

My code is below. Any help would be greatly appreciated.

main.cpp

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

using namespace std;

using namespace Eigen;

Vector2d RK4(Vector2d (*f)(double, Vector2d, double, double*), double t, Vector2d 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;
}

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);
  }
}

addfitzhough.h (in separate file)

#ifndef FF
#define FF

using namespace Eigen;

Vector2d fitzhough(double t, Vector2d Y, double u, double * Iion);

#endif // FITZ

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;
}

Upvotes: 0

Views: 329

Answers (2)

thang
thang

Reputation: 3466

It looks like you are not linking to fitzhough.o (the output of fitzhough.cpp). Did you insert fitzhough.cpp into the project?

By the way, if you're implementing FitzHugh-Nagumo, his name is spelled FitzHugh :p

Upvotes: 1

Karthik T
Karthik T

Reputation: 31952

It looks like your build system is either not building fitzhough.cpp or is not adding fitzhough.o in the link stage.

You should add fitzhough.cpp to the code blocks project (or equivalent) if you havent.

Upvotes: 0

Related Questions