声明返回列表的Fortran函数时遇到问题

时间:2018-10-15 20:18:37

标签: fortran gfortran

INTEGER FUNCTION NUMTOLIST(NUM) RESULT(LI)
IMPLICIT NONE
! FUNCTION TO CONVERT NUMBERS INTO ARRAYS OF NUMBERS, BY DIGIT

! PROBLEM 1: X IS NOT BEING PASSED

INTEGER :: NUM
INTEGER :: I,J
INTEGER :: LI(0:5) ! G95 COMPILER SAYS THAT 'LI ALREADY HAS BASIC TYPE INTEGER', DOESN'T RECOGNISE AS ARRAY
PRINT *,'NUM: ',NUM ! DEBUGGING LINE, CONFIRMS THAT X IS NOT BEING PASSED INTO THE FUNCTION
DO I = 0,5
  J = 0
  DO WHILE (J*10**(5-I)<=NUM)
    J = J+1
  END DO
  J = J-1
  LI(I) = J
  NUM = NUM-(J*10**(5-I))
END DO

PRINT *,'LI: ',LI ! DEBUGGING LINE, SHOWS THAT FUNCTION IS AS IS SUPPOSED TO, EXCEPT FOR ON SOME SORT OF DEFAULT INTEGER

RETURN

END FUNCTION NUMTOLIST

PROGRAM NUMTOLISTTEST
IMPLICIT NONE
INTEGER FUNCTION, NUMTOLIST
INTEGER :: X
INTEGER :: F(1:6)
READ *,X
PRINT *,X
F = NUMTOLIST(X)
! PROBLEM 2: THE RESULT OF NUMTOLIST SHOULD BE A LIST, BUT F IS JUST BEING ASSIGNED NUM, NOT THE OUTPUT OF NUMTOLIST
PRINT *,F
READ *,X


END PROGRAM NUMTOLISTTEST

这是我的完整代码。顾名思义,这是对较大代码功能的测试。有几个问题,但是最紧迫的问题是由于某种原因未将变量传递给函数。我使用的是silverfrost编译器,由于某种原因,尽管函数本身的所有功能都可以正常工作,但它既没有输入也没有正确返回。输入本身完全被忽略,导致num未定义,并且返回值也未作为列表类型读取,因为F在打印时是使用num的任意数字的列表。发生这种情况的原因完全超出了我,而且我已经连续几天不停地查看。

更为琐碎的是,当我尝试使用G95进行编译时,它不会。它声称“ Li已经具有基本类型” Integer”,因此不会将Li识别为列表。我过去用来将整数声明为列表的方法过去对我有用,并且适合我所见过的文档,所以我很困惑为什么它会引发错误。

我已经坚持了一段时间,但我似乎无法自己解决它。无论提供什么帮助,我们将不胜感激,并在此先感谢您。

1 个答案:

答案 0 :(得分:1)

您确实在函数中两次声明了变量LI的类型。看:

INTEGER FUNCTION NUMTOLIST(NUM) RESULT(LI)
! (...)
INTEGER :: LI(0:5)

在函数声明前注意INTEGER关键字。它适用于在result(LI)中声明为结果的变量名称。 LI的第二个声明给出了错误。

解决方案:

  1. 从函数声明中删除INTEGER(首选);
  2. 删除第二个类型声明LI。您可以使用dimension规格说明来指定不带类型声明的尺寸。

像这样:

DIMENSION LI(0:5)

此外,要调用以数组作为返回值的函数,您将需要一个显式接口。