需要有关使用数组输出星号和索引的帮助

时间:2011-04-13 02:52:06

标签: arrays fortran sorting fortran95

fortran 95上此程序的输出显示星号而不是数字。另外,我无法按照预期的方式打印实验#;实验1,实验2,实验3等。相反,它打印如下;实验1,实验1,实验1。

有关如何解决此问题的任何想法?以下是我的整个计划。

感谢您的时间。

PROGRAM numbersgen
    IMPLICIT NONE

        !Variable declaration
        INTEGER, DIMENSION(:,:),ALLOCATABLE::numarray
        INTEGER, DIMENSION(:),ALLOCATABLE::temparray
        INTEGER:: numrolls, numexps
        INTEGER:: i=0, j=0
        REAL:: avg=0, sdv=0, variance=0, sum=0
        INTEGER:: k, min, pos, temp

        .............
        ------

        REAL, INTENT(IN):: sum
        REAL, INTENT(IN):: avg, variance, sdv

        PRINT*, " "
        PRINT*, "Sum: ",sum
        PRINT '(1X,A,F5.3)', "Average: ",avg
        PRINT '(1X,A,F5.3)', "Variance: ",variance
        PRINT '(1X,A,F5.3)', "Standard Deviation: ",sdv

        END SUBROUTINE

END PROGRAM

2 个答案:

答案 0 :(得分:5)

F5.3格式要求值介于0到9.999之间。如果平均值大于或等于负值,则会发生反转。要查找合理的格式规范,请暂时将格式更改为F15.3,以便至少可以查看值。

我不明白为什么实验编号没有增加。哦哦!子程序中使用的主程序的i范围是什么?!它们没有本地声明,implicit none生效,所以我倾向于认为这是一个问题。要确认的简单实验是将主程序中i的名称更改为完全不同的名称,例如expidx,并查看是否存在编译错误。 (有四个地方需要改变。)

答案 1 :(得分:3)

通过将子例程放在程序中的contains语句中,可以让他们访问程序中声明的数据。因此,使用i和j的子程序实际上会改变程序本身的值。不要这样做!

'正确'的方法是将子程序作为单独的程序单元或在模块中,并在主程序中使用它。