Фортран 77 ошибка с комментированием пишут заявления - PullRequest
2 голосов
/ 11 августа 2011

Я работаю со старой программой на Фортране 77 и столкнулся со странной ошибкой. На самом деле, код работает нормально и заканчивается менее чем за секунду. Но он производит кучу посторонних выводов, которые мне не интересны. Итак, я зашел в источник и закомментировал все дополнительные операторы WRITE.

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

Теперь, логически, комментирование оператора WRITE должно по-прежнему оставлять остальную часть программы полностью функциональной, верно? Я предполагаю, что это означает, что где-то в коде скрывается какая-то другая проблема и что оператор WRITE каким-то образом маскирует его (возможно, очищает буфер).

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

Я компилирую программу с помощью g77 на компьютере PowerPC Mac.

Ответы [ 2 ]

3 голосов
/ 11 августа 2011

Это будет звучать нечувствительно, возможно, даже грубо, но ...

Здесь применяется стандартный ответ № 1 - если вы поняли проблему, вы не обратились бы за помощью.Если вам нужны какие-либо шансы на получение достойной помощи, вам нужно показать реальную проблему, а не свою интерпретацию того, что, по вашему мнению, является проблемой.Мы не можем отлаживать код, глядя на что-то, что не является кодом для отладки или, возможно, даже источником проблемы.

Итак, покажите код!
- объявления имеют значениемного
- как вы его компилируете, какие опции включены?
- выход за границы массива - это то, что компилятор должен ловить во время компиляции
- это запись оператора, записываемая на экран или вкакой-то другой блок (файл);есть ли вероятность, что что-то будет прочитано позже?
- это может быть проблема с сохранением и инициализированными значениями?(просто угадаю здесь)

Вы сказали, что программа "зависает".Вы пытались определить, в какой части кода он висит?(бесконечный цикл), или он только что вошел в какой-то длинный цикл?

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

Там действительно ничего нетбольше, что можно сказать из предоставленной информации, извините.

Редактировать: @ bambeck - у меня нет g77 (и powerMac),поэтому я не могу дать вам точные инструкции (следовательно, неопределенность с моей стороны), но для начала попробуйте включить диагностические переключатели компилятора (g77 /? или g77 / help или что-то подобное, должно дать вам их список).Включите его, чтобы показать все предупреждения (это должно быть что-то в этом роде), проверку границ массива во время компиляции и т. Д. Если это приводит к чему-то интересному , опубликуйте его.

Нет ничего per se неправильно с оператором записи, который вы показали, насколько это касается.

Также я не знаю, является ли цикл действительно бесконечным, но он идетболее получаса.Немного о сохранении выглядит многообещающе, хотя ... Разработано?

О, просто кое-что, что пришло в голову.Я не уверен, что Стандарт говорит об этом, поэтому я только упомянул об этом на стороне.Иногда, когда массив не инициализируется должным образом (до некоторого значения), некоторые компиляторы устанавливают его на нулевое значение, а некоторые просто выбирают что-то случайное из памяти в том месте, где хранится его содержимое.Однажды у нас была проблема с чем-то похожим, и это дало нам странные результаты, поэтому я вспомнил об этом.Не говорю, что у тебя такая же проблема.В этих случаях оператор SAVE может привести к некоторому странному поведению.

Ваши результаты (когда программа "работает") когда-либо различались при разных запусках (с одинаковыми входными данными)?

0 голосов
/ 16 сентября 2011

1) вы могли бы вообще написать функцию: write (*, *) f (x), где функция f () делает что-то чертовски (включая изменение x), так что комментирование оператора write действительно меняет программу.Плохая практика, но возможно.

2) у вас может быть совершенно не связанная ошибка, такая как выход массива за пределы границ.Внесение каких-либо изменений в код может привести к тому, что компилятор по-разному будет выравнивать переменные в памяти, что приведет к возникновению «скрытой» ошибки.(Включение проверки границ массива и проверки доступа к неинициализированным переменным является хорошей идеей)

...