在子程序中调用时,模块中保存的变量会更改值

时间:2014-10-09 16:28:21

标签: fortran

我正在使用Fortran语言编写的FEM程序。这是一种涉及多组材料的机械分析。重要变量保存在具有以下形式的模块中

MODULE element
  implicit none
  save

  TYPE proel_type
    INTEGER::  prop1
    INTEGER::  prop2
    REAL::     prop3
    REAL::     prop4
    ...
    INTEGER, ALLOCATABLE :: list1(:)
    REAL, ALLOCATABLE ::    array1(:)
    ...
    INTEGER::  LTYPE
    ...
  END TYPE proel_type

  TYPE(proel_type), ALLOCATABLE:: proel(:)

  INTEGER::  prop1
  INTEGER::  prop2
  REAL::     prop3
  REAL::     prop4
  ...
  INTEGER::  LTYPE
  INTEGER::  ISETS
  ...
END MODULE element

如您所见,proel是一个可分配的数据结构,包含有关材料属性,元素等的一些信息。此数据通过I / O例程(如

)从文本文件中获取
SUBROUTINE setdata
USE element
IMPLICIT NONE

ALLOCATE(PROEL(NSETS))

DO ISETS=1,NSETS

  ... ! here I am loading succefully the string variable STRVAR 
      ! from the text file with data

  LTYPE=GETVAL(STRVAR)    ! here I retreive the value of LTYPE

  PROEL(ISETS)%LTYPE=LTYPE ! here I save the (integer) variable for the set

  IF(LTYPE.NE.0)THEN
    CALL SETELM
  END IF
END DO

END SUBROUTINE

内部子程序SETELM我正在设置程序中使用的一些特定参数,但在某些时候我记得保存在PROEL中的LTYPE

SUBROUTINE SETELM
USE element
IMPLICIT NONE

LTYPE=PROEL(ISETS)%LTYPE

SELECT CASE(LTYPE)

  CASE( 1)
    ...
  CASE( 2)
    ...
  CASE DEFAULT
    ...
END SELECT
END SUBROUTINE

现在,在赋值LTYPE = PROEL(ISETS)%LTYPE和SELECT CASE(LTYPE)之间,变量LTYPE无任何理由地改变值。该值是随机的(从某种意义上说,我不知道它来自哪里,但它不像未初始化的变量),并且中间没有其他操作可以与LTYPE一起使用。

我正在使用VS2008和Fortran,所以我打开了每个警告,但是编译和运行时都没有提供一些可能的提示。

你知道为什么会这样吗?

0 个答案:

没有答案