2016-01-14 3 views
1

Это сложно описать словами, но пример должен дать понять. Допустим, у меня есть переменная производного типа со следующими компонентами.Можно ли подавить верхний уровень в ссылке на производный тип?

x%length 
x%width 

Есть ли какой-либо автоматический способ ссылаться на них без верхнего уровня? Другими словами, чтобы ссылаться на них просто как

length 
width 

Конечно, я мог бы сделать первый

length => x%length 
width => x%width 

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

В качестве примера из другого языка, питон существенно позволяет это подавление с:

from x import * 

ответ

2

Там нет такой функции в Fortran, насколько я знаю, по крайней мере, в реализациях, что у меня есть под рукой , Кроме того, цели моего поста - заставить некоторых других мыслить ясно.

Python from x import * является эквивалентом use x в fortran. Я не очень pythonic, но я не думаю, что вы можете импортировать член класса напрямую. Таким образом, это работает до тех пор, пока x является модулем pyton, а не классом python для моих ограниченных знаний. use x также будет работать до тех пор, пока x - это модуль fortran.

Один из языков программирования, который я знаю и который реализует функцию, которой вы пользуетесь, - pascal. Существует такая удобная конструкция with, которая позволяет вам это сделать.

with x do 
begin 
    lenght .... 
    width .... 
end 

В самом деле, это очень полезно в том, что она позволяет зачищать часть имени объекта и получить непосредственно в поле. Мне понравилось, когда я использовал pascal, но это было давно.

Delphi, конечно, это допускается.

+0

@JohnE, я понимаю, что иметь производный тип в первую очередь состоял в том, чтобы переносить каждую вещь в одну переменную. Я хотел бы указать, что аналогия с python не была тем, что вы описали. Тем не менее, я понял это явно, потому что я использовал такую ​​функцию на другом языке «паскаль». – innoSPG

+1

ОК, спасибо. Я имел в виду только пример с «import x», а не «import x».Я согласен, что это не идеальная аналогия для fortran, просто самое близкое, что я мог придумать, чтобы проиллюстрировать суть. – JohnE

2

Как насчет конструктора Fortran 2003? Это, в некотором смысле, управлять для вас указательное задания, которые вы перечислили:

Program test 
    Type :: t 
    Integer :: length 
    Integer :: width 
    End Type 
    Type (t) :: x = t(42, 43) 
    Associate (length=>x%length, width=>x%width) 
    Print *, length, width 
    End Associate 
End Program 

Цитируя Fortran 2003 (например, при http://www.j3-fortran.org/doc/year/04/04-007.pdf): «ассоциированной компании построить ассоциированные именованные объекты с выражениями или переменными во время выполнения его блок ".

В декабре 2015 г. в ACM Fortran Forum «Информация о компиляторе» перечисляет ассоциированную конструкцию как полностью поддерживаемую Cray, IBM, Intel и NAG и частично поддерживаемую gfortran.

Я не думаю, что есть способ упростить это, хотя, если у вас есть много типов компонентов для псевдонимов таким образом.

+0

Спасибо! Я не уверен, что это практическое улучшение по сравнению с указателями (хотя для них есть удобный временный аспект), но в любом случае хорошо знать. – JohnE

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