Как написать программу на Фортране, которая поддерживает как статическое, так и динамическое управление памятью? - PullRequest
0 голосов
/ 26 августа 2010

Я работаю над публичным выпуском, если модель использует Fortran 9x, и я хотел бы разработать код, поддерживающий как статическое, так и динамическое управление памятью.

Я видел только один пример кода, который поддерживает что-то вроде этого. Это реализовано с использованием препроцессоров, которые выглядят примерно так:

Код будет включать в себя некоторый управляющий файл управления памятью со следующим:

#ifdef STATIC
  define NMEM_ N
  define PTR_      # blank
#else
  define NMEM_ :
  define PTR_ ,pointer

Пользователь предоставляет следующий файл для настройки статической памяти:

#define N 100      # Example array size
#define STATIC

В основном коде вы объявляете свою переменную так:

real PTR_, dimension(NMEM_) :: x

Установите STATIC во время компиляции, и он станет

real, dimension(100) :: x

Unset STATIC (неявно устанавливает его в динамический), и он становится

real, pointer, dimension(:) :: x

и некоторый более поздний код выделяет память.

Это прекрасно работает, но я предпочитаю избегать использования препроцессоров, если могу, и для меня это все равно что бред. Есть ли более стандартное решение этой проблемы, или это, как это обычно обрабатывается? Есть ли даже большая разница между статическими и динамическими компиляциями в наши дни (учитывая, что я, вероятно, захочу использовать столько памяти, сколько смогу)?

1 Ответ

4 голосов
/ 26 августа 2010

Наличие как статического, так и динамического режимов памяти кажется мне ненужным усложнением, затрудняющим чтение вашего кода и имеющим два пути, каждый из которых должен быть протестирован.Это также создает более сложные инструкции для пользователя и бремя, которому необходимо следовать, когда они «делают» программу.Я рекомендую просто использовать динамическое распределение, если максимальный размер массива не известен во время компиляции.Кроме того, я рекомендую использовать размещаемые массивы, а не указатели, если вам не нужна одна из немногих функций, которые могут быть реализованы только с помощью указателей, например, массивы с шагами, не относящимися к единице.Allocatables более безопасны, с утечками памяти по существу невозможны.Компиляторы Fortran 95 (дамп любого компилятора, кроме Fortran 90 на данный момент) давно поддерживают динамическое выделение памяти - не беспокойтесь об его использовании.

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