Fortran 什么是';iunit';在此函数中未初始化使用[-Wuninitialized]

Fortran 什么是';iunit';在此函数中未初始化使用[-Wuninitialized],fortran,gfortran,dex,geany,Fortran,Gfortran,Dex,Geany,我正在使用: open(iunit,file=dexfile,status='old',iostat=status) if(status /= 0)then write(*,*) 'Unable to open dex file' endif 在Geany中,但得到以下错误: Warning: 'iunit' is used uninitialized in this function [-Wuninitialized] 声明iunit如下内容: integer,

我正在使用:

  open(iunit,file=dexfile,status='old',iostat=status)
   if(status /= 0)then
     write(*,*) 'Unable to open dex file'
   endif
在Geany中,但得到以下错误:

Warning: 'iunit' is used uninitialized in this function [-Wuninitialized]

声明
iunit
如下内容:

integer, parameter      :: iunit = 11

它不必带有
参数,但我通常会这样做,因为它在执行过程中不必更改,而且如果我有多个打开的文件,它就不太容易出错,因为它无法更改。

如果您的编译器有此选项,您可以使用功能
open
中的
newunit
命令,在打开时将标志返回到可用的单元ID:

open(newunit=iunit,file=dexfile,status=old,iostat=status)

在这种情况下,
open
命令将返回值
iunit
,作为该调用的输出,而不是输入

否则,您可以编写一个代码段来为您实现这一点,例如:

! Find a logical unit which is not currently in use
integer function first_available_unit() result(iunit)
   logical :: is_open
   
   do iunit=10,999 ! Skip units 1-10 as they're sometimes system reserved
      inquire(unit=iunit,opened=is_open)
      if (.not.is_open) return
   end do
end function first_available_unit
然后运行:

   iunit = first_available_unit()
   open(unit=iunit,file=dexfile,status='old',iostat=status)

在Fortran程序的生命周期中,有时必须引用/知道变量的值:必须定义变量。从编译器得到的警告消息是,它报告它确信您没有给出
iunit
值。一般来说,在引用变量之前检查您是否定义了所有变量是很重要的,但是当编译器可以检查时,它可能会这样报告

在这种情况下,必须定义iunit
,因为它的值用作文件连接的单位。一旦我们知道了警告的含义,我们就有两个答案,建议纠正已识别问题的方法:

  • 确保检查您是否已给定值(并检查变量名中是否存在键入错误,例如使用
    隐式无

  • 使用
    newunit=iunit
    而不是
    [unit=]iunit
    :这里不需要指定值,因为编译器为您选择了合适的值


您可以共享变量的定义吗?
iunit
应该是一个整数,并在
open
语句之前给定一个值。甚至可能是一个
参数
,您真的应该显示更多的代码。见和。您显示的代码不足以再现错误。应该声明所有变量,并使用
隐式none
。虽然代码片段不完整,但我们仍然可以解释错误消息的含义。我们无法回答更正应该是什么,或者编译器的评估是否正确,但这仍然是一个有效的问题。值不必是常量。它的值必须定义。不要定义值小于10的单位,因为这些单位可以/被系统用于例如stdout/stderr等。