Rai*_*ohn 3 string fortran string-formatting subdirectory fortran90
我使用 Fortran 90 和 gfortran 编译器作为 cygwin 的一部分。我想编写一个函数,该函数将在一个目录中创建一系列新文件夹,该目录也作为参数传递,并附带一个数字,该数字是新的连续编号文件夹的最大数量。由于我必须声明字符(即字符串)的长度,但也希望普遍能够传递不同的路径,因此我尝试将修剪后的字符串传递给函数。
program main
implicit none
character(len = 6) :: newdir
character(len = 27) :: path
newdir = "neu1A"
path = "c:/users/i/desktop/rainer"
print*,len_trim(path) !Outputs the correct length of 25
print*,len_trim(newdir) !Outputs the correct length of 5
call newdirec(trim(newdir),trim(path),5)
end program main
Run Code Online (Sandbox Code Playgroud)
但由于我必须在函数中重新声明参数,因此它们的长度在此过程中被覆盖/丢失。如何使用正确的字符串长度并保持函数的通用性?我必须使用长度,因为构建调用系统来创建目录的字符串需要格式化字符串。我使用 Fortran 90,因此一些选项不可用。
function newdirec(newdir,path, foldnum)
character (len = 27) :: path
character (len = 50) :: newdir
character (len = (len_trim(path) + len_trim(newdir))) :: newpath
character (len = 100) :: format_string, newdir_len_str, makedir
integer :: foldnum
newpath = trim(path)//"/"//trim(newdir)
print*,len_trim(newpath) !Outputs the 'wrong' but declared length of 77
write(newdir_len_str, "(I2)") len_trim(newpath)
do i = 1, foldnum
if (i < 10) then
format_string = "(A"//trim(newdir_len_str)//",I1)"
elseif (i < 100) then
format_string = "(A"//trim(newdir_len_str)//",I2)"
else
format_string = "(A"//trim(newdir_len_str)//",I3)"
endif
write (makedir, format_string) "mkdir "//trim(newpath),i
!call system(trim(makedir))
print *, trim(makedir)
end do
return
end function newdirec
Run Code Online (Sandbox Code Playgroud)
正如弗拉基米尔(Vladimir)建议的那样,声明子例程或函数的字符参数的正常方法是:
function newdirec(newdir,path, foldnum)
character (*) :: newdir,path
...
Run Code Online (Sandbox Code Playgroud)
在这种情况下,内部函数 LEN 允许您获取从调用过程继承的字符串的大小。
我认为绝对没有充分的理由以 27 或 50 这样的固定长度来声明它们......除非您确实在不久的将来寻找麻烦,例如当您将更改调用过程中的声明时:长度不匹配通常会导致一个难以理解的奇怪的致命错误。
| 归档时间: |
|
| 查看次数: |
3663 次 |
| 最近记录: |