Intereting Posts
Почему 3 <-1 в коде? boost :: asio async_read гарантирует, что все байты прочитаны Отображение объектов, найденных в C ++ Как я могу построить или вернуть базовый deque из стека? Избегание зависимостей – это взрыв количества проектов в моем VS-решении Преобразование std :: list в дружественный тип C пересекает инициализацию ‘std :: istringstream iss’ при использовании внутри while while При использовании Visual Studios 2012 для кодирования на C ++, как вы производите автозаполнение кода в IntelliSense? Переключение между поплавком и двойной точностью во время компиляции Избегайте неоднозначности множественного наследования, используя разрешение области Boost asio io_service отправка по почте VS2015 cl Не удается найти библиотеки CRT (stido.h, ctype.h и т. Д.) При построении в командной строке как сменить gcc-компилятор на c ++ 11 на ubuntu Возврат объекта в C ++ как инициализировать boost :: mt19937 с несколькими значениями без использования C ++ 11

odeint сбрасывает объект во время итерации

Выполнение следующего кода:

#include  #include  using namespace std; using namespace boost::numeric::odeint; class CSystem { private: int counter=0; public: void operator() ( const double &x , double &dxdt , const double t) { double mat_A=-1; double mat_B=1; dxdt=mat_A*x+mat_B*1; cout<<"counter: "<<counter<<endl; counter++; // seems it does not apply to the rest of the iterations appropriately } void solve() { double x; x = 0.0; typedef runge_kutta_dopri5 stepper_type; std::function my_observer = [&](const double &x,const double t){/* do nothing*/}; integrate_adaptive(make_controlled(1E-10,1E-10,stepper_type()), *this,x,0.0,3.0,0.1,my_observer); } }; int main() { CSystem sys; sys.solve(); return 0; } 

Я ожидаю, что counter начнет отсчет с 0 до и cout генерирует следующий результат:

 0 1 2 3 4 5 6 7 8 9 10 11 ... 

Пока я получаю что-то еще:

 counter: 0 counter: 0 counter: 1 counter: 2 counter: 3 counter: 4 counter: 5 counter: 0 counter: 1 counter: 2 counter: 3 counter: 4 counter: 5 counter: 0 counter: 1 counter: 2 counter: 3 ... 

Что сбросит счетчик? кажется odeint!

Каков правильный способ его устранения? Я бы предпочел избежать использования внешнего объекта.

    Ваше использование *this делает копию вашего объекта CSystem, которая, возможно, будет скопирована дальше.

    Я думаю, вы должны изменить этот параметр на std::ref(*this) .