我的代码中有以下if-else语句,用于在GUI上向用户显示值:
if (data.steering.fpTTGValid)
{
pFlightPlanTTGReadout->setValid();
pFlightPlanTTGReadout->update((int)data.steering.flightPlanTTG);
}
else
{
pFlightPlanTTGReadout->setInvalid();
}
在调试中运行程序并附加到Visual Studio中的进程时,如果我将光标悬停在' if'中的data.steering.fpTTGValid
变量上。声明,我可以看出它的价值是真的。我的理解是,这应该意味着后续{}
中的代码执行,但else
语句不应该执行。
但是,当我继续浏览我的代码时,我发现data.steering.flightPlanTTG
变量值保持为0-表明它所传递的update()
函数尚未执行。此变量也保持在0,显示在GUI中,这表示已调用else
语句的if
子句。
由于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()
}
答案 0 :(得分:3)
你确定它没有更新吗? if / else的两个子句都被执行的几率非常小,这将是一个相当严重的编译器错误,我很确定某人现在已经注意到了它。您的更新函数更可能不正确,或者当转换为int时data.steering.flightPlanTTG最终为零。
答案 1 :(得分:2)
为什么即使
data.steering.flightPlanTTG
的值为真,update()
函数正在更新data.steering.fpTTGValid
变量的值?
如果update()
函数确实应该更新其参数,则代码不正确。当您投射data.steering.flightPlanTTG
时,您正在创建一个临时变量,并且该临时变量的任何更新都不会反映在原始data.steering.flightPlanTTG
中。
事实上,如果update()
应该更新其参数,那么它可能会通过引用获取参数:
void update(int ¶m)
C ++不允许您将临时文件传递给这样的函数。你应该得到一个错误。这样做的原因是为了防止你写的错误。
不幸的是,Visual Studio恰好有一个扩展,允许临时传递给这样的函数。但是它会发出警告,您可以启用它。您应该将编译器的警告级别调高至3或4并修复所有结果警告。
您可以修复错误的最直接的更改是:
int updated_flightplan;
pFlightPlanTTGReadout->update(updated_flightplan);
data.steering.flightPlanTTG = updated_flightplan;
现在您已发布update()
的代码,问题似乎是update()
无法按预期工作。它不会通过引用获取参数或执行任何更新参数的操作。相反,该函数似乎以channel
的某些副作用的形式产生输出,无论是什么。
这里的结果是if-else语句正常工作,问题在于你对如何使用update()
的理解:代码
pFlightPlanTTGReadout->update(data.steering.flightPlanTTG);
不应该修改data.steering.flightPlanTTG
,并且你的期望是不正确的。
答案 2 :(得分:1)
我认为对(int)
进行类型转换将导致flightPlanTTG
成为RValue(http://en.wikipedia.org/wiki/Value_(computer_science)#lrvalue) - 严格来说,这是一个非L值 - 这意味着它不是可以修改其值的表达式。您还必须确保update
函数的编写方式使传递给它的参数通过引用传递。否则它只会修改值的本地副本,而不会影响原始值。由于您没有使用返回值,因此最简单且最易读的修复方法是使update
函数返回一个值,而不是期望它直接修改其参数。然后将结果分配回flightPlanTTG
值。
答案 3 :(得分:0)
如果data.steering.fpTTGValid
为真/非零,则只执行第一个块。你检查过data.steering.flightPlanTTG
的价值了吗?如果该值为零,那么您只需使用update
参数调用0
即可。您的条件块看起来很好。我宁愿单步进入setValid
和update
函数。查看是否使用非零参数调用update
。确保update
正在按预期执行。
答案 4 :(得分:0)
然而,当我继续浏览我的代码时,我看到了 data.steering.flightPlanTTG变量值保持在0-表明这一点 传递它的update()函数尚未执行。 该变量也保持在0,在GUI中显示该变量 会建议if语句的else子句是 调用。
这是一个完全错误的分析,因为代码显然是错误的。
如果您希望更新data.steering.flightPlanTTG,则需要使用指针或使用引用传递。 update()函数显然不使用任何一种机制。