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