我有一個F#代碼計算液體流量。該代碼由2個項目組成。運行模擬的核心庫和項目。當我運行參數研究如F# - 變量範圍
open CoreLibrary
for lbmViscosity in [0.1] do
for Re in [0.001; 0.5] do
for lbmD in [6.;5.;4.;3.;2.5;2.;1.5;1.;0.8;0.6;0.4;0.2] do
simulation setup
let result = call CoreLibrary
save result to file
然後我得到正確的結果。當我運行的代碼爲:
open CoreLibrary
for lbmViscosity in [0.1] do
for Re in [0.1; 0.001; 0.5] do
for lbmD in [6.;5.;4.;3.;2.5;2.;1.5;1.;0.8;0.6;0.4;0.2] do
simulation setup
let result = call CoreLibrary
save result to file
然後,對於Re = 0.001,我得到了一個錯誤的結果。我也嘗試了Array.iter而不是for循環來獲得相同的結果。當我編譯我的代碼並將它作爲具有不同輸入參數的exe運行時,它運行良好。
除了突變之外,有什麼可能導致不正確的結果嗎?可能是垃圾收集器的錯?有什麼命令可以在某個地方完全清理內存嗎?類似於:
open CoreLibrary
for lbmViscosity in [0.1] do
for Re in [0.1; 0.001; 0.5] do
for lbmD in [6.;5.;4.;3.;2.5;2.;1.5;1.;0.8;0.6;0.4;0.2] do
clean everything
simulation setup
let result = call CoreLibrary
save result to file
我只在覈心庫中的變異值不在for循環中。因此,我期望只要for循環進入下一個循環,或者Array.iter結束時,內部的所有內容都將被擦除。
感謝您的幫助,提示等:)
所以,我已經找到了什麼事 - 地塊是對的! :)在coreLibrary中,我們使用ConcurrentDictionary。我們希望使用記錄而不是類(功能:D),並且記錄不允許在類內部創建字典,因此字典已在類的外部創建並通過成員函數鏈接到記錄中。所以一旦dll載入字典已經創建並永遠保持活着...現在我們將記錄更改爲類,一切正常。非常感謝您的提示
只要刪除'open CoreLibrary'行就不應該對代碼有任何影響。你可以從內部循環內粘貼確切的代碼行,或者找到一組具有相同問題的源代碼? – 2010-10-21 12:00:16
開放的CoreLibrary應該無處不在。我修正了這一點。由於代碼複雜,我不確定我能否重現錯誤。我會盡量簡化代碼並將其作爲zip文件發佈。 – 2010-10-21 12:26:17
我的猜測是CoreLibrary中的某些東西是在測試之間持續存在一個值(並且您承認它包含可變狀態) - 但是不知道那裏有什麼很難說。我在引用的代碼中看不到任何可能導致問題的內容。 – Massif 2010-10-21 12:26:34