Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Types 如何为过程参数声明接口节,过程参数反过来引用同一模块的用户派生类型?_Types_Interface_Module_Fortran - Fatal编程技术网

Types 如何为过程参数声明接口节,过程参数反过来引用同一模块的用户派生类型?

Types 如何为过程参数声明接口节,过程参数反过来引用同一模块的用户派生类型?,types,interface,module,fortran,Types,Interface,Module,Fortran,如下面的代码示例所示,person\u list是一个用户派生的类型,包含一个类型绑定过程compare\u persons。我希望compare\u persons能够接受某组compareFunc作为其参数之一,因此声明compareFunc的接口部分。请注意,compareFunc的第一个参数的类型为person\u list。(正如您可能知道的,person\u list类似于Delphi的VCL中的TStringList。) 编译无法继续。错误消息如下: [root@localhost

如下面的代码示例所示,
person\u list
是一个用户派生的类型,包含一个类型绑定过程
compare\u persons
。我希望
compare\u persons
能够接受某组
compareFunc
作为其参数之一,因此声明
compareFunc
的接口部分。请注意,
compareFunc
的第一个参数的类型为
person\u list
。(正如您可能知道的,
person\u list
类似于Delphi的VCL中的
TStringList
。)

编译无法继续。错误消息如下:

[root@localhost new]# ifort -c lib1.f90 
lib1.f90(26): error #6457: This derived type name has not been declared.   [PERSON_LIST]
                    TYPE(person_list) :: persons    !   error #6457: This derived type name has not been declared.   [PERSON_LIST]
-------------------------^
lib1.f90(23): error #6404: This name does not have a type, and must have an explicit type.   [PERSONS]
                FUNCTION compareFunc(persons, index1, index2)    !   error #6404: This name does not have a type, and must have an explicit type.   [PERSONS] 
-------------------------------------^
compilation aborted for lib1.f90 (code 1)
错误消息似乎表明模块之间存在循环引用?因此,我想知道如何为过程参数声明接口部分,过程参数反过来引用同一模块的用户派生类型?任何见解将不胜感激

PS:尝试此模块的原因是对OO编程风格的偏好。尝试fortran的原因是一个庞大的代码库

PS:编译器为英特尔Fortran编译器,版本如下:

[root@localhost new]# ifort --version
ifort (IFORT) 12.1.0 20111011
Copyright (C) 1985-2011 Intel Corporation.  All rights reserved.
代码示例为:
tpg2114
找出解决方案!
好吧,我想起来了:

MODULE lib1

   TYPE :: persons
   CONTAINS
      PROCEDURE, PASS :: compare_persons
   END TYPE persons

   INTERFACE
      INTEGER FUNCTION compareFunc_interface(personsIn, index1, index2)
         IMPORT persons
         IMPLICIT NONE
         TYPE(persons), INTENT(IN) :: personsIn
         INTEGER, INTENT(IN) :: index1
         INTEGER, INTENT(IN) :: index2 
      END FUNCTION compareFunc_interface
   END INTERFACE


CONTAINS 
   FUNCTION compare_persons(this, index1, index2, compareFunc)
      IMPLICIT NONE

      INTEGER :: compare_persons
      CLASS(persons) :: this
      INTEGER :: index1
      INTEGER :: index2
      PROCEDURE(compareFunc_interface) :: compareFunc
   END FUNCTION compare_persons
END MODULE lib1
从2003年标准中,
IMPORT
语句将定义从主机作用域单元带到本地作用域单元。如果您使用的是来自不同模块的内容,则
接口
将需要
USE
语句。但是,由于您是从更高的作用域单元导入,因此使用
IMPORT
和一个您希望引入该作用域的内容列表

编辑


还要注意,我在类型绑定过程的声明中添加了
PASS
。虽然不是必需的(因为这是默认操作),但我更喜欢始终放置
PASS
NOPASS
,以便意图始终明确。这有助于程序员(确保他们做他们认为他们正在做的事情)和任何阅读代码的人

好吧,我想起来了:

MODULE lib1

   TYPE :: persons
   CONTAINS
      PROCEDURE, PASS :: compare_persons
   END TYPE persons

   INTERFACE
      INTEGER FUNCTION compareFunc_interface(personsIn, index1, index2)
         IMPORT persons
         IMPLICIT NONE
         TYPE(persons), INTENT(IN) :: personsIn
         INTEGER, INTENT(IN) :: index1
         INTEGER, INTENT(IN) :: index2 
      END FUNCTION compareFunc_interface
   END INTERFACE


CONTAINS 
   FUNCTION compare_persons(this, index1, index2, compareFunc)
      IMPLICIT NONE

      INTEGER :: compare_persons
      CLASS(persons) :: this
      INTEGER :: index1
      INTEGER :: index2
      PROCEDURE(compareFunc_interface) :: compareFunc
   END FUNCTION compare_persons
END MODULE lib1
从2003年标准中,
IMPORT
语句将定义从主机作用域单元带到本地作用域单元。如果您使用的是来自不同模块的内容,则
接口
将需要
USE
语句。但是,由于您是从更高的作用域单元导入,因此使用
IMPORT
和一个您希望引入该作用域的内容列表

编辑


还要注意,我在类型绑定过程的声明中添加了
PASS
。虽然不是必需的(因为这是默认操作),但我更喜欢始终放置
PASS
NOPASS
,以便意图始终明确。这有助于程序员(确保他们做他们认为他们正在做的事情)和任何阅读代码的人

非常感谢您富有洞察力的帮助!(一开始我为糟糕的变量感到抱歉!非常感谢您的耐心!)我想知道您是否介意提供一个测试驱动程序来调用
person\u list%compare\u persons
?只需在实际compareFunc中返回一个常量值就可以了!我不会这么做的。但是,如果您需要一个关于如何调用类型绑定过程的示例,请查看:非常感谢您富有洞察力的帮助!(一开始我为糟糕的变量感到抱歉!非常感谢您的耐心!)我想知道您是否介意提供一个测试驱动程序来调用
person\u list%compare\u persons
?只需在实际compareFunc中返回一个常量值就可以了!我不会这么做的。但是,如果您需要关于如何调用类型绑定过程的示例,请查看:
MODULE lib1

   TYPE :: persons
   CONTAINS
      PROCEDURE, PASS :: compare_persons
   END TYPE persons

   INTERFACE
      INTEGER FUNCTION compareFunc_interface(personsIn, index1, index2)
         IMPORT persons
         IMPLICIT NONE
         TYPE(persons), INTENT(IN) :: personsIn
         INTEGER, INTENT(IN) :: index1
         INTEGER, INTENT(IN) :: index2 
      END FUNCTION compareFunc_interface
   END INTERFACE


CONTAINS 
   FUNCTION compare_persons(this, index1, index2, compareFunc)
      IMPLICIT NONE

      INTEGER :: compare_persons
      CLASS(persons) :: this
      INTEGER :: index1
      INTEGER :: index2
      PROCEDURE(compareFunc_interface) :: compareFunc
   END FUNCTION compare_persons
END MODULE lib1