我正在使用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:此名称尚未声明为数组或函数。 [FOLDS]
[stud2 @feynman vec2ascii] $ if(folds(j).neqv。':')then 意外令牌`j'附近的语法错误 [stud2 @ feynman vec2ascii] $ -------- ^
unfolder.f90(223):错误#6410:此名称尚未声明为数组或函数。 [TEMP_FOLD]
[stud2 @ feynman vec2ascii] $ temp_fold(j)= folds(j)
意外标记“j”
附近的语法错误如何提取这些数字?
答案 0 :(得分:2)
您可以使用index
内在函数来定位第一个冒号的字符串中的位置,例如i
。然后使用内部读取从前面的子字符串中读取整数x
:read (string (1:i-1), *) x
。然后将此过程应用于从i+1
开始的子字符串以获取y
。重复z
。
P.S。您的错误消息来自bash而不是Fortran编译器吗?
答案 1 :(得分:1)
使用folds
字符变量,要访问子字符串,需要(.:.)
。也就是说,要访问索引为j
的单个字符:folds(j:j)
。
如果没有这个,编译器认为folds
必须是一个数组(它不是)或一个函数(不是你想要的)。这就是:
此名称尚未声明为数组或函数。
但就解决你的问题而言,我是@ M.S.B给出的答案。因为它更优雅。此外,循环原样((j:j)
和folds
中的temp_fold
更正),您依赖于每个x,y和z是单个数字整数。这个答案更为笼统。