2014-12-20 174 views
4

在几个星期内,我将加入一个项目(当前)使用LabView进行开发。为了让自己在这之前至少有点熟悉,我一直在试用版本的软件中创建一些简单的项目。有人质疑我编写了一个简单的程序,可以在不使用除法运算符的情况下进行简单的分割。为什么我的LabView while循环似乎执行多次?

我已经成功编写了程序,但我的主要while循环似乎运行了太多次。下面是我的程序:

program image

用户输入一个被除数和除数,程序会不断分红减去除数直到红利变为< = 0,此时它应该休息。程序运行成功,但是当循环终止时,分配总是等于x低于0(其中x是除数的任何数字)。在调试应用程序时,我发现这个问题,当最后一次循环比较发生时,除数将等于0并计算为'false'但是循环内的代码在循环中断之前最后一次执行。这是我期望的一个do-while循环,但不是一个简单的时间。

只是为了向我自己证明,这不是我所期望的(希望是)我写的(我认为是)明显的逻辑错误an equivalent program in python

我花了很长时间搜索,盯着它,我甚至在纸上做过,但我不明白为什么它不会做我期望的。是什么赋予了?

+0

不是答案,而是关于LabVIEW中变量的评论。如您所注意到的,LabVIEW要求您的思维方式与其他编程语言不同。声音程序逻辑“按原样”从其他语言转移,可以让你成为如何在LabVIEW中不编程的可怕例子。变量和序列结构是被初学者滥用的两个​​主要构造。只要避免在不需要的地方使用它们,你就会开始思考LabVIEW的方式。 – skof

回答

3

LabVIEW根据dataflow principle执行它的代码这意味着循环不能停止,直到它完成执行其中的所有代码。这是确认上述内容的NI document(请参阅第一个流程图)。而且,减法和比较同时发生。

你的代码是大体上相当于(除了0是比较发生在该线临时值):

dividend = YYY 
divisor = XXX 

dividend = dividend - divisor 
while dividend > 0: 
    dividend = dividend - divisor 

如果你将真正进入LabVIEW中,我强烈建议您不要使用局部变量。很多次(包括这一次)他们都很糟糕。像这样做,而不是:

enter image description here

这是一个snipplet,所以如果你从资源管理器拖放文件拖放到你的BD它会出现一段代码(LV2014)。

+0

谢谢!这很有道理。你能解释一下为什么使用变量是一个坏主意?我知道这是为了防止竞争条件(这本身就是一个很好的理由),但是还有其他原因吗?与我习惯的编程相比,LabVIEW似乎有一种非常不同的思考方式。 – Seth

+1

变量可能很糟糕。比赛条件#1 #2是通过使用本地变量更新前面板控件。尽管如此,这并不一定是同步的,但仍然如此。 执行期间#3额外的数据副本。 (打开工具 - >配置文件 - >显示缓冲区分配),查看可以显示额外数据副本的位置。 因此,除非您以这种方式访问​​您的FP元素,否则请勿使用本地人。即使访问您的FP元素,请查看以下参考: http://digital.ni.com/public.nsf/allkb/74ECB57D3C6DF2CE86256BE30074EC47,可能有更好的方法 – mzu

+0

哦,最后一个问题,我目前还没有安装LabVIEW 2014 (2013年),所以我不能复制你的形象。循环边缘的向上/向下箭头是什么,连接几个控件?他们是否在转移注册表 – Seth

1

我相信条件和减法的评估是平行发生的,而不是彼此之后,这就是为什么你总是得到比你需要的更多的减法。

编辑

,因为它是在dataflow tutorial (Figure 2)只要所有的输入都可以可以预期要执行告诉任何操作。您无法知道也不应该依赖于准备好执行的操作的执行顺序。

+0

这是基于我的输出的一个合乎逻辑的结论,但是您能否在文档的某个地方找到这样的官方声明?我很难理解为什么他们会像这样实现它,它不像我以前使用过的任何while循环。 – Seth

+0

好的,这使得更多的意义,我不明白为什么会这样写,看到它不完全符合正常的while循环,但我可以忍受它。你能提出一个可行的解决方法来解决这个问题吗? – Seth

+0

您可以使用“序列”结构,或将减法的结果连接到比较,而不是原始的“分红”。 – fejese

0

你写的Python代码是不相同的。 LabVIEW中的while循环实际上是一个do while循环,它包含的代码将始终执行至少一次。这也意味着,只有在包含的代码执行后,条件才会被评估。