Tôi đang nghiên cứu mở rộng/sửa đổi ví dụ về lực đẩy + odeint [ mã số , tài liệu ] Thay đổi các thông số một cách có hệ thống và quan sát các hiệu ứng.
Tôi đang gặp phải một lỗi lạ, khi tôi cố gắng sửa đổi một số biến nhất định có thể sửa đổi được (và được sửa đổi trong ví dụ), tôi gặp lỗi sau.
main.cu: error: biểu thức phải là giá trị có thể sửa đổi
Dưới đây là mã nguồn của cấu trúc quan sát mà tôi đang cố chạy, với các nhận xét hiển thị các dòng gây ra lỗi.
Tôi hiểu lỗi này có nghĩa là biểu thức ở bên trái của toán tử gán =
Không phải là một giá trị có thể sửa đổi. Nhưng đối với tôi nó trông giống hệt biến có cùng tên trong mã nguồn ví dụ ở trên (và hoạt động tốt).
//// Quan sát hệ thống để phát hiện xem nó có bị chết trong quá trình dùng thử hay không
cấu trúc death_observer {
// NGƯỜI XÂY DỰNG
death_observer( size_t N, size_t historyBufferLen = 1)
: m_N( N ), m_count( 0 ) { }
mẫu< lớp Trạng thái, lớp Deriv >
void operator()(Trạng thái &x , Deriv &dxdt , value_type t ) const
{
++m_count; // <-- Dòng này gây ra lỗi.
}
// biến
kích thước_t m_N;
size_t m_count;
};
...đây là mã trong main() chạy bộ tích hợp và bộ quan sát này, trong trường hợp nó có ích.
song song_initial_condition_problem init_con_solver( N_ICS );
death_observer quan sát( N_ICS );
////////////////////////////////// // // tích hợp
typedef runge_kutta_dopri5< state_type , value_type , state_type , value_type, lực đẩy_algebra, lực đẩy_ hoạt động > stepper_type;
const value_type abs_err = 1.0e-6;
const value_type rel_err = 1.0e-6;
đôi t = t_0;
trong khi( t < t_final ) {
tích hợp_adaptive( make_control( abs_err, rel_err, stepper_type() ) ,
init_con_solver,
std::make_pair( x.begin() , x.begin() + N_VARS*N_ICS ),
t, t+1.0, init_dt);
t += 1,0;
obs( x, *(&x+N_VARS*N_ICS), t); // không chắc chắn về trọng số ở đây, nhưng tôi không nghĩ đó là nguyên nhân gây ra lỗi.
}
Tôi đã cố gắng giảm mã của mình xuống trường hợp đơn giản nhất. Chú thích từ dòng thứ ba đến dòng cuối cùng ở trên sẽ làm cho chương trình chạy bình thường.
Tôi đã làm gì sai? Sự khác biệt giữa m_count của tôi và m_count trong mã ví dụ được liên kết ở trên là gì? Cảm ơn bạn rất nhiều!
Chuyển đổi nhận xét thành câu trả lời:
mẫu< lớp Trạng thái, lớp Deriv >
void operator()(Trạng thái &x , Deriv &dxdt , value_type t ) const
{
++m_count; // <-- Dòng này gây ra lỗi.
}
bạn sẽ toán tử()
khai báo là hằng số
hàm thành viên, do đó nó không thể sửa đổi thành viên dữ liệu của lớp trừ khi thành viên đó được khai báo là có thể thay đổi
.
Lưu ý bên lề:*(&x+N_VARS*N_ICS)
gần như chắc chắn là không chính xác bởi vì x
trông giống như Các thùng chứa trong .begin()<
gọi.
Tôi là một lập trình viên xuất sắc, rất giỏi!