为什么我的 If-Else 语句无法正常工作?



我有一个项目,我必须根据我想要的磁场发生器的旋转场改变一些参数。我不是一个开发人员和c++不是我的经验程序,但我需要找到一种方法来改变两种不同的配置之间使用切换功能。我尝试使用If-Else语句,但它不起作用。手动更改参数确实有效,所以我相信if-else可能没有加载或其他东西。如有任何意见,不胜感激。

void ParticleControlPanel::processTimer()
{    
//original field orientation (B-field aligned with z-axis)
tf::Vector3 field_orientation(0.,0.,1.);
//original rotiation axis; (rotation axis aligned with x-axis)
tf::Vector3 rot_axis(1.,0.,0.);
rot_axis.setX(cos(azimuth_/180.*pi));
rot_axis.setY(sin(azimuth_/180.*pi));
rot_axis.setZ(0); 
//toggle drill and cube
if (toggle_)
{
tf::Vector3 field_orientation(1.,0.,0.);
tf::Vector3 rot_axis(0.,0.,1.);
rot_axis.setX(0);
rot_axis.setY(sin(azimuth_/180.*pi));
rot_axis.setZ(cos(azimuth_/180.*pi));         
}
else
{
tf::Vector3 field_orientation(0.,0.,1.);
tf::Vector3 rot_axis(1.,0.,0.);
rot_axis.setX(cos(azimuth_/180.*pi));
rot_axis.setY(sin(azimuth_/180.*pi));
rot_axis.setZ(0);  
}
我在代码的开头定义了toggle_函数。
namespace mag_control {
ParticleControlPanel::ParticleControlPanel(QWidget *parent) :
rviz::Panel(parent),
magfield_topic_("/desired_field"),
magfield_grad_topic_("/desired_field_grad"),
holding_lock_(false),
activated_(false),
controlling_(false),
wobble_(false),
toggle_(false),
frequency_(0.00),
azimuth_(0.0),
rot_angle_(0.0),
t_prev_(0.0),
pi(std::acos(-1)),
gradient_(0.,0.,0.),
position_(0.,0.,0.),
z_control_(false),
gradient_z_(0.0),
thresh_bin_(0),
thresh_hough_(0),
config_("demo.yaml")
{

编辑:我听说变量field_orientation和rot_axis在if-else内部和下面是不一样的。我怎样才能改变这一点?同样,这是我没有太多经验的事情,但由于工作环境,我需要解决。

void ParticleControlPanel::processCheckboxToggle(int value)
{
if(value){
toggle_ = true;
}
else {
toggle_ = false;
}
}

ifelse块内声明的变量field_orientationrot_axis与在if语句之前声明的变量field_orientationrot_axis完全无关。由于它们共享名称,较小作用域中的变量遮蔽了外部作用域中的名称,并且您只能访问较小作用域中的变量。此外,由于这些是具有自动生存期的变量,当它们的作用域结束时(在本例中-当到达}关闭if块时),它们将被销毁。

查看代码的简化示例:

#include <iostream>
int main(void)
{
int myVar = 5;
std::cout << "myVar before if: " << myVar << 'n';
if (true) 
{
int myVar = 13; // a new myVar, completely different than the first myVar
std::cout << "myVar inside if: " << myVar << 'n';
}  // myVar from inside if is gone here
std::cout << "myVar after if: " << myVar << 'n';
}

输出如下(在线查看)

myVar before if: 5
myVar inside if: 13
myVar after if: 5

如果你想改变原来的field_orientationrot_axis的值,不要在if范围内声明新的变量,直接引用这些变量:

void ParticleControlPanel::processTimer()
{    
//original field orientation (B-field aligned with z-axis)
tf::Vector3 field_orientation(0.,0.,1.);
//original rotiation axis; (rotation axis aligned with x-axis)
tf::Vector3 rot_axis(1.,0.,0.);
rot_axis.setX(cos(azimuth_/180.*pi));
rot_axis.setY(sin(azimuth_/180.*pi));
rot_axis.setZ(0); 
//toggle drill and cube
if (toggle_)
{
field_orientation.setX(1.); // I guess, I don't know the library you are using
field_orientation.setY(0.);
field_orientation.setZ(0.);
rot_axis.setX(0);
rot_axis.setY(sin(azimuth_/180.*pi));
rot_axis.setZ(cos(azimuth_/180.*pi));         
}
else
{
field_orientation.setX(0.);
field_orientation.setY(0.);
field_orientation.setZ(1.);
rot_axis.setX(cos(azimuth_/180.*pi));
rot_axis.setY(sin(azimuth_/180.*pi));
rot_axis.setZ(0);  
}

最新更新