Witam. W programie który piszę korzystam z biblioteki numerycznej cminpack, służącej m.in. do obliczania pierwiastków równań nieliniowych. Problem polega na tym, że nie wiem jak podać do funkcji zmienną zewnętrzną (z main'a), w dokumentacji jest jedynie napisane że można to zrobić poprzez podanie wskaźnika do struktury, jednak nie ma żadnego przykładu. Niestety moje próby nie przyniosły rezultatu. Oto program który mi działa:
#include <iostream>
#include <cmath>
#include <cminpack.h>
int fcn(void *p, int n, const double *x, double *fvec, int iflag);
int main()
{
int n = 1, lwa = 8; //n - liczba równań
double tol = sqrt(dpmpar(1)); //tol - dokladnosc obliczen
double x[1], fvec[1], wa[8]; //wa - tablica operacyjna o dlugosci lwa
x[0] = - 2; //wartosc poczatkowa x[0]
hybrd1(fcn, 0, n, x, fvec, tol, wa, lwa);
std::cout << x[0] << std::endl;
system("pause");
return 0;
}
int fcn(void *p, int n, const double *x, double *fvec, int iflag) {
double a = 3, b = 5, c = 13, d = 7;
fvec[0] = a*pow(x[0],3) + b*pow(x[0],2) + c*x[0] + d;
return 0;
}
Przypuśćmy że chciałbym wywołać funkcję zawierającą zmienną zewnętrzną, jednak nie globalną, np:
int fcn(void *p, int n, const double *x, double *fvec, int iflag) {
double a = 3, b = 5, c = 13, d = 7;
fvec[0] = a*pow(x[0],3) + b*pow(x[0],2) + c*x[0] + d + e;
return 0;
}
Z dokumentacji: "The argument 'p' can be used to store extra function parameters, thus avoiding the use of global variables. You can also think of it as a 'this' pointer a la C++."; "...void* argument can be used to pass any pointer-to-struct, and you can put all you extra parameters and data in that struct. Just cast this pointer to the appropriate pointer type in your function"
Z góry dzięki za pomoc.