C++ c++;两者';如果';和';其他';语句似乎被调用
我的代码中有以下if-else语句,用于在GUI上向用户显示值:C++ c++;两者';如果';和';其他';语句似乎被调用,c++,if-statement,C++,If Statement,我的代码中有以下if-else语句,用于在GUI上向用户显示值: if (data.steering.fpTTGValid) { pFlightPlanTTGReadout->setValid(); pFlightPlanTTGReadout->update((int)data.steering.flightPlanTTG); } else { pFlightPlanTTGReadout->setInvalid();
if (data.steering.fpTTGValid)
{
pFlightPlanTTGReadout->setValid();
pFlightPlanTTGReadout->update((int)data.steering.flightPlanTTG);
}
else
{
pFlightPlanTTGReadout->setInvalid();
}
在调试中运行程序并在Visual Studio中附加到进程时,如果我将光标悬停在'if'语句中的data.steering.fpTTGValid
变量上,我可以看到它的值为true。我的理解是,这应该意味着执行后续{}
语句中的代码,但不应执行else
语句
但是,当我继续逐步查看代码时,我看到data.steering.flightPlanTTG
变量值保持在0-这表明传递它的update()
函数没有执行。该变量也保持在0,它显示在GUI中,这表明调用了if
语句的else
子句
由于fpTTGValid
变量最初是真的,我猜if
和else
子句都被调用了,因此我从来没有在GUI上看到显示的值,因为显示它的变量被“setInvalid()”函数设置为0
有人能指出我做错了什么吗?为什么data.steering.flightPlanTTG
变量的值没有被update()
函数更新,即使data.steering.fpTTGValid
的值为真
update()
函数定义为:
void ElapsedTimeReadout::update(const int total_seconds_)
{
SESL_FUNCTION_BEGIN(update)
int seconds, minutes, hours;
int update_delta = total_seconds_;
seconds = update_delta % 60;
update_delta = (update_delta - seconds) / 60;
minutes = update_delta % 60;
update_delta = (update_delta - minutes) / 60;
hours = update_delta % 24;
channel.Hours = hours;
channel.Minutes = minutes;
channel.Seconds = seconds;
SESL_FUNCTION_END()
}
你确定它没有被更新吗?if/else的两个子句都被执行的可能性非常小,这将是一个非常严重的编译器错误,我敢肯定现在有人已经注意到了。更可能的情况是更新函数不正确,或者data.steering.flightPlanTTG在转换为int时最终为零。您确定它没有被更新吗?if/else的两个子句都被执行的可能性非常小,这将是一个非常严重的编译器错误,我敢肯定现在有人已经注意到了。更可能的情况是更新函数不正确,或者data.steering.flightPlanTTG在转换为int时最终为零。如果data.steering.fpTTGValid为真/非零,则仅执行第一个块。您是否检查了data.steering.flightPlanTTG的值?如果该值为零,则只需调用参数为
0
的update
。你的条件块看起来不错。相反,我将进入setValid
和update
函数本身。查看是否使用非零参数调用update
。确保update
按照您的预期进行 如果data.steering.fpTTGValid
为真/非零,则仅执行第一个块。您是否检查了data.steering.flightPlanTTG的值?如果该值为零,则只需调用参数为0
的update
。你的条件块看起来不错。相反,我将进入setValid
和update
函数本身。查看是否使用非零参数调用update
。确保update
按照您的预期进行 我相信将值键入(int)
将导致flightPlanTTG
成为一个右值()——严格地说,是一个非L值——这意味着它不是一个可以修改其值的表达式。您还必须确保update
函数的编写方式确保传递给它的参数是通过引用传递的。否则,它将只是修改该值的本地副本,而不影响原始值。由于您没有使用返回值,最简单和最可读的修复方法是使update
函数返回一个值,而不是期望它直接修改其参数。然后将结果分配回flightPlanTTG
值。我相信将值键入(int)
将导致flightPlanTTG
变成右值()——严格地说,是非L值——这意味着它不是一个可以修改其值的表达式。您还必须确保update
函数的编写方式确保传递给它的参数是通过引用传递的。否则,它将只是修改该值的本地副本,而不影响原始值。由于您没有使用返回值,最简单和最可读的修复方法是使update
函数返回一个值,而不是期望它直接修改其参数。然后将结果分配回flightPlanTTG
值
为什么data.steering.flightPlanTTG
变量的值没有被update()
函数更新,即使data.steering.fpTTGValid
的值为真
如果update()
函数确实应该更新其参数,则您的代码不正确。当您转换data.steering.flightPlanTTG
时,您正在创建一个临时变量,对该临时变量的任何更新都不会反映在原始data.steering.flightPlanTTG
中
事实上,如果update()
应该更新它的参数,那么它可能通过引用获取参数:
void update(int ¶m)
C++不允许向这样的函数传递临时值。你应该得到一个错误。这样做的原因是为了防止您编写的错误
不幸的是,VisualStudio恰好有一个扩展,允许将临时值传递给这样的函数。但是,它确实有一个您可以启用的警告。您应该将编译器的警告级别提高到3级
int updated_flightplan;
pFlightPlanTTGReadout->update(updated_flightplan);
data.steering.flightPlanTTG = updated_flightplan;
pFlightPlanTTGReadout->update(data.steering.flightPlanTTG);