我有类似
的东西integer a
integer b
b = 0
integer c
a = 0
c = 0
不适用于错误
"规范声明不能出现在可执行部分中。"
但是,将其更改为
integer a
integer b
integer c
a = 0
b = 0
c = 0
作品。
答案 0 :(得分:4)
是的,Fortran禁止这样做。这在Fortran 2008 Standard,Cl。中定义。 2.3.2“声明顺序”:
1第2.1节的语法规则指定程序单元和子程序中的语句顺序。这些规则 如表2.1所示[...]。表2.1显示了语句的排序规则并适用于 所有程序单元,子程序和接口主体。垂直线描绘了可能的各种陈述 穿插和水平线描绘出各种不应散布的陈述。 [...] USE和CONTAINS之间的声明 子程序,不可执行语句通常在可执行语句之前 [...]
(强调我的)
[稍微偏离主题,但相关]请注意,而
integer :: a
integer :: b = 0
integer :: c
是允许的,这会产生b
获取save
属性的副作用。这通常不是你想要的......
答案 1 :(得分:2)
错误信息非常清楚。 Fortran程序和子程序分为两部分。首先是规范部分,您使用模块,定义变量,派生类型,接口......然后是可执行部分,您可以在其中放置实际的可执行语句或控制结构。
无法混合它们。
答案 2 :(得分:0)
在2008年的情况下,BLOCK构造的情况更加模糊。该构造必然位于可执行语句之间,但通常仅用于添加在可执行语句之后放置一些规范语句的功能,例如当假定长度指针指向匿名存储器时。
编辑:示例
module anonymous
use ISO_C_BINDING
implicit none
interface
function malloc(size) bind(C,name='malloc')
import
implicit none
type(C_PTR) malloc
integer(C_SIZE_T), value :: size
end function malloc
subroutine free(ptr) bind(C,name='free')
import
implicit none
type(C_PTR), value :: ptr
end subroutine free
function strlen(str) bind(C,name='strlen')
import
implicit none
type(C_PTR), value :: str
integer(C_SIZE_T) strlen
end function strlen
end interface
contains
function hello()
type(C_PTR) hello
character(LEN=*,KIND=C_CHAR), parameter :: world = &
'Hello, world'//C_NULL_CHAR
character(LEN=len(world),KIND=kind(world)), pointer :: fptr
hello = malloc(len(world,KIND=C_SIZE_T))
call C_F_POINTER(hello,fptr)
fptr = world
end function hello
end module anonymous
program test
use anonymous
implicit none
type(C_PTR) cptr
character(LEN=:,KIND=C_CHAR), pointer :: fptr
integer(C_SIZE_T) hello_len
cptr = hello()
hello_len = strlen(cptr)
BLOCK
character(LEN=hello_len,KIND=C_CHAR), pointer :: temp
call C_F_POINTER(cptr,temp)
fptr => temp
end BLOCK
write(*,'(*(g0))') fptr(1:strlen(cptr))
end program test