3

Fortran コードのコンパイル時に発生するデータ宣言エラーを示す簡単なテスト プログラムを作成しました。コンパイル エラーは、任意のサイズの配列を作成しようとしている行で発生します。C コードでは、これは単純なmallocで実現できると思いますが、このタイプの方法論は Fortran では役に立たないかもしれません。

ここで何が問題になっていますか?どうすれば修正できますか? gfortranでコンパイラを使用しているGNU/Linuxので、サポートされている言語機能はすべて使用できると思います。

ここに私のテストプログラムがあります:

program test
implicit none
    integer num1, num2

    print *, 'Starting...'
    num1 = 10
    num2 = 11
    call sub(num1, num2)
    print *, 'Done.'

end program



subroutine sub(num1, num2)
    integer num1, num2
    integer num3

    num3 = num1 + num2 - 1
    integer A(num3)

    do i = 1,num3
        A(i) = i
    end do

    print *, 'Now printing out vector'

    do i = 1,num3
        print *, A(i)
    end do
end subroutine

cmake簡単なテスト プログラムをコンパイルするために使用するスクリプトを次に示します。

cmake_minimum_required (VERSION 2.6)
project (test Fortran)

add_executable( test
test.f90
) # end

このプログラムをコンパイルすると、次のエラーが表示されます。

/media/RESEARCH/SAS2-version2/test-Q-filter/test-Fcreation/test.f90:20.16:

 integer A(num3)
                1
Error: Unexpected data declaration statement at (1)
/media/RESEARCH/SAS2-version2/test-Q-filter/test-Fcreation/test.f90:23.10:

  A(i) = i
          1
Error: Unexpected STATEMENT FUNCTION statement at (1)
make[2]: *** [CMakeFiles/test.dir/test.f90.o] Error 1
make[1]: *** [CMakeFiles/test.dir/all] Error 2
make: *** [all] Error 2
4

1 に答える 1

7

問題は、通常のステートメントの後にデータ宣言ステートメントを配置したためです。

ユーザー定義の動的割り当てを使用する必要はありません。いわゆる自動割り当てで十分です。(C99 AFAIKでも機能しますが、スタック割り当てに対してのみ機能します)。交換するだけ

num3 = num1 + num2 - 1
integer A(num3)

integer A(num1 + num2 - 1)
integer num3

num3 = num1 + num2 - 1

残念ながら、あなたはただ書くことはできません

integer :: num3 = num1 + num2 - 1

変数は暗黙的SAVEに指定され、num1とnum2はコンパイル時に認識されている必要があるためです。

他のエラーをチェックしなかったことに注意してください。

まったく別の問題として、すべてのサブルーチンにmudulesを使用することをお勧めします。この単純なケースでは、内部サブルーチンも実行します。その場合、明示的なインターフェイスがあり、呼び出しの整合性をチェックして、より高度な機能を使用できます。

于 2012-11-29T16:56:09.807 に答える