Types 定义之前使用的Fortran派生数据类型

Types 定义之前使用的Fortran派生数据类型,types,module,fortran,derived,Types,Module,Fortran,Derived,如何在带有use module,ONLY:语句的模块之间包含派生数据类型(类型,而不是变量) 更多说明:在我的module1中,我定义了一个派生数据类型(我们称之为my_数据类型)和该数据类型的一些数据(我们称之为my_数据)。在我的模块2中我需要使用我的\u数据。由于我的模块1包含许多module2不需要的过程,因此我想使用ONLY语句只包含my_数据。但是,如果不包含数据类型,则会出现以下错误: Derive datatype 'my_type' is used before defined

如何在带有
use module,ONLY:
语句的模块之间包含派生数据类型(类型,而不是变量)

更多说明:在我的
module1
中,我定义了一个派生数据类型(我们称之为my_数据类型)和该数据类型的一些数据(我们称之为my_数据)。在我的
模块2中
我需要使用
我的\u数据
。由于我的模块1包含许多
module2
不需要的过程,因此我想使用
ONLY
语句只包含
my_数据
。但是,如果不包含数据类型,则会出现以下错误:

Derive datatype 'my_type' is used before defined at "type(my_type),intent(out)::A"
很明显,
module2
无法识别
module1
中定义的
myu数据类型,因为我没有通过它。但是,在“use module,only”语句中包含派生类型的语法是什么?我正在使用Fortran 2003

  module step1
  implicit none
     type my_type
        integer::id
        integer,dimension(2)::my_data
     end type my_type

     type(my_type)::A
  end module step1

  module step2
  use step1,only:A
  implicit none
  contains
     subroutine change_A(A)            
        type(my_type),intent(inout)::A
        A%id = 1
        A%my_data(1) = 1
        A%my_data(2) = 2                    
     end subroutine change_A
  end module step2

  program test
  ! program is in a different folder
  use step1
  use step2
     implicit none
     call change_A(A)
  end program test
然而,它给了我一个错误“在定义派生数据类型之前使用了它”。看起来module2无法识别module1中定义的my_数据类型

嗯,是的。当然,module2不能识别您的数据类型,因为它是在module1中定义的,在“use”语句中,您说您只想使用变量my_data。只需在“use”语句中包含该数据类型,就可以在module2中看到它

然而,它给了我一个错误“在定义派生数据类型之前使用了它”。看起来module2无法识别module1中定义的my_数据类型


嗯,是的。当然,module2不能识别您的数据类型,因为它是在module1中定义的,在“use”语句中,您说您只想使用变量my_data。只需在“use”语句中包含数据类型,模块2中就会知道该数据类型。鉴于您的更新问题,下面是如何实现其他人建议的修复:

(编辑:实施意见中的建议:

  • 仅从模块步骤2中的模块步骤1导入类型
  • 在主程序中,仅从步骤1导入A,并从步骤2更改_A
  • 请注意,例程“change_A”中的伪参数“A”与例程定义中模块step1中的“A”无关。我更改了伪参数的名称以说明这一点
  • )


    我已将
    my_type
    添加到“use”语句中。

    鉴于您的更新问题,以下是如何实施其他人建议的修复:

    (编辑:实施意见中的建议:

  • 仅从模块步骤2中的模块步骤1导入类型
  • 在主程序中,仅从步骤1导入A,并从步骤2更改_A
  • 请注意,例程“change_A”中的伪参数“A”与例程定义中模块step1中的“A”无关。我更改了伪参数的名称以说明这一点
  • )


    我在“使用”语句中添加了
    my_type

    欢迎。请在你的问题中张贴真实的代码。尤其是在显示任何错误消息时。另外,显示完整的错误消息。见和。如果我删除无意义的内容并将
    my_data%I=1
    添加到
    do_something\u to_my_data
    中,您显示的代码编译得很好。使用变量不需要作用域中的数据类型。谢谢Vladimir。我已按建议修改了问题。欢迎。请在你的问题中张贴真实的代码。尤其是在显示任何错误消息时。另外,显示完整的错误消息。见和。如果我删除无意义的内容并将
    my_data%I=1
    添加到
    do_something\u to_my_data
    中,您显示的代码编译得很好。使用变量不需要作用域中的数据类型。谢谢Vladimir。我已经按照建议修改了问题。谢谢你的快速回答。你能告诉我在“use”语句中使用数据类型的语法吗?我找不到它。它与变量名完全相同。谢谢你的快速回答。你能告诉我在“use”语句中使用数据类型的语法吗?我找不到它。它与变量名完全相同。我认为值得明确指出,子例程中的
    A
    不是模块实体。是的,
    only
    子句中的A几乎没有任何作用。我认为值得明确指出,子例程中的
    A
    不是模块实体。是的,
    only
    子句中的A几乎不起任何作用。
    module step1
      implicit none
      type my_type
         integer::id
         integer,dimension(2)::my_data
      end type my_type
    
      type(my_type)::A
    
    end module step1
    
    module step2
      use step1, only: my_type
      implicit none
    contains
      subroutine change_A(dummy)
        type(my_type),intent(inout) :: dummy
        dummy%id = 1
        dummy%my_data(1) = 1
        dummy%my_data(2) = 2
      end subroutine change_A
    end module step2
    
    program test
      ! program is in a different folder
      use step1, only: A
      use step2, only: change_A
      implicit none
    
      call change_A(A)
      write(*,*) A
    
    end program test