2012-04-25 11 views
0

私はFortran2003にリンクリスト構造を書いています。このリンクされたリストのノードには、2つの種類があります。このリストは、エッジのトポロジーリングを表し、各エッジは2つの頂点で境界付けられ、各頂点は2つのエッジに接続します。 これらの構造体は抽象的なNODE_T型として宣言され、2つのサブクラスVN_TとEN_Tによって実装されます。 VN_Tは2つの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の4つの組み合わせと同じです:

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)がメッセージこのthis documentationに基づいて

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

と文句を言うことはベースクラス上の次のprocdureを呼び出そうというより、サブクラスの実装の1つを選択していることを示していると思われます(右、右側にあるNODE1の具体的なタイプに基づいて行うことができるはず?)。

私はF2003のOOP機能で新しいので、私は私が私の満足に働いてしまったJAVAでこのパターンのモックアップを作りました。誰もが、これはあなたがあなたのコンパイラを更新する必要があるかもしれませんF2003のOOP行動のa)の違い、2)コンパイラのバグまたは3)ちょうど私が脳死いる...

答えて

1

のいずれかであるかどうかに光を当てることができます。このスレッド

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

もともとあなたがやろうとしている直接抽象型、のタイプが結合したプロシージャを呼び出す禁止のFortran標準で説明したように。しかし、標準は変更され、現在ではインテルFortranに組み込まれているはずです。

代替として、基本クラスを変更することです:9パッケージ300を更新する

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

更新あなたの助けに感謝、使用のこの種は、コンパイルすることができます。 – RFairey

関連する問題