Избегайте неявного преобразования между float и integer для индекса массива - PullRequest
1 голос
/ 04 ноября 2019

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

Например,

Real :: i1,i2
Real :: A(1000,1000) , B(2000,2000)

A(i1:i2,:) =B(i1:i2,1:1000)

У меня был такой код, и я не реализовывал свои объявления i1 и i2. Иногда у меня возникали проблемы из-за этого, пока я не осознал это. Судя по всему, Фортран делает неявное преобразование, о котором мне хотелось бы знать.

Неужели компилятор Фортрана не может увидеть, что на массив не ссылаются ожидаемые индексы?

1 Ответ

1 голос
/ 05 ноября 2019

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

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

В случае ifort опция -stand:

предупреждение # 6187: Fortran 2008 требует тип данных INTEGER в этом контексте.

Вы можете даже объединить это с -diag-error=6187, чтобы обновить диагностику доошибка.

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