回 帖 发 新 帖 刷新版面

主题:诡异的输出!!

PROGRAM main
    implicit none
    REAL::BETA(8)
    INTEGER::I

    WRITE(*,*) I

    WRITE(*,*) I

       DO I=1,31
         WRITE(*,*) I
       END DO


    stop
end program main

分别输出:1244920,1244920,然后1到31

这个比较好理解,因为I事先未赋值,但是,中间若增加一行BETA的初始化操作,
情况会有些不同:

PROGRAM main
    implicit none
    REAL::BETA(8)
    INTEGER::I

      WRITE(*,*) I

      BETA=(/(0,I=1,8)/)

      WRITE(*,*) I

       DO I=1,31
         WRITE(*,*) I
       END DO

    stop
end program main

结果分别输出:0,0,然后1到31。

接下来,如果不再输出第一个I,结果又会发生改变:

PROGRAM main
    implicit none
    REAL::BETA(8)
    INTEGER::I

    BETA=(/(0,I=1,8)/)

    WRITE(*,*) I

    DO I=1,31
       WRITE(*,*) I
    END DO

    stop
end program main

最后运行结果为:1244920,然后1到31


谁能给出一个解释?

回复列表 (共6个回复)

沙发

楼主这样试没什么意义啊,这是栈内比较随意的值,跟前后语句及调用环境有关。

板凳

楼主是什么编译器, release还是debug? 未初始化的变量还是很不安全.

3 楼


隐式循环那个算初始化么?

124990那个或许是因为未初始化的任意值,但加了BETA的初始化后怎么又变成0了呢?

4 楼


之所以那有这个困惑在于我自己写过的一段程序,程序如下:

   INTEGER::I    

   BETA=(/(0.0,I=1,8)/)


    DO WHILE(.TRUE.)
        GRA=-2*MATMUL(TRANSPOSE(X),Y-MATMUL(X,BETA))
        D=-BETA

        DO I=1,DIM2
        
            WRITE(*,*) I
            IF( ABS(BETA(I)-GRA(I))>LAMBDA) THEN
                  D(I)=-(GRA(I)-SIGN(LAMBDA,GRA(I)-BETA(I)))
            END IF

        END DO



        以下省略

    END DO



   中间省去了一部分,没必要展示出来,问题出在DO WHILE循环中的DO循环中:在这部份循环里,有一个WRITE(*,*)函数,理论上输出结果应该是:123456789123456789……(DIM2=9)。但实际结果却是:3456789123456789……
这个让我很不解

5 楼

[quote]
之所以那有这个困惑在于我自己写过的一段程序,程序如下:

   INTEGER::I    

   BETA=(/(0.0,I=1,8)/)


    DO WHILE(.TRUE.)
        GRA=-2*MATMUL(TRANSPOSE(X),Y-MATMUL(X,BETA))
        D=-BETA

        DO I=1,DIM2
        
            WRITE(*,*) I
            IF( ABS(BETA(I)-GRA(I))>LAMBDA) THEN
                  D(I)=-(GRA(I)-SIGN(LAMBDA,GRA(I)-BETA(I)))
            END IF

        END DO



        以下省略

    END DO



   中间省去了一部分,没必要展示出来,问题出在DO WHILE循环中的DO循环中:在这部份循环里,有一个WRITE(*,*)函数,理论上输出结果应该是:123456789123456789……(DIM2=9)。但实际结果却是:3456789123456789……
这个让我很不解[/quote]
啥编译器啊,是不是输出了但结果被挡着了?又或是你开并行了?

6 楼

4l信息太少,不好判断。
lz的程序只能说是未统一的说法,各个编译器不同情形处理不一样。
据我猜测,ivf在没有任何赋值的情形下,对于integer型变量会随机取值,一旦有赋值语句,那么所有的整型变量会被强制赋0(默认)。
而gfortran的integer型变量不论初始化与否,都会赋0(默认)。
ps:对于数组整体赋值,最好用整体写法,如BETA=0.,这样可以产生比隐含循环更短(而且是相当短)的汇编语句。

我来回复

您尚未登录,请登录后再回复。点此登录或注册