Да, что, как ожидается, Intel Fortran правда действительно -1, потому что все биты устанавливаются в 1.
Кроме того, ваше использование целых чисел в виде логических (булевых) переменных совершенно нестандартным. Вы должны сделать свой код на несколько строк дольше и всегда делать правильное преобразование. Ваш integer_var = 1*(node(5,L).gt.0)
не разрешен в Fortran, и ему будет отклонено многими компиляторами. Если вы отпустите 1*
, gfortran выдает предупреждение, но ваша форма приводит к ошибке.
Вы можете просто конвертировать ваши логические выражения и целые числа в стандартном соответствии сторонней
if (l) then
x = 1
else
x = 0
end if
Вы можете преобразовать Fortran логических массивов целочисленных массивы с 1 и 0 легко с помощью MERGE()
intrisic или с помощью WHERE
.
легко исправить для Intel Fortran, вероятно, -fpscomp logicals
для Intel Fortran, который переключает лечение LOGICAL
типа рассмотреть что-либо отличное от нуля, как верно и делает константу .true.
быть эквивалентно целому числу 1.
Тем не менее быть потому что он не делает вашу программу переносимой, она просто работает вокруг одной проблемы переносимости в одном конкретном компиляторе.
Вы можете использовать C совместимую логический тип в соответствии с определением в представлении Intel C:
use iso_c_binding
logical(c_bool) :: variable
Они будут иметь значения +1 и 0, как C99 диктует для _Bool. Если вам нужно, чтобы они были совместимы с int
, вы должны сделать некоторое простое преобразование. C_int
не совместим с c_bool
.
В зависимости от версии Intel Compiler вам может потребоваться -standard-semantics
(или -fpscomp logicals
) для правильного logical(c_bool)
. Я считаю это очень несчастным.
Обратите внимание, что нет Visual Studio Fortran. Существует несколько поставщиков компиляторов Fortran, но наиболее распространенным является Intel. –
@ VladimirF Я использую Intel FORTRAN и использую Visual Studio в качестве среды IDE. Я должен отредактировать, чтобы сделать его более ясным. – Mithil