Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 数组是否可能在没有任何原因的情况下更改其元素?-Fortran 77_Arrays_Fortran_Fortran77 - Fatal编程技术网

Arrays 数组是否可能在没有任何原因的情况下更改其元素?-Fortran 77

Arrays 数组是否可能在没有任何原因的情况下更改其元素?-Fortran 77,arrays,fortran,fortran77,Arrays,Fortran,Fortran77,我对fortran很陌生,所以这可能是一个愚蠢的问题 我对数组有一个问题,它似乎无缘无故地改变了它的元素。我刚刚绘制了阵列,您可以看到它不应该改变,但显然它确实改变了: 代码很长,我只粘贴了关于数组的部分。基本上,我从主代码中调用一个soubrutine,它对元素“kkk”进行一些计算,kkk是一个颗粒。如果颗粒的轴低于一定数量,则颗粒将设置为死,并存储在名为DEADGR的数组中,该数组是更改元素的数组 c TOTAL COUNTER OF DEAD GRAINS N

我对fortran很陌生,所以这可能是一个愚蠢的问题

我对数组有一个问题,它似乎无缘无故地改变了它的元素。我刚刚绘制了阵列,您可以看到它不应该改变,但显然它确实改变了:

代码很长,我只粘贴了关于数组的部分。基本上,我从主代码中调用一个soubrutine,它对元素“kkk”进行一些计算,kkk是一个颗粒。如果颗粒的轴低于一定数量,则颗粒将设置为死,并存储在名为DEADGR的数组中,该数组是更改元素的数组

 c     TOTAL COUNTER OF DEAD GRAINS

       NDEADGRTOTAL=0

 C     SET TO 0 THE COUNTER OF DEAD GRAINS IN STEP
       NDEADGR=0
       NDEADGRTOTALOLD=NDEADGRTOTAL

       DO NN=1,NLIVEGR
           KKK=LIVEGR(NN)
           CALL GROWTH(KKK,IDEAD)
  C      IF THE GRAIN HAS TO BE ELIMINATED STORE IN ARRAY DEADGRAINS

        IF (IDEAD.EQ.1) THEN
              NDEADGR=NDEADGR+1 !DEAD GRAINS IS STEP
              NDEADGRTOTAL=NDEADGRTOTAL+1 !TOTAL DEAD GRAINS
              DEADGR(NDEADGRTOTAL)=KKK !STORE THE ID OF THE DEAD GRAIN
        END IF            
  END DO
这是子程序:

  SUBROUTINE GROWTH(KKK,IDEAD)

  INCLUDE 'vpsc7.dim'

  REAL RO, GRV, DELTAX, NEWVOL, DUMMYONE, OLDVOL, toll
  integer idead

  toll=1e-5

C     GET VARIABLES USED IN THE ROUTINE
  RO=DSLDNSTY(KKK)
  OLDVOL=VOL(KKK)

  IDEAD=0

C     CALCULATE GRAIN BOUNDARY VELOCITY
  GRV=MOB*0.5*MU*BURG*BURG*(AVGDSLDNSTY-RO)
  DELTAX=2*GRV*TINCR      !VARIATION IN LENGHT OF AXES

C     GET ACTUAL AXES LENGHT OF GRAIN KKK      
  AX1GR=AXISGR(0,1,KKK)
  AX2GR=AXISGR(0,2,KKK)
  AX3GR=AXISGR(0,3,KKK)

C     UPDATE AXES
  AX1GR=AX1GR+DELTAX
  AX2GR=AX2GR+DELTAX
  AX3GR=AX3GR+DELTAX

C     IF ONE OF THE AXIS IS NEGATIVE THE GRAIN IS SET TO DEAD
  if ((AX1GR.LE.toll).OR.(AX2GR.LE.toll).OR.(AX3GR.LE.toll)) then
        IDEAD=1
        RETURN
  end if

C     CALCULATE NEW VOLUME
  NEWVOL=(4./3.)*PI*AX1GR*AX2GR*AX3GR

C     CALCULATE THE GROWTH FACTOR
  DUMMYONE=NEWVOL/OLDVOL

C     ASSIGN VARIABLES BEFORE EXIT FROM SUBROUTINE
  VOLGRGROWTH(KKK)=NEWVOL
  GRGRWTHFAC(KKK)=DUMMYONE


  RETURN
  END

我使用的是Intel Parallel Studio XE 2015。

不,阵列本身不会改变。很可能您访问了一些超出边界的数组。启用编译器(未命名)的所有运行时检查。例如
gfortran-g-fcheck=all-Wall-fbacktrace
。感谢您的回复。此运行时检查的作用是什么?编译器是Intel Parallel Studio XE2015,我刚刚编辑了这个问题。感谢英特尔在Linux中使用
-g-check-warn-traceback
,如果您使用Windows,则使用同等版本。这将允许检查您是否正确访问阵列。如果这样做没有帮助,请准备一个小示例(通过删除代码中不相关的部分),该示例足够小,可以在这里完整地显示它,但仍然会显示问题。再见,非常感谢。实际上,根据您关于运行时检查的建议,我发现VisualStudio中的调试比命令中的调试好得多。在VisualStudio中,我可以看到所有阵列,而无需逐个打印。我相信我现在会找到我的错误所在,但如果我不知道,我会照你说的去做。非常感谢。如果您试图跟踪此特定错误,我建议您使用运行时边界检查,而不是完成“打印所有内容”调试。可能有太多的信息。不,数组本身不会改变。很可能您访问了一些超出边界的数组。启用编译器(未命名)的所有运行时检查。例如
gfortran-g-fcheck=all-Wall-fbacktrace
。感谢您的回复。此运行时检查的作用是什么?编译器是Intel Parallel Studio XE2015,我刚刚编辑了这个问题。感谢英特尔在Linux中使用
-g-check-warn-traceback
,如果您使用Windows,则使用同等版本。这将允许检查您是否正确访问阵列。如果这样做没有帮助,请准备一个小示例(通过删除代码中不相关的部分),该示例足够小,可以在这里完整地显示它,但仍然会显示问题。再见,非常感谢。实际上,根据您关于运行时检查的建议,我发现VisualStudio中的调试比命令中的调试好得多。在VisualStudio中,我可以看到所有阵列,而无需逐个打印。我相信我现在会找到我的错误所在,但如果我不知道,我会照你说的去做。非常感谢。如果您试图跟踪此特定错误,我建议您使用运行时边界检查,而不是完成“打印所有内容”调试。可能有太多的信息。