说我正在为fortran编写一个纸牌游戏。我有一个卡片对象,带有类型绑定程序" getsuit"和一个甲板对象(由一系列卡片组成),带有类型绑定程序" getcard"。
我想要的是能够做一些形式的事情:
deck%getcard%getsuit
然而,当我这样做时,我的编译器告诉我"函数引用不能用作结构组件的最左边的部分-ref,"即使该功能属于"卡。"另一方面,这样做:
card = deck%getcard
card%getsuit
工作正常。必须使用两行和一个额外的变量来实现这一点似乎是令人讨厌的;有什么办法吗?
答案 0 :(得分:2)
稍微根据你的功能做什么(这里假设它们或多或少是纯粹的)你可以使用用户定义的运算符。
the_suit = .SuitOf. (.CardFrom. deck)
答案 1 :(得分:2)
ISO / IEC 1539-1:2010 a.k.a Fortran 2008在第6.4.2节中说明
R611 data-ref part-ref [% part-ref ] ...
的声明类型的组件名称
R612 part-ref part-name [( section-subscript-list )] [图片-selector ]
C609(R611)除最右边之外的每个部件名称应为派生类型
C610(R611)除最左边之外的每个部件名称应为前面部件名
这意味着结构引用的每个组件必须是前一个组件的数据成员。 part-name 中()
的容差是允许索引到数组成员,不允许函数。函数返回派生类型不符合 part-ref 的规范,因此不是有效的Fortran,它适合您的编译器投诉。
但你可以这样做:
deck%card(i)%suit
假设卡是属于甲板的卡片阵列,而西装是属于卡片的类型。