帮我挑以下fortran代码的毛病并改正:module mymodule type, public :: person private character(len = 32) :: name integer :: age contains procedure :: new procedure :: getinfo end type person contains subroutine new(this, name, age) class(person), intent(inout) :: this character(len = *) :: name integer :: age this%name = name this%age = age end subroutine new subroutine getinfo(this) class(person), intent(inout) :: this print "(AA)", "name: ", this%name print "(AI3)", "age:", this%age end subroutine getinfo end module mymodule program test use mymodule type(person) :: p1 p1%new("HFM", 12) p1%getinfo() end program test
时间: 2024-02-14 12:29:09 浏览: 149
在你提供的Fortran代码中,存在几个问题。以下是针对这些问题的修正:
1. 在type定义中,你使用了`private`关键字,它将使得类型的成员在模块外部不可见。然而,你又将`procedure`声明为`public`,这是冲突的。要么将`type`声明为私有类型,要么将`procedure`声明为公共类型。在此例中,我们将删除`private`关键字。
2. 在`subroutine new`中,你在给定的参数列表中使用了与成员变量相同的名称(name和age)。这会导致冲突。我们需要修改参数名称以避免冲突。
3. 在程序的主程序中,你使用了错误的语法来调用`new`和`getinfo`成员函数。正确的方式是使用`%`运算符来调用成员函数。
下面是修正后的代码:
```fortran
module mymodule
type, public :: person
character(len = 32) :: name
integer :: age
contains
procedure :: initialize
procedure :: getinfo
end type person
contains
subroutine initialize(this, n, a)
class(person), intent(inout) :: this
character(len = *), intent(in) :: n
integer, intent(in) :: a
this%name = n
this%age = a
end subroutine initialize
subroutine getinfo(this)
class(person), intent(in) :: this
print "(A, A)", "name: ", this%name
print "(A, I3)", "age: ", this%age
end subroutine getinfo
end module mymodule
program test
use mymodule
type(person) :: p1
call p1%initialize("HFM", 12)
call p1%getinfo()
end program test
```
在修正后的代码中,我们移除了`private`关键字,修改了`subroutine new`的参数名称,用`initialize`替代,并使用了正确的语法来调用成员函数。
阅读全文