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识别为列表。我过去用来将整数声明为列表的方法过去对我有用,并且适合我所见过的文档,所以我很困惑为什么它会引发错误。
我已经坚持了一段时间,但我似乎无法自己解决它。无论提供什么帮助,我们将不胜感激,并在此先感谢您。
答案 0 :(得分:1)
您确实在函数中两次声明了变量LI
的类型。看:
INTEGER FUNCTION NUMTOLIST(NUM) RESULT(LI)
! (...)
INTEGER :: LI(0:5)
在函数声明前注意INTEGER
关键字。它适用于在result(LI)
中声明为结果的变量名称。 LI
的第二个声明给出了错误。
解决方案:
INTEGER
(首选); LI
。您可以使用dimension
规格说明来指定不带类型声明的尺寸。像这样:
DIMENSION LI(0:5)
此外,要调用以数组作为返回值的函数,您将需要一个显式接口。