Ошибка выполнения M6201 (ДОМЕН)
Я новичок в этом форуме, но думаю, что у меня проблема, которая актуальна.
У меня есть довольно большая программа F77, которую я тщательно преобразовал в F90. Чтобы в дальнейшем переместить его в F90, я утомительно удаляю каждый из нескольких ОБЩИХ блоков. Я успешно разобрал 4 из них и работаю над 5-м. На каждом этапе я проверяю вывод в сравнении с исходным контрольным примером, чтобы убедиться в достоверности чисел.
В общем, когда я удаляю блок COMMON, я добавляю его переменные в раздел объявлений в модуле программы, а затем для каждой подпрограммы, которая использовала этот блок COMMON, я добавляю "use ModuleName". Это сработало нормально.
Кстати, я использую компилятор CVF v6.6C с Windows XP Pro.
В последнем случае я удалил 5-й ОБЩИЙ блок, и он скомпилирован нормально. Однако во время выполнения программа захлебнулась определенной строкой в одной из своих многочисленных подпрограмм - строке, включающей SQRT. Ниже приведены 3 ключевые строки (реальное U передается в качестве аргумента; реальный массив Y из 8 элементов задается в другой подпрограмме и также передается в качестве аргумента):
W = Y(2)/Y(1)
sum = (w**2 + u**2)
V = SQRT(W**2+U**2)
Я проследил проблему до этой точки и добавил несколько диагностических записей чуть ниже этой точки дросселирования. Как ни странно, (1) реальный массив Y отсутствует даже в ОБЩЕМ блоке, который я удалил. (2) подпрограмма выполняется 128, 646 раз, прежде чем возникнет какая-либо проблема, при этом значения будут следующими:
Y(2) = Infinity Y(1) = Infinity w = NaN u = 3.5 Sum = NaN
Когда Y(2) и Y(1) уходят в бесконечность, их частное равно NaN, а SQRT(NaN) равно BUST!
Имейте в виду, в версии, прежде чем я удалил 5-й ОБЩИЙ блок, этот саб. выполнено 473351 раз. Таким образом, программа завершилась примерно на 27% до сбоя.
FWIW: Y используется в паре сабов. и всегда проходил через ARG (никогда через COMMON).
Я понимаю, что большинству из вас будет трудно расшифровать этот код без кода, который я не могу предоставить, потому что он длинный и проприетарный. Но я ищу общие принципы Фортрана. Почему переменная (массив Y), которая работала нормально, прежде чем вдруг начала принимать значения, достигающие бесконечности, тем самым приводила к сбою функции SQRT? Могу ли я попробовать какие-либо трюки с декларациями, чтобы "стабилизировать" Y? Любые мысли или предложения приветствуются.