创建给定数组的频率数组时出现问题

时间:2011-04-12 07:23:29

标签: arrays algorithm fortran

我正在尝试在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

非常感谢你的时间。

2 个答案:

答案 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)