2012-04-25 39 views
0

我在Fortran2003中编写链表结构。这个链表中的节点有两个交替的变体。该列表表示边缘的拓扑环,每条边被两个顶点限定,并且每个顶点连接到两条边。 这些结构被声明为抽象的NODE_T类型,并由两个子类VN_T和EN_T实现。 VN_T指向两个EN_T,反之亦然。 由于列表在类型之间交替,指针存储在子类中。 我的问题是将类型绑定函数(方法?)添加到名为NEXT()和PREV()的VN_T和EN_T,并且通过多态性执行正确的操作。 VN_T%NEXT()应跳过两个步骤,并获取下一个VN_T(与EN_T分隔开始的一个)。重载的函数在fortran 2003中的抽象接口旁边返回指向基类型的指针?

我喜欢的类型/类的定义如下:

TYPE, ABSTRACT :: NODE_T 
    INTEGER :: IENT 
    INTEGER :: ISIDE 
    INTEGER :: ISUBTYPE 
    INTEGER :: IPAD 
CONTAINS 
    PROCEDURE(NEXTA), DEFERRED :: NEXT 
    PROCEDURE(PREVA), DEFERRED :: PREV 
    END TYPE NODE_T 

ABSTRACT INTERFACE 
FUNCTION NEXTA(PENT) 
IMPORT NODE_T 
CLASS(NODE_T), POINTER :: NEXTA 
CLASS(NODE_T) :: PENT 
END FUNCTION 

FUNCTION PREVA(PENT) 
IMPORT NODE_T 
CLASS(NODE_T), POINTER :: PREVA 
CLASS(NODE_T) :: PENT 
END FUNCTION 
END INTERFACE 

    TYPE, EXTENDS(NODE_T) :: VN_T 
    DOUBLE PRECISION DT 
    CLASS(EN_T), POINTER :: N 
    CLASS(EN_T), POINTER :: P 
    CONTAINS 
     PROCEDURE :: NEXT => NEXTV 
     PROCEDURE :: PREV => PREVV 
    END TYPE 

    TYPE, EXTENDS(NODE_T) :: EN_T 
    CLASS(VN_T), POINTER :: N 
    CLASS(VN_T), POINTER :: P 
    CONTAINS 
     PROCEDURE :: NEXT => NEXTE 
     PROCEDURE :: PREV => PREVE 
    END TYPE 

下一个/上一个例程的实现都大同小异,下一个/上和EN/VN的四种组合:

FUNCTION NEXTE(PENT) 
CLASS(NODE_T), POINTER :: NEXTE 
CLASS(EN_T) PENT 
NEXTE => PENT%N%N 
END FUNCTION 

当我调用这些函数:

CLASS(NODE_T), POINTER :: NODE1, NODE2 
NODE2 => NODE1%NEXT() 

然后我的编译器(英特尔Fortran XE撰写[R 2011,即V12.0)与消息

error #8314: If the rightmost part-name is of abstract type, data-ref shall be polymorphic [NEXT] 
      NODE2 => NODE1%NEXT() 
---------------------------^ 

了基于此this documentation似乎表明,它正试图NEXT在类调​​用procdure而不是选择的子类实现的一个抱怨(它应该能够根据NODE1的具体类型在右侧进行,对吗?)。

我是F2003的OOP功能的新手,所以我在JAVA中制作了这个模式的样机,让我满意。任何人都可以阐明这是否是a)F2003的OOP行为有所不同,2)编译器bug或3)我只是在使用智能...

回答

1

您可能需要更新编译器。由于在这个线程

http://software.intel.com/en-us/forums/showthread.php?t=78855 

Fortran标准不允许原本叫抽象类型的直接,你正在做的类型限制的程序进行讨论。但是,标准已经改变,现在应该已经将其转换为英特尔Fortran。

另一种方法是修改基类:

TYPE :: NODE_T 
    INTEGER :: IENT 
    INTEGER :: ISIDE 
    INTEGER :: ISUBTYPE 
    INTEGER :: IPAD 
CONTAINS 
    PROCEDURE :: NEXT 
    PROCEDURE :: PREV 
    END TYPE NODE_T 
+0

更新到更新9包300允许这种使用的编译,感谢您的帮助。 – RFairey 2012-05-01 14:51:27