是否在变量声明之间初始化一个变量forbidden?

时间:2016-05-09 15:41:55

标签: fortran

我有类似

的东西
integer a
integer b 
b = 0
integer c

a = 0
c = 0

不适用于错误

  

"规范声明不能出现在可执行部分中。"

但是,将其更改为

integer a
integer b
integer c

a = 0
b = 0
c = 0 

作品。

3 个答案:

答案 0 :(得分:4)

是的,Fortran禁止这样做。这在Fortran 2008 Standard,Cl。中定义。 2.3.2“声明顺序”:

  

enter image description here

     

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