![]() | ![]() | ||||||||||||
[help-gsl] Re: custom error handling (2008-08-23)
>2008/8/21 Max <LoadCom@........>: >> My simple program runs ok under debug mode, but not ok under release >> mode. > >More info needed. Show us the full program and the full output and all >error messages. > >- Jordi G. H. Hello Jordi, Thanks for you your quick reply. A small program that could reproduce the problem is: #include <gsl/gsl_roots.h> #include <gsl/gsl_sf.h> #include <gsl/gsl_errno.h> // linking to the library #ifdef _DEBUG # pragma comment(lib, "gsl_d.lib") #else # pragma comment(lib, "gsl.lib") #endif //_______________GSL error handler_______________ void my_gsl_error_handler (const char * reason, const char * file, int line, int gsl_errno) { throw gsl_errno; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ struct gz_func_param { }; double gz_func (double x, void * params) { return 3 * x; } double Test() { gsl_function F; gz_func_param params; F.function = &gz_func; F.params = ¶ms; //_____save original handler, install new handler_____ gsl_error_handler_t *old_handler = gsl_set_error_handler (&my_gsl_error_handler); const gsl_root_fsolver_type * T = gsl_root_fsolver_bisection; gsl_root_fsolver * s = gsl_root_fsolver_alloc (T); int status; int iter = 0; // loop counter int max_iter = 100; // max loops of iteration double x_lo = 100, x_hi = 200; // choose to set a WRONG range double r; // the root to find try { const double tolerance = 0.001; // degree gsl_root_fsolver_set(s, &F, x_lo, x_hi); do { iter++; status = gsl_root_fsolver_iterate (s); r = gsl_root_fsolver_root (s); x_lo = gsl_root_fsolver_x_lower (s); x_hi = gsl_root_fsolver_x_upper (s); // control convergence with delta trim criterion status = gsl_root_test_delta (x_lo, x_hi, tolerance, 0); if (x_hi - x_lo < tolerance) status = GSL_SUCCESS; } while (status == GSL_CONTINUE && iter < max_iter); } catch(int& gsl_errno) { std::cout << "GSL error!\n"; } catch(...) { ASSERT(false); } gsl_root_fsolver_free(s); //______restore the original handler______ gsl_set_error_handler (old_handler); return r; } int main() { Test(); return 0; } The error I get under Release mode is Runtime error. Thanks for your help again. B/Rgds Max
| |||||||||||||
![]() | ![]() |







