微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 测试测量 > 虚拟仪器 > be careful of auto indexing of a FOR loop

be careful of auto indexing of a FOR loop

时间:12-13 整理:3721RD 点击:
自从10月份一来一直特别忙,虽然有一些新的编程心得,却苦于没有时间写下来。昨天周六调程序一直到半夜快一点钟,今天下午依然忙于debugging。忙里偷闲写一个小的注意事项。
FOR 循环的auto indexing(中文是叫“自动索引”吗?)是个非常有用的功能。但是要小心,尤其是你同时把多个数组连到一个FOR 循环的时候,因为这些数组的dimensions很有可能并不相等。比如说,你有两个一维数组,分别有5个和3个元素,如果你对这两个数组都使用auto indexing,那么FOR循环只循环3次,也就是说那个5个元素的数组的后面两个元素就根本不会执行到。
最坏的可能是有一个数组是空的,那么整个FOR 循环则根本不会执行。
附件是我最近遇到的一个小问题。在那个有错的程序里,问题出在那个auto indexed shift register上。当这个vi第一次执行的时候,因为那个shift register不赋初值,其dimension是0,即使两个输入数组的dimension一致,如果你对三个数组都用auto indexing的话,这个FOR 循环永远不会执行。这个routine的本意是将输入的force/exponential window settings赋给shift register,下一次再执行到的时候比较是不是有变化。但是如果FOR 循环根本不执行的话,这个shift register则不会被赋值。

抱歉,附件补上。

 AutoIndexing_wrong.vi

 AutoIndexing_correct.vi

我遇到了

经常用auto indexing,因为它实在很方便,也留意数组要同维了,不过数组不能为空倒还真没注意过,学习了。

这种用法在《LabVIEW图形编程》里面好像有
貌似就是起一个变量的作用,可以在调用之间保持状态
我个人觉得这样太麻烦了,还不如搞个全局变量就ok了还不容易出错

这个特性我一般只在一个输入的时候用,比较保险

你说的也没错,但是这里提醒几点。
第一,还是那句老话,尽量少用全局变量。race condition之类的缺点就不说了,虽然使用全局变量的优点是速度快,但还是有些细节要小心,参见2007年8月30日的16499帖子,"借花献佛帖 - 强力推荐 reference control". 另外,我使用全局变量的时候一般都要用一个semaphone.
第二,我上面贴的例子并不是LV2 style global,而是一个reentrant vi。如果你要把想实现的功能做成reentrant 在不同地方调用,全局变量就不行了。
第三,当你写一个LV的通用软件包的时候,无法使用全局变量。你什么时候见过LV自己的function用全局变量的?
但是使用这种只循环一次的while loop的缺点是调试不方便。但是程序的结构非常好,适于做大型的程序。

嗯,很容易出的问题。但是遇到一次以后基本就会注意了。

  同样的问题遇到很多遍了。
呵呵。
以至于我做了一个校验SubVI,每次使用ForLoop索引多个数组时时同时调用之。

agree , 单独的全局变量不太适合大型程序,  很多地方调用一个全局变量,无法设断点调试. 就如同其它的编程语言利用get 和set 设置属性,而不会直接读写一样.

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top