Отладочный оператор печати Fortran влияет на ход программы - PullRequest
1 голос
/ 12 августа 2010

У меня есть программа, которая перебирает массив, детерминистически создавая новые векторы-строки, которые затем добавляет в массив.

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

Была ошибка, из-за которой третья итерация приводила к тому, что вектор обнулялся.

В поисках этой ошибки я заполнил код отладочной печатьоператоры print *, «здесь», this_var и т. д. Одно из этих утверждений print (которое печатает норму последнего вектора) исправило программу.

Мне не нравится оператор print.Мне также не нравится, что я не понимаю, что происходит.

У кого-нибудь есть идеи о том, почему утверждение печати повлияет на то, что оно печатает?

Код (~ 400 строк, много комментариев) доступно

Ответы [ 4 ]

3 голосов
/ 12 августа 2010

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

И вы абсолютно правы - коварные ошибки, подобные этой, просто сводят с ума.

1 голос
/ 14 августа 2010

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

0 голосов
/ 15 августа 2010

вы используете подпрограммы?

иногда вы перезаписываете некоторые данные в подпрограмме, и они не передаются обратно, но результат теряется.

у вас есть правильные типы в вызове подпрограммы?

Вы используете намерение в / из?

Вы используете фиксированные размеры?

0 голосов
/ 12 августа 2010

В свое время я обнаружил ошибку, связанную с компилятором или компоновщиком, которая привела к подобным результатам. Строка кода была одинаковой во многих программах, и все они работали, кроме этой. В этом случае рассматриваемая линия была арифметикой if. Когда я конвертировал его в несколько стандартных операторов if then, он работал как надо. Маловероятно, что это ошибка, но я должен ее устранить.
Также должны поставить плюсы на ответ Тима. Параметры компилятора имеют первостепенное значение.

...