String 在Fortran中将不同长度的字符串传递给函数

String 在Fortran中将不同长度的字符串传递给函数,string,fortran,string-formatting,fortran90,subdirectory,String,Fortran,String Formatting,Fortran90,Subdirectory,作为cygwin的一部分,我将Fortran 90与gfortran编译器一起使用。 我想写一个函数,它将创建一系列新文件夹到一个目录中,该目录也作为参数传递,同时传递一个数字,该数字是新的连续编号文件夹的最大数量。由于我必须声明字符(即字符串)的长度,但也希望能够传递不同的路径,因此我尝试将修剪后的字符串传递给函数 program main implicit none character(len = 6) :: newdir character(len = 27) :

作为cygwin的一部分,我将Fortran 90与gfortran编译器一起使用。 我想写一个函数,它将创建一系列新文件夹到一个目录中,该目录也作为参数传递,同时传递一个数字,该数字是新的连续编号文件夹的最大数量。由于我必须声明字符(即字符串)的长度,但也希望能够传递不同的路径,因此我尝试将修剪后的字符串传递给函数

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
但由于我必须在函数中新声明参数,因此在这个过程中,它们的长度被覆盖/丢失。如何使用正确长度的字符串并保持函数的通用性?我必须使用长度,因为构建调用系统来创建目录的字符串需要格式化字符串。我使用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
函数newdirec(newdir,path,foldnum) 字符(len=27)::路径 字符(len=50)::newdir 字符(len=(len_trim(path)+len_trim(newdir))::newpath 字符(len=100):格式为字符串、newdir、len、makedir 整数::foldnum newpath=trim(路径)//“//”trim(newdir) 打印*,透镜修剪(新路径)!输出“错误”,但声明的长度为77 写入(newdir_len_str,“(I2)”)len_trim(newpath) i=1,foldnum吗 如果(i<10),则 format_string=“(A”//trim(newdir_len_str)/”,I1) elseif(i<100)那么 format_string=“(A”//trim(newdir_len_str)/”,I2) 其他的 格式字符串=“(A”//trim(newdir\u len\u str)/”,I3) 恩迪夫 写入(makedir,格式为字符串)“mkdir”//trim(newpath),i !呼叫系统(trim(makedir)) 打印*,修剪(makedir) 结束 返回 端函数newdirec
正如Vladimir所建议的,声明子例程或函数的字符参数的正常方法是:

 function newdirec(newdir,path, foldnum)
    character (*) :: newdir,path
    ...
在这种情况下,内在函数LEN允许您获取从调用过程继承的字符串的大小


我认为绝对没有理由用27或50这样的固定长度来声明它们。。。除非您在不久的将来真的会遇到麻烦,例如,当您将在调用过程中更改声明时:长度不匹配通常会导致难以理解的奇怪致命错误。

多亏了Vladimir、Albert和Francois,我按照建议解决了我的问题:

subroutine newdirect(newdir, path, foldnum)

    character(*) :: path, newdir
    character (len = 1024) :: newpath, format_string, newdir_len_str, makedir
    integer :: foldnum

    newpath = trim(path) // "/" // trim(newdir)
    write(newdir_len_str, "(I3.3)") len_trim(newpath) + 6 ! +6 because of "mkdir "
    do i = 1, foldnum
        format_string = "(A" // trim(newdir_len_str) // ",I3.3)" !I3.3: Format for three-digit
        write (makedir, format_string) "mkdir " // trim(newpath), i
        call system(trim(makedir))
        print *, trim(makedir)
    end do
    return
end subroutine newdirect

欢迎请学习如何正确格式化您的文章,并使用所有Fortran问题的标签。请注意,该语言是Fortran,Fortran 90只是一个旧版本(30年后)。您真的需要严格遵守Fortran 90的代码吗?没有Fortran 9编译器,所有编译器至少都是Fortran 95,大多数都完全或几乎完全兼容Fortran 2003或2008。我不明白你为什么把东西弄得这么复杂。为什么不能只使用
字符(*)
?注意:我认为新路径的长度应该是len_trim(path)+len_trim(newdir)+1,考虑接受解决问题的答案。如果答案是问题的解决方案,那么这个网站就是这样工作的。