Что означает = > (равно больше, чем) в Fortran?

Я просматриваю какой-то старый код Fortran 90 и наткнулся на => символ:

var => item

похоже, что он используется для какого-то задания.

поиск Google для "символ" стрелка "Фортран" или "равно больше, чем символ Fortran" не дает мне никакого связанного материала.

2 ответов


=> появляется в шести контекстах как синтаксический элемент в современном Fortran, многие, но не все, связанные с указателями:указатель задание; инициализация указателя; процедура (указатель) объявление; объявление процедуры с привязкой к типу; ассоциации; переименовать. Существует тесная связь между большинством из них. Слабо, во многих => можно рассматривать как альтернативу временной или постоянное средство ссылки на другую сущность. Ни в одном, однако,=> действует как оператор.1

указатель задание

назначение указателя является одним из традиционных появлений =>, появляясь в Fortran 90. Он используется для связывания указателя с целью и объясняется в другого ответа.

использовать переименование ассоциации

переименование объектов, связанных с использованием элемент => и другое возникновение в коде Fortran 90/95. Такие use заявления вроде

use mod_a, c=>a
use mod_b, only : cc => bb

после такого use выписка модульных сущностей a и bb известны под местными именами c и cc.

инициализация указателя

инициализация указателя очень похожа на назначение указателя, где => появляется. Инициализация указателя определяет начальную ассоциацию указателя. Мы видим это в таких утверждениях, как

real, target :: a
real, pointer :: b=>a
real, pointer :: c=>NULL()

С этой явной инициализацией указатель b здесь изначально ассоциируется с a и указатель c изначально не связан. Эти две формы полезны в современном Fortran в том, что в Fortran 90 указатель всегда начинает жизнь изначально неопределенного статуса ассоциации. Здесь мы знаем, что b и c определили статус ассоциации указателей, и мы можем использовать ASSOCIATED.

для производного типа компоненты такой синтаксис дает инициализацию по умолчанию.

процедура декларации

так же, как с явной/инициализацией по умолчанию для объектов данных => особенности определения начальной ассоциации указателя процедуры.

procedure(proc_interface), pointer :: proc1 => donkey
procedure(proc_interface), pointer :: proc2 => null()

здесь proc1 снова первоначально связан с процедурой donkey и у нас могут быть такие вещи, как

call proc1(...)

столько, сколько мы могли, когда proc1 указатель назначен с donkey за пределами оператор объявления. proc2, как и ожидалось, изначально не связанные.

как с компонентами объектов данных производных типов => может иметь функцию установки начальной ассоциации процедуры с привязкой к объекту

type a
  procedure(proc_interface), pointer :: proc => donkey
end type a

объявление процедуры с привязкой к типу

концептуально связанным с вышеизложенным является использование => в объявлении процедур с привязкой к типу.

type a
 contains
  procedure :: proc => donkey
  generic :: assignment(=) => type_a_eq
end type a

здесь типа a proc является именем привязки, так что b%proc (for b объект типа a) является ссылкой на процедуру. Мы тоже, через type_a_eq, определили назначение с сущностями типа a С левой стороны.

Ассоциации

=> появляется в трех контекстах ассоциации. The associate, select type и select rank конструкции связывают имя с селектором.

из Fortran 2003 у нас есть

associate (a => 1+2)
  ... ! In this block we have an entity named a
end associate

и

class(*) b   ! b is unlimited polymorphic
select type (a => b)
  type is (real)
    ... ! a is a non-polymorphic real here
end select

введен в ( текущий проект) Fortran 2018 у нас

dimension(..) b  ! b is assumed rank
select rank (a => b)
  rank (1)
    ... ! a is a rank-1 array here
end select

эти ассоциации отличаются от указки. a на associate блок не должен быть (и в приведенном выше примере не является) переменной.


[1] понятие оператор точно определено в языке Fortran, как в 3.2.4 спецификации Fortran 2008. В отличие от многих других языков, assignment (with =) сама по себе не операция, а утверждение. В C-like языки мы можем иметь (a=b) как выражение, возвращающее результат: в Fortran это не так. То же самое относится к назначению указателя в Fortran. Другие приведенные выше случаи полностью отличаются от этой идеи назначения. Даже в Фортране!--48--> появление в инициализации-это не то же самое, что назначение. => нельзя рассматривать как имеющие один эффект.


удивительно, поиск "равен символ стрелки Fortran" дает некоторые результаты.

"=>" обычно называют оператор присваивания указателя.
(Хотя это не так!--14-->действительно оператор поскольку он не возвращает значения.)

Он используется для связать выбранное имя ссылки с целью:

reference => target

выше можно прочитать как "ссылка относится к цель"

чаще всего эта ссылка встречается в виде указатель. В этом случае вы можете сказать " reference указывает на target". Это полезный способ запомнить, что делает этот оператор, поскольку его буквальный вид представляет собой стрелку, указывающую от ссылки на цель.

Дополнительно Использует
Дополнительные использования, включая создание локальных псевдонимов для различных элементов, таких как компоненты модуля, процедуры и даже произвольные выражения. Для полного объяснения всех этих применений см. ответ.

назначение указателя против традиционного назначения (=)
Вот краткий пример из приведенной выше ссылки, который иллюстрирует, как назначение указателя отличается от классического назначения ("="). В основном это показывает, что после установки цели указатель обрабатывается в качестве этой цели для основные положения.

pt => x ! pt points to x

y = pt ! y equals x

pt => y ! pt points to y

pt = 17 ! y equals 17

другой Ресурсы:
общая документация по указателям Fortran