Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;两者';如果';和';其他';语句似乎被调用_C++_If Statement - Fatal编程技术网

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

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-else语句,用于在GUI上向用户显示值:

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 &param)
C++不允许向这样的函数传递临时值。你应该得到一个错误。这样做的原因是为了防止您编写的错误

不幸的是,VisualStudio恰好有一个扩展,允许将临时值传递给这样的函数。但是,它确实有一个您可以启用的警告。您应该将编译器的警告级别提高到3级
int updated_flightplan;
pFlightPlanTTGReadout->update(updated_flightplan);
data.steering.flightPlanTTG = updated_flightplan;
pFlightPlanTTGReadout->update(data.steering.flightPlanTTG);