1

更新:私の変更されたコードは次のようになります:

program run_module_test
    use module_test
    implicit none   

    TYPE(newXYZ), allocatable, intent(inout) :: xyzArray(:)

    call update(xyzArray)
    write(6,*)'xyzArray',xyzArray

end program run_module_test

module module_test
    implicit none

    TYPE :: newXYZ
        real(4) :: x, u
        real(4) :: y, v
        real(4) :: z, w
        real(4),dimension(3) :: uvw     
    END TYPE

    integer(4) :: shape = 3

contains

    subroutine update(xyzArray)

    integer(4) :: i
    TYPE(newXYZ), allocatable, intent(inout) :: xyzArray(:)
    allocate( xyzArray(shape) ) 

    do i = 1, shape
        xyzArray(i)%x = 0
        xyzArray(i)%y = 0
        xyzArray(i)%z = 0
        xyzArray(i)%u = 0
        xyzArray(i)%v = 0
        xyzArray(i)%w = 0
        xyzArray(i)%uvw = (/0,0,0/)
    end do
    return
    end subroutine update

end module module_test

それらがコンパイルされると、同様のエラーが生成されます。

 TYPE(newXYZ), allocatable, intent(inout) :: xyzArray(:)
                                                    1
Error: ALLOCATABLE attribute conflicts with DUMMY attribute at (1)

update()サブルーチンで引数を削除すると、矛盾するエラーが発生します。

TYPE(newXYZ), allocatable, intent(inout) :: xyzArray(:)
                                                       1
Error: Symbol at (1) is not a DUMMY variable

役立つ提案で指摘されたエラーの原因を排除しましたか?これはコンパイラ関連のエラー(mpi90を使用)でしょうか?

~~~最初の編集~~~入力引数がユーザー定義型XYZの配列であるサブルーチンがあります。xyzArrayの割り当てを解除し、サブルーチンの本体で別のサイズに割り当て/変更したいと思います。fortranで配列の次元を変更することで提案された方法を試しましたが、次のようにすると次のようになります。

subroutine update(xyzArray, ...)
...
TYPE (XYZ), allocatable :: xyzArray(:)

エラーメッセージが表示されます:

Error: ALLOCATABLE attribute conflicts with DUMMY attribute at (1)

私が試してみると:

subroutine update(xyzArray, ...)
...
deallocate( xyzArray(myshape) )
allocate( xyzArray(newshape) )

エラーメッセージが表示されます:

Error: Expression in DEALLOCATE statement at (1) must be ALLOCATABLE or a POINTER
Error: Expression in ALLOCATE statement at (1) must be ALLOCATABLE or a POINTER

サブルーチン内の配列のサイズを変更するにはどうすればよいですか?

4

2 に答える 2

6

これをする:

  • 仮引数は割り当て可能でなければなりません。割り当て可能な仮引数には、Fortran 2003 標準の関連部分を実装するコンパイラ (または、いわゆる「割り当て可能な」TR を実装する Fortran 95 コンパイラ) が必要です。

  • プロシージャへの明示的なインターフェイスが必要です (プロシージャは、モジュール プロシージャ、内部プロシージャ、または呼び出しスコープ内にインターフェイス ブロックを持っている必要があります)。

  • 仮引数は、intent(in) であってはなりません。サブルーチンで仮引数の値の割り当てステータスまたはその他の側面をまったく使用していない場合は、intent(out) が適切な場合があります (事前に割り当てられている場合、仮引数はプロシージャが呼び出されたときに自動的に割り当て解除されます)。インテント (inout) またはインテントなし。

(コード例の 2 番目のブロックには、deallocate ステートメントに構文エラーがあります。形状の指定を省略xyzArrayして、変数を指定するだけで済みます))(myshape)

たとえば、モジュールでは次のようになります。

subroutine update(xyzArray)
  type(xyz), allocatable, intent(inout) :: xyzArray(:)
  ...
  if (allocated(xyzArray)) deallocate(xyzArray)
  allocate(xyzArray(newshape))
  ...
于 2012-12-10T22:52:21.993 に答える
3

確実にサブルーチンで配列の割り当てを解除したい場合は、サブルーチンに入ったときに自動的に割り当てが解除されるように、仮引数がインテント (アウト) であることを宣言できます。

module whatever
  implicit none

  type :: xyz
    :
  end type xyz

  contains

    subroutine update(xyzArray)
      type(xyz), allocatable, intent(out) :: xyzArray(:)
      :
      allocate(xyzArray(someshape))
      :
    end subroutine update

  end module whatever

すでにIanHで指摘されているように、プロセスには明示的なインターフェイス (モジュールに囲まれているなど) が必要であり、呼び出し元プログラムでは、実際の引数を割り当て可能であると宣言する必要があります。

program test
  use whatever
  implicit none

  type(xyz), allocatable :: array(:)
  :
  call update(array)
  :
end program test
于 2012-12-11T10:15:01.513 に答える