我有一个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