我正在尝试在Fortran 95上创建给定数组的频率数组。例如,如果我有一个数组(\ 1 2 4 2 4 2 5),频率数组应该是每个项目出现的次数; (\ 1 3 2 3 2 3 1)。因为原始数组中只有5个中的1个,所以新数组中的最后一个条目是1,因为原始数组中有3个2,所以新数组上的相应条目是2。
以下是我所拥有的代码示例,但我不断收到错误。我想知道是否有人愿意给我一些指导和帮助我可能做错了什么。非常感谢。
我没有包含生成原始数组的代码部分,因为我很确定它是正确的所以这里只是频率数组的子程序。原始数组也在此子例程之外按升序排序。也许我没有正确传递原始数组,num(i)??
INTEGER, DIMENSION(100)::num(100)
INTEGER, DIMENSION(100)::freq(100)
INTEGER:: i=0, k=0, numinteger, count=0
CALL FreqArray(num, numinteger,freq)
SUBROUTINE FreqArray(num, numinteger, freq)
INTEGER, INTENT(IN):: num(100), numinteger
INTEGER, INTENT(OUT):: freq(100)
DO i=1,9
count=0
DO k=1, numinteger
IF (num(k)==i)THEN
count=count+1
END IF
END DO
freq(i)=count
END DO
PRINT*, "Frequency of Digits"
PRINT*, " "
WRITE(*,'(1X,A,T35,A)'),"Digit","Frequency"
WRITE(*,'(1X,I1,T35,I1)'),num(i),freq(i)
END SUBROUTINE
非常感谢你的时间。
答案 0 :(得分:2)
我猜“(9)”覆盖了“DIMENSION(100)”,使“freq”成为长度为9的数组。因此,对于第三个参数,实际参数为长度9,而虚拟长度为100。这导致您的错误消息“实际参数...小于虚拟大小”。
其他建议:你可以使用声明“...,dimension(:) :: num”使子程序更通用。然后使用“size”内在函数来确定num的大小。 freq可以固定为9,因为总有9位数。
答案 1 :(得分:1)
关于您的显示问题,我怀疑您打算循环播放
WRITE(*,'(1X,I1,T35,I1)'),num(i),freq(i)