簡體   English   中英

F# - 變量范圍

[英]F# - Scope of variables

我有一個F#代碼計算液體流量。 代碼由2個項目組成。 運行模擬的核心庫和項目。 當我運行參數研究時

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結束,內部的所有內容都將被刪除。

謝謝你的幫助,提示等:)


所以我發現了什么錯 - Massif是對的! :)在coreLibrary中,我們使用ConcurrentDictionary。 我們想使用Records而不是Classes(功能:D)並且記錄不允許在類內部創建字典,因此字典已經在類之外創建並通過成員函數鏈接到記錄中。 因此,一旦dll被加載,字典就被創建並永遠保持活着......現在我們將記錄改為了類,一切正常。 非常感謝您的提示

所以我發現了什么錯 - Massif是對的! :)在coreLibrary中,我們使用ConcurrentDictionary。 我們想使用Records而不是Classes(功能:D)並且記錄不允許在類內部創建字典,因此字典已經在類之外創建並通過成員函數鏈接到記錄中。 因此,一旦dll被加載,字典就被創建並永遠保持活着......現在我們將記錄改為了類,一切正常。 非常感謝您的提示

您使用哪些數據類型? 您使用的浮點類型是否可能引入表示錯誤? 什么構成“正確”和“不正確”輸出?

作為一般規則,打開或不打開庫不會對計算結果產生任何影響(假設代碼仍然編譯!)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM