c ++两者如果'和'其他'语句似乎被调用

时间:2015-01-05 16:32:33

标签: c++ if-statement

我的代码中有以下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变量最初是真的,我的猜测是ifelse子句都被调用 - 所以我从来没有真正看到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()
}

5 个答案:

答案 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 &param)

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即可。您的条件块看起来很好。我宁愿单步进入setValidupdate函数。查看是否使用非零参数调用update。确保update正在按预期执行。

答案 4 :(得分:0)

  

然而,当我继续浏览我的代码时,我看到了   data.steering.flightPlanTTG变量值保持在0-表明这一点   传递它的update()函数尚未执行。   该变量也保持在0,在GUI中显示该变量   会建议if语句的else子句是   调用。

这是一个完全错误的分析,因为代码显然是错误的。

如果您希望更新data.steering.flightPlanTTG,则需要使用指针或使用引用传递。 update()函数显然不使用任何一种机制。