gpt4 book ai didi

fortran - 创建数组时 Fortran 中的意外数据声明错误

转载 作者:行者123 更新时间:2023-12-01 10:03:16 25 4
gpt4 key购买 nike

我编写了一个简单的测试程序来演示在编译某些 Fortran 代码时我收到的数据声明错误。编译错误发生在我试图创建任意大小数组的一行上。在 C 代码中,我相信这可以通过简单的 malloc 来完成,但这种方法在 Fortran 中可能没有用。

这里出了什么问题,我该如何解决?我在 GNU/Linux 上使用 gfortran 编译器,所以我认为可以使用所有支持的语言功能。

这是我的测试程序:

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

最佳答案

问题是,因为您在普通语句之后放置了数据声明语句。

您不必使用用户定义的动态分配,所谓的自动分配就足够了。 (它也适用于 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。

请注意,我没有检查其他错误。

作为一个完全不同的问题,我建议您对所有子例程使用模块。在这种简单的情况下,也可以使用一个内部子程序。这样您就有了一个显式接口(interface),您可以检查调用的一致性并使用更高级的功能。

关于fortran - 创建数组时 Fortran 中的意外数据声明错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13630254/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com