派生类型组件中的 Fortran 不匹配
Fortran Mismatch in components of derived type
我目前正在用 Fortran 开发一个软件。我已经有几次遇到以下错误。以前我只是设法撤消这些更改并再次重写代码,因为我无法理解这个问题。
显然,问题又回来了。所以我想知道为什么会这样。我在触发它的代码中做了什么。
使用的编译器是gfortran-9。我还尝试在 gfortran-10 (ubuntu 20.04) 中编译,希望它是一个已经解决的编译器错误:/。显示的错误是相同的,但元素不同。
软件的这一部分包含在一个库(以 SIO_... 开头的模块)中,该库正在使用另一个库(以 SHR_... 开头的模块)。
项目结构:
- soulio(库文件夹)
- 源码
- tests/unit
- soulshared(外部图书馆)
编译时触发错误的文件是soulio/tests/unit/ncSpatialFile.F90。它具有以下导入:
module ncSpatialFile_test
use netcdf
use SHR_file_mod, only: removeIfExists
use SHR_testSuite_mod, only: testSuite
use SHR_datetime_mod, only: datetime, timedelta, clock
use SIO_ncSpatialFile_mod, only: ncSpatialFile_abs <- gfortran-9 complains about this line
...
从 soulio/src/ncSpatialFile_abs.F90
导入
module SIO_ncSpatialFile_abs
! use netcdf
use SHR_datetime_mod, only: clock, datetime, timedelta
use SHR_strings_mod, only: string
use SHR_precision_mod, only: sp
use SHR_array_mod, only: initArrayRange
use SHR_error_mod, only: raiseError
use SIO_ncfile_mod, only: ncfile
use SIO_ncDimensions_mod, only: ncDimensions
use SIO_ncVariables_mod, only: ncVariables
use SIO_grid_mod, only: grid
use SIO_parallel_mod, only: mpiContext_type
use SIO_ncSlimSpatialDims_mod, only: ncSlimSpatialDims
use SIO_ncFullSpatialDims_mod, only: ncFullSpatialDims
use SIO_ncSpatialDims_abs, only: ncSpatialDims
use SIO_ncParams_mod, only: NC_TIME_DIM_NAME, NC_SPATIAL_DIM_NAME!, SIO_NC_GLOBAL_ATTR
use SIO_ncOtherDim_mod, only: ncOtherDim
use SIO_ncTimeDim_mod, only: ncTimeDim
use SIO_ncVar_mod, only: ncVar
use SIO_ncDim_mod, only: ncDim, ncDimHolder
use SIO_ncTime_mod, only: ncTime
use SIO_ncDimensionsRequest_mod, only: ncDimensionsRequest
use SIO_ncVariableBounds_mod, only: ncVariableBounds
use SIO_ncAttributes_mod, only: ncAttributes
... (too many imports?)
type, abstract :: ncSpatialFile_abs
! netcdf file interface
class(ncfile), allocatable :: ncfile
! time series
class(clock), allocatable :: ncClock
soulio/soulshared/src/datetime_mod.F90
module SHR_datetime_mod
use iso_fortran_env, only: real32, real64
use iso_c_binding, only: c_char, c_int, c_null_char
use SHR_error_mod, only: raiseError
implicit none
private
public :: datetime, timedelta, clock, calendar
...
gfortran-10 错误:
soulio/tests/unit/ncSpatialFile_test.F90:20:7:
20 | use SIO_ncSpatialFile_mod, only: ncSpatialFile_abs
| 1
Fatal Error: Mismatch in components of derived type ‘__vtype_shr_datetime_mod_Calendar’ from ‘shr_datetime_mod’ at (1): expecting ‘calendar_assign’, but got ‘getdaysinmonth’
compilation terminated.
make[2]: *** [tests/unit/CMakeFiles/soulio_test.dir/build.make:232: tests/unit/CMakeFiles/soulio_test.dir/ncSpatialFile_test.F90.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:260: tests/unit/CMakeFiles/soulio_test.dir/all] Error 2
gfortran-9 错误:
soulio/tests/unit/ncSpatialFile_test.F90:20:6:
20 | use SIO_ncSpatialFile_mod, only: ncSpatialFile_abs
| 1
Fatal Error: Mismatch in components of derived type ‘__vtype_shr_datetime_mod_Clock’ from ‘shr_datetime_mod’ at (1): expecting ‘currenttickintervals’, but got ‘clock_assign’
compilation terminated.
make[2]: *** [tests/unit/CMakeFiles/soulio_test.dir/build.make:232: tests/unit/CMakeFiles/soulio_test.dir/ncSpatialFile_test.F90.o] Error 1
修改 ncSpatialFile_test 但不是日期时间后出现错误。
我发现错误令人困惑。关于编译器试图说什么的任何想法?关于如何进一步挖掘还有其他建议吗?
编辑:
Datetime_mod 文件取自 https://github.com/wavebitscientific/datetime-fortran。有一些修改,但结构相同。
时钟声明:
type :: clock
type(datetime) :: startTime
type(datetime) :: stopTime
type(datetime) :: currentTime
type(datetime) :: prevTime !> currentTime - 1 timestep
type(datetime) :: nextTime !> currentTime + 1 timestep
type(timedelta) :: tickInterval
logical :: alarm = .false.
logical :: started = .false.
logical :: stopped = .false.
logical :: nullified = .false. !< it is considered not defined
contains
procedure :: getStartTime
procedure :: getStopTime
procedure :: reset
procedure :: tick
procedure :: toString => toString_clock
procedure :: isStopped
procedure :: isNull
! true when the condition is satisfied for the current time step
procedure :: isBeginYear, isEndYear
procedure :: isBeginMonth, isEndMonth
procedure :: isBeginDay, isEndDay
procedure :: isBeginClock, isEndClock
procedure :: getTickIntervals
procedure :: totalTickIntervals
procedure :: currentTickIntervals
!
procedure, private :: clock_assign
procedure, private, pass(from) :: clock_assign_tickInterval
generic :: assignment(=) => clock_assign, clock_assign_tickInterval
procedure :: findEquivalentCurrentTime
procedure :: getCalendarType => getCalendarType_clock
procedure, private :: equiv_clock
generic :: operator(==) => equiv_clock
procedure :: isInAbsoluteBounds
end type clock
如评论区@veryreverie所说,是缓存的问题
cmake 项目将其 mod 文件放入树 project/lib 中。当我清理构建文件夹时,这些文件不会被删除。因此,出现了一些不一致的情况。
我目前正在用 Fortran 开发一个软件。我已经有几次遇到以下错误。以前我只是设法撤消这些更改并再次重写代码,因为我无法理解这个问题。
显然,问题又回来了。所以我想知道为什么会这样。我在触发它的代码中做了什么。
使用的编译器是gfortran-9。我还尝试在 gfortran-10 (ubuntu 20.04) 中编译,希望它是一个已经解决的编译器错误:/。显示的错误是相同的,但元素不同。
软件的这一部分包含在一个库(以 SIO_... 开头的模块)中,该库正在使用另一个库(以 SHR_... 开头的模块)。
项目结构:
- soulio(库文件夹)
- 源码
- tests/unit
- soulshared(外部图书馆)
编译时触发错误的文件是soulio/tests/unit/ncSpatialFile.F90。它具有以下导入:
module ncSpatialFile_test
use netcdf
use SHR_file_mod, only: removeIfExists
use SHR_testSuite_mod, only: testSuite
use SHR_datetime_mod, only: datetime, timedelta, clock
use SIO_ncSpatialFile_mod, only: ncSpatialFile_abs <- gfortran-9 complains about this line
...
从 soulio/src/ncSpatialFile_abs.F90
导入module SIO_ncSpatialFile_abs
! use netcdf
use SHR_datetime_mod, only: clock, datetime, timedelta
use SHR_strings_mod, only: string
use SHR_precision_mod, only: sp
use SHR_array_mod, only: initArrayRange
use SHR_error_mod, only: raiseError
use SIO_ncfile_mod, only: ncfile
use SIO_ncDimensions_mod, only: ncDimensions
use SIO_ncVariables_mod, only: ncVariables
use SIO_grid_mod, only: grid
use SIO_parallel_mod, only: mpiContext_type
use SIO_ncSlimSpatialDims_mod, only: ncSlimSpatialDims
use SIO_ncFullSpatialDims_mod, only: ncFullSpatialDims
use SIO_ncSpatialDims_abs, only: ncSpatialDims
use SIO_ncParams_mod, only: NC_TIME_DIM_NAME, NC_SPATIAL_DIM_NAME!, SIO_NC_GLOBAL_ATTR
use SIO_ncOtherDim_mod, only: ncOtherDim
use SIO_ncTimeDim_mod, only: ncTimeDim
use SIO_ncVar_mod, only: ncVar
use SIO_ncDim_mod, only: ncDim, ncDimHolder
use SIO_ncTime_mod, only: ncTime
use SIO_ncDimensionsRequest_mod, only: ncDimensionsRequest
use SIO_ncVariableBounds_mod, only: ncVariableBounds
use SIO_ncAttributes_mod, only: ncAttributes
... (too many imports?)
type, abstract :: ncSpatialFile_abs
! netcdf file interface
class(ncfile), allocatable :: ncfile
! time series
class(clock), allocatable :: ncClock
soulio/soulshared/src/datetime_mod.F90
module SHR_datetime_mod
use iso_fortran_env, only: real32, real64
use iso_c_binding, only: c_char, c_int, c_null_char
use SHR_error_mod, only: raiseError
implicit none
private
public :: datetime, timedelta, clock, calendar
...
gfortran-10 错误:
soulio/tests/unit/ncSpatialFile_test.F90:20:7:
20 | use SIO_ncSpatialFile_mod, only: ncSpatialFile_abs
| 1
Fatal Error: Mismatch in components of derived type ‘__vtype_shr_datetime_mod_Calendar’ from ‘shr_datetime_mod’ at (1): expecting ‘calendar_assign’, but got ‘getdaysinmonth’
compilation terminated.
make[2]: *** [tests/unit/CMakeFiles/soulio_test.dir/build.make:232: tests/unit/CMakeFiles/soulio_test.dir/ncSpatialFile_test.F90.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:260: tests/unit/CMakeFiles/soulio_test.dir/all] Error 2
gfortran-9 错误:
soulio/tests/unit/ncSpatialFile_test.F90:20:6:
20 | use SIO_ncSpatialFile_mod, only: ncSpatialFile_abs
| 1
Fatal Error: Mismatch in components of derived type ‘__vtype_shr_datetime_mod_Clock’ from ‘shr_datetime_mod’ at (1): expecting ‘currenttickintervals’, but got ‘clock_assign’
compilation terminated.
make[2]: *** [tests/unit/CMakeFiles/soulio_test.dir/build.make:232: tests/unit/CMakeFiles/soulio_test.dir/ncSpatialFile_test.F90.o] Error 1
修改 ncSpatialFile_test 但不是日期时间后出现错误。
我发现错误令人困惑。关于编译器试图说什么的任何想法?关于如何进一步挖掘还有其他建议吗?
编辑:
Datetime_mod 文件取自 https://github.com/wavebitscientific/datetime-fortran。有一些修改,但结构相同。
时钟声明:
type :: clock
type(datetime) :: startTime
type(datetime) :: stopTime
type(datetime) :: currentTime
type(datetime) :: prevTime !> currentTime - 1 timestep
type(datetime) :: nextTime !> currentTime + 1 timestep
type(timedelta) :: tickInterval
logical :: alarm = .false.
logical :: started = .false.
logical :: stopped = .false.
logical :: nullified = .false. !< it is considered not defined
contains
procedure :: getStartTime
procedure :: getStopTime
procedure :: reset
procedure :: tick
procedure :: toString => toString_clock
procedure :: isStopped
procedure :: isNull
! true when the condition is satisfied for the current time step
procedure :: isBeginYear, isEndYear
procedure :: isBeginMonth, isEndMonth
procedure :: isBeginDay, isEndDay
procedure :: isBeginClock, isEndClock
procedure :: getTickIntervals
procedure :: totalTickIntervals
procedure :: currentTickIntervals
!
procedure, private :: clock_assign
procedure, private, pass(from) :: clock_assign_tickInterval
generic :: assignment(=) => clock_assign, clock_assign_tickInterval
procedure :: findEquivalentCurrentTime
procedure :: getCalendarType => getCalendarType_clock
procedure, private :: equiv_clock
generic :: operator(==) => equiv_clock
procedure :: isInAbsoluteBounds
end type clock
如评论区@veryreverie所说,是缓存的问题
cmake 项目将其 mod 文件放入树 project/lib 中。当我清理构建文件夹时,这些文件不会被删除。因此,出现了一些不一致的情况。