我试图编译以下用fortran编写的代码,但有很多错误
我试图在gfortran编译器中编译以下代码:我试图编译以下用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
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