【问题标题】:Extract integers from string in Fortran在 Fortran 中从字符串中提取整数
【发布时间】:2014-01-26 22:35:41
【问题描述】:

我正在使用 Fortran 90。我有一个声明为 CHARACTER(20) :: Folds 的字符串,它的值是从一个类似于 x:y:z 的命令行参数分配的,其中 x、y 和 z 都是整数。然后我需要从该字符串中挑选出数字并将它们分配给适当的变量。这就是我尝试这样做的方式:

 i=1
 do j=1, LEN_TRIM(folds)
    temp_fold=''
    if (folds(j).neqv.':') then
        temp_fold(j)=folds(j)
    elseif (i.eq.1) then
        read(temp_fold,*) FoldX    
        i=i+1
    elseif (i.eq.2) then
        read(temp_fold,*) FoldY 
        i=i+1
    else
        read(temp_fold,*) FoldZ 
    endif
 enddo

编译时出现错误:

unfolder.f90(222):错误 #6410:此名称尚未声明为数组或函数。 [折叠]

[stud2@feynman vec2ascii]$ if (folds(j).neqv.':') 然后 意外标记“j”附近的语法错误 [stud2@feynman vec2ascii]$ --------^

unfolder.f90(223):错误 #6410:此名称尚未声明为数组或函数。 [TEMP_FOLD]

[stud2@feynman vec2ascii]$ temp_fold(j)=folds(j)

意外标记“j”附近的语法错误

如何提取这些数字?

【问题讨论】:

  • 我可以建议您使编译器输出更清晰,以造福后代吗?我本来可以试一试的,但最好做到完全正确。

标签: arrays string integer fortran


【解决方案1】:

您可以使用index 内在函数来定位字符串中第一个冒号的位置,例如i。然后使用内部读取从前面的子字符串read (string (1:i-1), *) x 中读取整数x。然后将此过程应用于以i+1 开始的子字符串以获得y。重复z

附:您的错误消息来自 bash 而不是 Fortran 编译器?

【讨论】:

  • 它们来自 fortran 编译器,当我复制到剪贴板时,它在其中插入了 bash。
【解决方案2】:

folds 是一个字符变量,要访问子字符串需要(.:.)。即访问索引为j的单个字符:folds(j:j)

没有这个,编译器认为folds 必须是一个数组(它不是)或一个函数(这不是你想要的)。这是什么意思:

此名称尚未声明为数组或函数。

但就解决您的问题而言,我赞同@M.S.B. 给出的答案。因为它更优雅。此外,在循环原样的情况下(foldstemp_fold 中的(j:j) 更正),您依赖于每个x、y 和z 是个位数整数。这个其他答案更笼统。

【讨论】:

  • 谢谢,如果我使用 (j:j) 那么我的方法有效。我喜欢 MSB 的方法,除了那些 if 和循环。
猜你喜欢
  • 2020-07-20
  • 2019-09-14
  • 1970-01-01
  • 1970-01-01
  • 2018-10-08
  • 2020-07-06
  • 2013-03-09
相关资源
最近更新 更多