F # - область действия переменных - PullRequest
3 голосов
/ 21 октября 2010

У меня 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.Поэтому я ожидаю, что как только цикл перейдет к следующему циклу или как только произойдет конец Array.iter, все внутри будет стерто.

Спасибо за любую помощь, подсказку и т. Д .:)


Итак, я нашел, что было не так - Массив был прав!:) В coreLibrary мы используем ConcurrentDictionary.Мы хотели использовать Records вместо Classes (чтобы быть функциональными: D), и записи не позволяют создавать словарь внутри класса, поэтому словарь был создан вне класса и связан с записью функциями-членами.Итак, как только DLL была загружена, словарь был создан и оставался в живых навсегда ... Теперь мы изменили запись на класс, и все работает отлично.Большое спасибо за ваши подсказки

Ответы [ 2 ]

1 голос
/ 23 октября 2010

Итак, я нашел, что было не так - Массив был прав! :) В coreLibrary мы используем ConcurrentDictionary. Мы хотели использовать Записи вместо Классов (чтобы быть функциональными: D), и записи не позволяют создавать словарь внутри класса, поэтому словарь был создан вне класса и связан с записью функциями-членами. Итак, как только DLL была загружена, словарь был создан и оставался в живых навсегда ... Теперь мы изменили запись на класс, и все работает отлично. Большое спасибо за ваши подсказки

0 голосов
/ 22 октября 2010

Какие типы данных вы используете?Возможно ли, что используемые вами типы с плавающей точкой вводят ошибки представления?Что представляет собой «правильный» и «неправильный» выходные данные?

Как правило, открытие или не открытие библиотеки не повлияет на результат вычисления (при условии, что код все еще компилируется!).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...