Arrays 创建给定阵列的频率阵列时出现问题

Arrays 创建给定阵列的频率阵列时出现问题,arrays,algorithm,fortran,Arrays,Algorithm,Fortran,我试图在Fortran 95上创建给定数组的频率数组。例如,如果我有一个数组(\1 2 4 2 5),频率数组应该是每个项目出现的次数;(\1 3 2 3 2 3 1). 因此,因为原始数组中只有1个5,新数组中的最后一个条目是1,因为原始数组中有3个2,所以新数组中的相应条目是2 下面是我拥有的代码示例,但我不断地遇到错误。我想知道是否有人愿意在我可能做错的事情上给我一些指导和帮助。非常感谢 我没有包括生成原始数组的代码部分,因为我非常确定它是正确的,所以这里只是频率数组的子例程。此外,原始数

我试图在Fortran 95上创建给定数组的频率数组。例如,如果我有一个数组(\1 2 4 2 5),频率数组应该是每个项目出现的次数;(\1 3 2 3 2 3 1). 因此,因为原始数组中只有1个5,新数组中的最后一个条目是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
非常感谢您的时间。

我猜“(9)”将覆盖“维度(100)”,使“freq”成为长度为9的数组。因此,对于第三个参数,实际参数的长度为9,而伪参数的长度为100。这会导致错误消息“实际参数…小于虚拟大小”

其他建议:可以使用声明“…,dimension(:)::num”使子例程更通用。然后使用“size”内在值确定num的大小。freq可以固定为9,因为总有9个数字。

我猜“(9)”覆盖了“DIMENSION(100)”,使“freq”成为长度为9的数组。因此,对于第三个参数,实际参数的长度为9,而伪参数的长度为100。这会导致错误消息“实际参数…小于虚拟大小”


其他建议:可以使用声明“…,dimension(:)::num”使子例程更通用。然后使用“size”内在值来确定num的大小。freq可以固定为9,因为总有9个数字。

关于显示问题,我怀疑您的意思是有一个循环

WRITE(*,'(1X,I1,T35,I1)'),num(i),freq(i)

关于你的显示器问题,我想你是想绕圈子

WRITE(*,'(1X,I1,T35,I1)'),num(i),freq(i)

“但我一直在出错”-如果你说得更具体一些,别人会帮你。@aix我得到的错误是:“错误:[CALL FreqArray(num,numinteger,freq)]的数组参数小于虚拟大小。“你有什么想法吗?如果你用
100
替换
freq(9)
中的
9
会怎么样?它编译,但是num(i)和freq(i)数组都没有按预期打印。“frequency”列下面有一个星号,而“Digits”列下面有一个“9”。我不知道是格式错误还是其他什么。“但是我一直在出错”-如果您更具体一些,这将有助于其他人帮助您。@aix我得到的错误是:“[CALL FreqArray]处的error:Array参数。”(num,numinteger,freq)]小于虚拟大小。“你有什么想法吗?如果你将
freq(9)
中的
9
替换为
100
,会发生什么?它会编译,但是num(i)和freq(i)数组和数组都未按预期打印。“频率”列下面有一个星形,而“数字”列下面有一个“9”。我无法确定是格式错误还是其他原因。如果我决定执行allocate语句,我将如何执行INTEGER,INTENT语句?我正在将其更改为INTEGER,DIMENSION(:),ALLOCATABLE::num,frequency您可以在不分配数组的情况下使用“dimension(:)”。即使实际参数是可分配数组(例如,如果希望具有不同的数组长度,而不是始终为100),子例程中的伪参数也不需要ALLOCATABLE属性。子例程参数需要“ALLOCATABLE”只有在子例程中使用可分配功能时,您才能给我一个如何将大小固定为9的示例。我以前从未使用过size函数。示例代码有三行:integer,dimension(:),intent(in)::num;integer,dimension(9),intent(in)::freq;do I=1,size(num)。因此“size”告诉您数组的维度,而无需将其作为参数显式传递。如果数组的长度是固定的,那么您最好在声明中使用常量。如果我决定执行allocate语句,我将如何执行INTEGER INTENT语句?我正在将其更改为INTEGER,dimension(:),ALLOCATABLE::num,frequency您可以在不分配数组的情况下使用“dimension(:)”。即使实际参数是可分配数组(例如,如果希望具有不同的数组长度,而不是始终为100),子例程中的伪参数也不需要ALLOCATABLE属性。子例程参数需要“ALLOCATABLE”只有在子例程中使用可分配功能时,您才能给我一个如何将大小固定为9的示例。我以前从未使用过size函数。示例代码有三行:integer,dimension(:),intent(in)::num;integer,dimension(9),intent(in)::freq;do I=1,size(num)。因此“size”告诉您数组的维度,而不必显式地将其作为参数传递。如果数组的长度是固定的,那么您最好在声明中使用常量。