我希望更改 Fortran 90 代码中的工作目录。是否可以以非特定于编译器的方式执行此操作?这是我的代码:
program change_directory
integer :: ierr
call system("mkdir -p myfolder/")
!call system("cd myfolder/") !doesn't work
ierr = chdir("myfolder")
if (ierr.NE.0) then
write(*,'(A)') "warning: change of directory unsuccessful"
end if
open(unit=33,file="myfile.txt",iostat=ierr)
if (ierr.EQ.0) then
write(unit=33,fmt='(A)') "Test message"
close(unit=33)
end if
end program change_directory
显然,使用cd myfolder/
在系统调用中不起作用。这英特尔参考 https://software.intel.com/en-us/node/511525说我需要添加'use ifport
'。文中没有这样的提及海湾合作委员会参考 https://gcc.gnu.org/onlinedocs/gcc-4.4.0/gfortran/CHDIR.html, 尽管。离开了 'use ifport
',我可以在下面编译上面的代码ifort
没有任何麻烦。然而,当我把它放进去时,它不会用 gcc 编译(因为 gcc 没有ifport
模块)——不仅如此,它也无法在 Intel Fortran 下编译——我收到以下错误:
$ ifort change_dir.f90 -o change_dir
change_dir.f90(5): error #6552: The CALL statement is invoking a function subprogram as a subroutine. [SYSTEM]
call system("mkdir -p myfolder/")
---------^
compilation aborted for change_dir.f90 (code 1)
所以我的问题如下:有没有更好的方法来做到这一点?我想让我的代码尽可能独立于编译器。目前,我主要使用 gfortran/ifort 和 mpif90/mpiifort。
也可以看看有没有办法用C语言改变目录? https://stackoverflow.com/questions/1293660/is-there-any-way-to-change-directory-using-c-language。您可以制作自己的接口chdir()
POSIX 调用 http://linux.die.net/man/3/chdir独立于Intel的接口。在 Windows 上也是类似的。
module chdir_mod
implicit none
interface
integer function c_chdir(path) bind(C,name="chdir")
use iso_c_binding
character(kind=c_char) :: path(*)
end function
end interface
contains
subroutine chdir(path, err)
use iso_c_binding
character(*) :: path
integer, optional, intent(out) :: err
integer :: loc_err
loc_err = c_chdir(path//c_null_char)
if (present(err)) err = loc_err
end subroutine
end module chdir_mod
program test
use chdir_mod
call chdir("/")
call system("ls -l")
end
当运行时
> gfortran chdir.f90
> ./a.out
celkem 120
drwxr-xr-x 2 root root 4096 15. říj 14.42 bin
drwxr-xr-x 5 root root 4096 15. říj 14.43 boot
...
On ifort
它也像它一样工作sunf90
.
(注意:这依赖于默认character
与c_char
。这是一个相当安全的假设。如果不是这种情况,编译器会抱怨并且必须进行转换。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)