Каково явное различие между намерениями Фортрана (в, inout)?

('yes', *"no", **main, *********printf) 

оценивается как *********printf, потому что оператор запятой оценивает свои операнды и возвращает значение последнего выражения. *********printf равно printf, поскольку разыменование указателя на функцию приводит к тому же указателю на функцию; это ничего не делает.

Затем, результат первой круглой скобки, printf, применяется к («hello world! \ N»), что приводит к выводу текста на экран. Функция printf возвращает количество написанных символов. Затем это число умножается на 0, и произведение возвращается основной функцией.

18
задан bossylobster 7 July 2014 в 21:29
поделиться

2 ответа

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

Это означает, что намерение(in) не передается по значению. Вы все равно можете перезаписать исходное значение.

program xxxx  
    integer i  
    i = 9  
    call sub(i)  
    print*,i ! will print 7 on all compilers I checked  
end  
subroutine sub(i)  
    integer,intent(in) :: i  
    call sub2(i)  
end  
subroutine sub2(i)  
    implicit none  
    integer i  
    i = 7  ! This works since the "intent" information was lost.  
end

program xxxx  
    integer i  
    i = 9  
    call sub(i)  
end  
subroutine sub(i)  
    integer,intent(out) :: i  
    call sub2(i)  
end  
subroutine sub2(i)  
    implicit none   
    integer i  
    print*,i ! will print 9 on all compilers I checked, even though intent was "out" above.  
end  
21
ответ дан 30 November 2019 в 08:16
поделиться
  • intent (in) - выглядит как передача по значению (и изменения этого не отражаются во внешнем коде), но на самом деле передается по ссылке, и ее изменение запрещено компилятором . Но это все еще можно изменить.
  • intent (out) - передать каким-либо образом по ссылке, на самом деле возвращаемый аргумент
  • intent (inout) - передать по ссылке, нормальный параметр входа / выхода.

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

6
ответ дан 30 November 2019 в 08:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: