2016-05-18 3 views
2

У меня есть старый код Fortran, который меня попросил проанализировать и перевести на современный язык. Я не знаю, какой компилятор использовался в прошлом для компиляции кода, поэтому на данный момент я пытаюсь скомпилировать его с помощью gfortran. Код содержит заявление, как это было причины gfortran жаловаться:Неявное целое преобразование <--> логическое выражение в языке Fortran if

program test 
    implicit none 
    integer*4 :: var 
    var=.true. 

    if(var) then 
     write(*,*) "Hi" 
    endif 

    end program test 

Компиляция это с gfortran дает следующее сообщение об ошибке:

test.f:6:9: 

     if(var) then 
     1 
Error: IF clause at (1) requires a scalar LOGICAL expression 

(Кроме того, это дает предупреждение о преобразовании сделано в var=.true.).

Я не уверен, какой компилятор был скомпилирован, но, очевидно, код должен компилироваться как есть. Есть ли способ сказать gfortran принять это преобразование?

Согласно документации, не неявное преобразование не выполняется в случае, заявления, хотя: https://gcc.gnu.org/onlinedocs/gfortran/Implicitly-convert-LOGICAL-and-INTEGER-values.html

+1

Я не могу ответить на вопрос (поскольку я не знаю, как получить gfortran для компиляции этого сломанного кода), но можете ли вы просто сделать 'var' логическим? – francescalus

+0

Да, это сработает, но я бы предпочел не менять код. –

+0

Совершенно разумное желание. Предупреждение, хотя: если в коде есть эти нестандартные части, тогда не сообщается, что еще происходит (что может вас удивить), о которых ваш компилятор не жалуется. Возможно, стоит посмотреть, какой компилятор был изначально использован. – francescalus

ответ

0

Это не представляется возможным в GFortran. В manual состояния:

However, there is no implicit conversion of INTEGER values in if-statements, nor of LOGICAL or INTEGER values in I/O operations.

Вы только в состоянии выполнить неявное преобразование в назначениях, как ваш

integer :: var 
    var = .true. 

, но даже там вы должны быть очень осторожны. Он не соответствует стандарту, а значение var будет отличаться между компиляторами. Intel использовала -1 (все биты были установлены в 1), если не было выбрано -standard-semantics, для .true., но gfortran использует +1, как на языке C. Новые версии Intel Fortran меняют значение по умолчанию. Другое направление еще сложнее, могут быть значения, которые не являются .true. или .false..

+0

Intel изменила свой дефолт несколько лет назад. Текущее значение по умолчанию - «var/= 0» и «transfer (.TRUE., 0) = 1». Старое значение по умолчанию было действительно «iand (var, 1)/= 0» и «transfer (.TRUE., 0) = - 1». У компилятора все еще могут быть ошибки, когда вы передаете передачу (2, .FALSE.) В некоторые из ее встроенных функций и выбираете одно или другое из своих документированных внутренних представлений. – user5713492

+0

Этот вопрос был написан, ну год и что-то еще.Но многие люди все еще используют более старые версии. Это не такое далекое прошлое, когда я обсуждал поведение здесь со Стивом Лионелем. Это было особенно запутанно с 'logic (c_bool)', который не работал должным образом без '-стандартной-семантики'. –

+0

Это одна проблема с этим форумом, так это то, что многие должности воскресают много лет назад, поэтому, если вы забыли проверить даты, вы не в фазе с контекстом. Стандарт должен был рекомендовать, чтобы разработчики установили C_BOOL = -1, потому что C не имеет типа LOGICAL (_Bool - целочисленный тип) и пытается получить Fortran LOGICAL для соответствия C _Bool означает, что Fortran LOGICAL станет таким же сломанным, как C. TT – user5713492

 Смежные вопросы

  • Нет связанных вопросов^_^