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

标签 string fortran string-formatting fortran90 subdirectory

我正在使用 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

但由于我必须在函数中重新声明参数,因此它们的长度会在此过程中被覆盖/丢失。如何使用正确长度的字符串并保持功能普遍可用?由于构建调用系统以创建目录的字符串所需的格式化字符串,我必须使用长度。我使用 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

最佳答案

正如 Vladimir 所建议的,声明子例程或函数的字符参数的正常方法是:

 function newdirec(newdir,path, foldnum)
    character (*) :: newdir,path
    ...

在那种情况下,内部函数 LEN 允许您获取从调用过程继承的字符串的大小。

我完全没有理由用 27 或 50 之类的固定长度来声明它们......除非你真的在不久的将来寻找麻烦,例如当你将更改调用过程中的声明时:一个长度不匹配通常会导致难以理解的奇怪的 fatal error 。

关于string - 将不同长度的字符串传递给 Fortran 中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48816383/

相关文章:

python - 为什么在 Python 中将变量插入字符串时使用元组?

c# - 在最后一个字符前插入一个点

javascript - 如何在 Javascript 字符串中的温度中添加度数符号?

c# - 使用 Regex 检查字符串的格式是否与所需的格式匹配

c - 如何在 Fortran 中调用 C 函数并正确传递 uint32_t 参数

不同模块上的 Fortran 扩展类型

c++ - 从 C++ 调用带有可选参数的 Fortran 子例程

objective-c - iOS 是否有任何支持格式化数字的库,例如 Mac OSX 的 NSNumberFormatter?

c# - 你将如何在 C# 中创建表达式解析器?

java - 如何从字符串中获取特定的摘录?