Несоответствие логического вида Fortran 90

Я пытаюсь передать аргумент, объявленный просто как logical :: invar, в функцию, где принимающая переменная объявлена ​​как

logical(x) :: invar

Теперь x определяется как

INTEGER, PARAMETER :: x = KIND(.TRUE.)

Что означает это определение x? Я выполнил поиск по kind(.true.), но все результаты как бы отмахиваются от этого аспекта. Был бы признателен за разъяснения для специалиста.

Я использую компилятор Intel, если это как-то связано с компилятором.


person Shejo284    schedule 08.03.2017    source источник
comment
Вы пишете о каком-то несоответствии в заголовке. Вы получаете какую-либо ошибку, или вы просто беспокоитесь, все ли так, как должно быть?   -  person Vladimir F    schedule 09.03.2017
comment
Хороший вопрос @VladimirF - если есть несоответствие, пожалуйста, опубликуйте ошибку и код. Если вы просто пытаетесь понять, посмотрите мой ответ.   -  person Ross    schedule 09.03.2017
comment
Извините, да, я получаю сообщение об ошибке несоответствия, если я не объявляю инвар как логический (х) :: инвар. Ошибка просто говорит о том, что типы не совпадают. Поэтому я пытаюсь понять этот синтаксис, чтобы избежать его в будущем.   -  person Shejo284    schedule 09.03.2017


Ответы (1)


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

Тот, кто написал этот код, очевидно, думает иначе. Когда вы объявляете логику обычным способом, с помощью

logical :: L1

переменная my_logical имеет вид по умолчанию. Когда вы объявляете это с помощью

integer, parameter :: x = KIND(.TRUE.)
integer(x) :: L2

он имеет тип x, который определяется как тип .true.. Хитрость заключается в том, что .true. почти наверняка тоже типа по умолчанию. (Стандарт требует, чтобы тип по умолчанию был типом .FALSE.)

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

person Ross    schedule 08.03.2017
comment
.true. не просто почти наверняка имеет тип по умолчанию, но полностью, полностью, не может быть более определенным, абсолютно, кого-то следует уволить, если он не является типом по умолчанию. - person francescalus; 09.03.2017
comment
Спасибо за объяснение :-) Теперь понял. - person Shejo284; 09.03.2017