Переполнение стека с помощью Фортрана - PullRequest
2 голосов
/ 01 апреля 2012

Я написал программу с Compaq Visual Fortran.Программа в порядке и работает правильно во многих случаях.Дело, над которым я сейчас работаю, больше, с большими файлами входных данных, и при запуске программы появляется следующая ошибка:

forrtl: Серьезный (170): Исключение программы - переполнение стека

У меня установлена ​​программа editbin.exe, но я действительно не знаю, как ее использовать.При вводе

editbin /STACK:4000000 DFDEV.exe

он сообщает, что не может открыть DFDEV.exe, даже если я нахожусь в каталоге, содержащем эту программу (C: \ Program Files \ Microsoft Visual Studio \ Common \ MSDEV98 \BIN).Я действительно не знаю, как решить эту проблему, и в каждой теме, которую я нашел об этом предмете в Интернете, нет объяснения, как использовать эту программу editbin.

1 Ответ

0 голосов
/ 09 августа 2012

Я также нашел компилятор "помощь" бесполезным.Руководство программиста предлагает несколько слов о выделении стека и кучи, которые можно найти с помощью поиска «commit», с подсказками, что EDITBIN.EXE может использоваться для изменения уже скомпилированного файла .exe.Как будет упомянуто позже, есть также опция компилятора Project> Settings> Link> Output, позволяющая указывать большие значения, но мало указаний о том, какие значения.

Существует опция компилятора, которая принимает AUTOMATIC для хранилища, объявленного в подпрограммаходнако некоторые программы вполне могут полагаться на то, что данные хранятся «статично» между вызовами и не имеют должного указания SAVE.Я был осторожен с SAVE и не заметил никакого эффекта при выбранном «автоматическом».В моем случае проблемы начались после того, как я ввел небольшую рекурсию (автоматически доступна в Burroughs fortran - ключевое слово RECURSIVE - otiose), но стековое хранилище также используется для временных переменных (возможно, размера массива) и параметров копирования, копирования и т.д.в виде разделов массива или, например, передачи массива типа blob, где blob является составной сущностью, содержащей, скажем, целое число, и вы хотите представить целые числа в виде массива, как в A (i: j) .Fred, где в хранилищепоследовательные элементы Фреда на самом деле не являются смежными (с шагом = 1), потому что BLOB-объект также содержит и другие элементы.

В любом случае, я начал использовать выделенные массивы (чтобы иметь рваные массивы, а не (bigenough, n) и тому подобное) и другие изменения, и я только что проверил и обнаружил, что параметр вернулся к значению по умолчанию (пустая запись), без сомнения из-за промежуточных переустановок на новом компьютере после сбоя блока питания.

...