我试图编译以下用fortran编写的代码,但有很多错误

我试图编译以下用fortran编写的代码,但有很多错误,fortran,gfortran,Fortran,Gfortran,我试图在gfortran编译器中编译以下代码: do_cmd = .not. is_group do while (.not. EOF(unit=100) .and. .not. flag_stop) read (100, '(A)', iostat = ios) buf if (buf(1:1)=="#") then ! comment line elseif ((buf(1:2)=="v ") .and. do_cmd) then

我试图在gfortran编译器中编译以下代码:

    do_cmd       = .not. is_group
do while (.not. EOF(unit=100) .and. .not. flag_stop)
    read (100, '(A)', iostat = ios) buf
    if (buf(1:1)=="#") then
        ! comment line
    elseif ((buf(1:2)=="v ") .and. do_cmd) then ! vertex
        read(buf(2:), *, iostat=ios) p(1), p(2), p(3)
        if (ios.ne.0) then
            print "(/,2x,'Error of reading vertex position from obj-file (line #'(I3)');')", line_index
            stop
        end if
但我在编译代码时遇到以下错误:

      do while (.not. EOF(unit=100) .and. .not. flag_stop)
                              1
      Error: Keyword argument requires explicit interface for procedure ‘eof’ at (1)

如果有人能帮助我,我将不胜感激

编辑: 我对fortran非常陌生,无法了解eof函数在gfortran中是如何工作的

在参数中使用单位=100意味着什么?
并且认为默认情况下它是一个逻辑函数。我应该如何隐式表示它的类型?

据我所知,
EOF
不是Fortran标准的一部分。至少我哪儿都找不到

在大多数编程语言中,EOF代表“文件结束”,我很清楚,在您的示例中,
EOF
应该是一个逻辑函数,返回
.TRUE。
当且仅当读取指针与
单元关联时(在您的示例中,
100
)指向文件的末尾

您可以使用
ios
变量检查读取过程中是否遇到EOF。在这种情况下,它将是
-1
。然后可以使用
exit
语句立即退出循环

如果您不喜欢
-1
,并且使用与Fortran 2003兼容的编译器,您甚至可以使用模块
ISO\u Fortran\u ENV
,该模块提供了参数
IOSTAT\u END

下面是一个非常简单的示例:

程序iso
使用ISO_FORTRAN_ENV
隐式无
整数,参数::u=100
字符(len=80)::buf
整数::ios
打开(单位=u,操作=READ',状态=OLD',文件=data.dat')
读循环:做什么
读取(u),(A)”,iostat=ios)buf
如果(ios==IOSTAT\u END)退出read\u循环!EOF
如果(buf(1:1)='#')循环读取循环!这一行是评论
写入(*,*)buf
结束读循环
关闭(u)
结束程序iso

不过需要注意的是:这段代码只是一个示例。只有当遇到EOF时,它才会退出循环——如果
读取因任何其他原因失败,则不会退出循环。(还有一些其他原因导致读取失败。)如果其他错误持续存在,则这将导致无限循环。

尝试用户定义的
EOF
函数(如下所示)以最小化代码修改量可能是有用的;但是因为这个函数效率很低,我想最好重写原始代码,以便直接使用
read
语句中的
iostat
(如上所述)


模块eofmod@VladimirF感谢您的有用链接。我编辑了我的问题并问了主要目的。如果你能这样帮助我,我将不胜感激。谢谢。
eof
没有隐式类型表明,这是为另一个编译器编写的代码,该编译器将其作为非标准的内在类型支持。[或者说这是一段大量的破译代码,但我还是第一个。]您可能想确定它的用途,然后看看如何在标准Fortran(或者至少是Fortran+gfortran扩展)中实现其功能。它似乎是DEC/Compaq/Intel和HP的扩展。必须重写代码才能使用
iostat=
end=
说明符。我提供的链接解释了为什么关键字参数需要显式接口。但是,您首先可能没有任何
eof()
函数,因此您不能像我建议的那样将其放在模块中。那是你自己的密码吗?不是。我必须把它用于我的项目。并发现它!但它是monster Toolbox的一部分,正如我之前所评论的,它是Intel Fortran和其他一些编译器的固有部分。我猜这段代码在iPort中。但是我找不到用于Unix的iPort编译器。你知道我怎么处理这个工具箱吗?@M.F.哪个Unix?如果Linux足够的话,我不明白你怎么找不到它,我不是说Linux。我的系统是Mac OSX Yosemite@Vladmir F.@VladimirF你知道如何获得一个一年后不会过期的英特尔Fortran编译器(合法)免费版本吗?很高兴使用旧版本。我想我曾经有过一个版本,但是我再也找不到了。
     do while (.not. EOF(unit=100) .and. .not. flag_stop)
                   1
     Error: Function ‘eof’ at (1) has no IMPLICIT type
module eofmod    !<-- please save this in a separate file, compile, and link with other programs
implicit none
contains

logical function EOF( unit )
    integer, optional :: unit
    integer :: ios

    if ( .not. present( unit ) ) stop "no unit given"
    read( unit, *, iostat=ios )
    if ( ios == -1 ) then
        EOF = .true.
    else
        EOF = .false. ; backspace( unit )
    endif
end function

end module

program test
    use eofmod   !<-- needs to be inserted at the top of routines (or modules) where "EOF" is used
    implicit none
    character(200) :: buf

    open(10, file="test.dat", status="old")
    do while ( .not. EOF( unit=10 ) )
        read( 10, "(a)" ) buf
        print "(a)", trim( buf )
    enddo
    close(10)
end program