2014-12-20 141 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循環,它包含的代碼將始終執行至少一次。這也意味着,只有在包含的代碼執行後,條件纔會被評估。