Динамические и статические массивы в устаревшем коде - PullRequest
3 голосов
/ 22 сентября 2010

Я отвечаю за ряд старых (F77) программ.Иногда один или другой может потерпеть неудачу из-за попытки превысить фиксированный размер массива.Мое обычное исправление - способ перераспределения массива-нарушителя.

Есть ли у кого-нибудь мысли или опыт по изменению этих фиксированных массивов на динамические и каковы последствия для остального кода, включая вызовы подпрограмм?

Я использую довольно новый компилятор в OpenVMS, поэтому я считаю, что проблем с компилятором не будет.

1 Ответ

4 голосов
/ 22 сентября 2010

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

Возможно, вы имеете в виду, что вы определяете массивы во время компиляции с большим пространством, чем вы ожидаете использовать? Это один из способов работы программистов на Фортране в течение долгого времени. Однако, начиная с Fortran 90, язык стандартным образом поддерживает динамические массивы, то есть те, размер которых устанавливается во время выполнения. Ключевое слово ALLOCATABLE используется для объявления таких массивов, и им дается пространство (обычно в куче) с помощью процедуры ALLOCATE. Конечно, после этого размер массива будет фиксированным. Чтобы динамически развернуть массив, вы обычно должны выделять больший массив, а затем копировать элементы по всему.

Если вы планируете и дальше использовать ваши унаследованные программы, я предлагаю возместить затраты на преобразование в размещаемые массивы. Это то, что я и, как я подозреваю, большинство других программистов на Фортране, сделали много за те годы, когда стали широко доступны компиляторы Фортран 90. Одним из способов возмещения этих усилий является предоставление вам возможности сосредоточиться на других аспектах обслуживания. Учитывая доступность памяти на современных компьютерах, вам нужно гораздо меньше беспокоиться об использовании такого пространства, чем люди, которые писали код поколение назад. Я ожидаю, что пользователи кода пытаются решать гораздо более серьезные проблемы, чем их предки. Выделение массивов обеспечит некоторую степень защиты будущего.

Что касается влияния на другие части кода, подумайте:

  • DEALLOCATEing, когда вы закончите работу с массивом.
  • Массивы, выделенные внутри подпрограмм и функций, автоматически освобождаются при выходе, если только вы не вернете массив вызывающему устройству - но это возможно только (согласно стандарту, ваш компилятор может отличаться) в Fortran 2003 и более поздних версиях.
  • Если вы РАСПРЕДЕЛИТЕ массив, вы можете передать его и получить из подпрограммы, как и любой другой массив.
  • В FORTRAN77 было обычной практикой передавать измерения массива в подпрограмму с массивом; в Фортране 90 и позже вам не нужно это делать, если вам нужно знать размер, который присущ РАЗМЕРУ. А с синтаксисом целого массива вам часто не нужно знать, какой размер массива в любом случае.
  • Вместо того, чтобы переписывать большую часть кода обработки массива, вам может быть проще написать обертки вокруг него.
  • В качестве хорошей практики вы должны проверить значение параметра stat в операторе ALLOCATE.

Я ожидаю, что есть куча вещей, которые я забыл.

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