【问题标题】:Else if conditional executes although conditions are not true [closed]否则,如果条件不成立,则条件执行[关闭]
【发布时间】:2018-04-30 03:27:25
【问题描述】:

我正在尝试使用this circuit 跟踪 PLECS(电力电子仿真软件)中的参考。 C-Script 是我下面的代码,它基本上告诉 IGBT 设备打开 (0) 和关闭 (1)。但是,当很明显电容器 (VCS) 两端的电压甚至不接近零伏时,我无法理解为什么我得到“0”作为输出,如shows this figure。

int track(double ref, double isb, double vcs) {
    int out;

    if(ref > isb){
        out = 1;
    }
    else if(ref < isb && vcs == 0.0){
            out = 0;
        }

    return out;
}

在 C 脚本块中,信号值只能通过宏访问,不能通过指针算法访问。例如,我声明 Inputs 和 Output 如下:

#define REF Input(0) // Reference Current
#define ISB Input(1) // Snubber Output Current
#define VCS Input(2) // Capacitor Voltage
#define IGBT Output(0) // IGBT Firing

【问题讨论】:

  • 首先,如果ref == isb 或ref &lt; isb &amp;&amp; vcs != 0,这将返回一个不确定的值(未初始化的out),这甚至可能是一个陷阱表示-> 未定义的行为。其次,您忘记准确描述您的输入、预期输出和实际输出是什么,请参阅minimal reproducible example。
  • 如果你已经像这样从out 制作了 UB,那么在这个省略的、无上下文的示例中我们看不到的还有什么你做错了?因此:请 MCVE。另一件事:您的问题可以被解读为 (A) 执行了错误的分支,那么为什么我的测试没有达到我的预期?或者 (B) 两个分支都执行,那么我到底如何给编译器足够的余地来做到这一点?
  • idownvotedbecau.se/beingunresponsive -- 哦,投票结果也很接近。没有minimal reproducible example,这个问题没有任何意义,应该消失。

标签: c


【解决方案1】:

您的figure 显示ref &lt; isb 和vcs 不为零的位置。您的if 和else if 都不包含此条件,因此程序执行不会通过它们的任何一个子句。因此,对于这些情况,代码实际上是:

int out;

return out;

因此,它返回一个未初始化的值。这可能恰好具有返回零的效果,但行为不可靠。

要解决此问题,请将out 初始化为您希望在这些情况下返回的值,或添加设置它的else 子句。

【讨论】:

  • 老实说,虽然这是代码的一个非常明显的问题——如果没有适当的 MCVE,你的答案看起来也像是在猜测:o(我强烈反对在以下模式下使用 SO有人发布了一个不清楚的问题,很多人都在猜测,而最终的清晰度来自于 OP 选择答案.. 甚至可能永远不会)
  • 这里也是,无意冒犯。真的很感谢用一些图表分析 PNG。但是,我仍然不能确定这个答案是否正确,我我确定我们仍然应该要求minimal reproducible examples .. 因为这样很容易了解正在发生的事情并且(可能)不止一个人将从答案中受益。
  • IBTD。很明显,这是代码问题,但如果没有 MCVE,我们无法确定 OP 所询问的情况。当然,现在,选择了您的答案,我们确定。但这不是 SO 应该如何工作的。好吧,没关系......这可能是一个太多的meta讨论:)
  • "只有一个解释" 0 的表示。恕我直言,这已经是很多的猜测了。大多数实现使用堆栈的方式是0 与未初始化变量的任何其他值一样不可能。
  • @FelixPalmen:顺便说一下,我的解释不需要未初始化的对象保持零。根据 C 标准,行为是完全未定义的。它不需要遵循存在具有某种确定但未知值的对象的模型。 C 标准允许发生任何 行为。零可能在一个未初始化的变量中,或者编译器可能只是通过将整个例程更改为return ref &gt; isb ? 1 : 0;(等效于return ref &gt; isb)来优化代码。
猜你喜欢
  • 1970-01-01
  • 2012-05-23
  • 2012-01-24
  • 2021-01-28
  • 1970-01-01
  • 2018-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多