F# - 变量范围

时间:2010-10-21 11:56:24

标签: f#

我有一个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被加载,字典就被创建并永远保持活着......现在我们将记录改为了类,一切正常。非常感谢你的提示

2 个答案:

答案 0 :(得分:1)

所以我发现了什么问题 - Massif是对的! :)在coreLibrary中,我们使用ConcurrentDictionary。我们想使用Records而不是Classes(功能:D)并且记录不允许在类内部创建字典,因此字典已经在类之外创建并通过成员函数链接到记录中。因此,一旦dll被加载,字典就被创建并永远保持活着......现在我们将记录改为了类,一切正常。非常感谢你的提示

答案 1 :(得分:0)

您使用的是哪种数据类型?您使用的浮点类型是否可能引入表示错误?什么构成“正确”和“不正确”的输出?

作为一般规则,打开或不打开库不会对计算结果产生任何影响(假设代码仍然编译!)。