创建数组时Fortran中出现意外的数据声明错误

时间:2012-11-29 16:29:12

标签: fortran

我编写了一个简单的测试程序来演示编译某些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

1 个答案:

答案 0 :(得分: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。在这个简单的情况下,也可以使用内部子程序。您有一个明确的界面,您可以检查您的通话的一致性并使用更高级的功能。