繁体   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