Fortran HDF5抛出错误,除非我使用内联子例程

Fortran HDF5抛出错误,除非我使用内联子例程,fortran,hdf5,Fortran,Hdf5,我最近开始探索Fortran的HDF5库,遇到了一些我不理解的奇怪行为。下面的代码编译得很好,但是当我尝试运行代码时,我得到了一个非常长的错误列表,这些错误来自子例程HDF\u init\u ot。当我将此子例程放在调用方子例程HDF_init(就像我在HDF_init2中所做的那样)中时,一切都非常正常。为什么会发生这种情况 代码: !===============================================================================

我最近开始探索Fortran的HDF5库,遇到了一些我不理解的奇怪行为。下面的代码编译得很好,但是当我尝试运行代码时,我得到了一个非常长的错误列表,这些错误来自子例程
HDF\u init\u ot
。当我将此子例程放在调用方子例程
HDF_init
(就像我在
HDF_init2
中所做的那样)中时,一切都非常正常。为什么会发生这种情况

代码

!===============================================================================
! This subroutine makes a call to an external subroutine HDF_init_ot,
! which throws an error
!===============================================================================
subroutine HDF_init()

    use hdf5

    character(len=11), parameter :: filename = "output.hdf5"
    character(len=2), parameter :: group_ot = "ot"

    integer(HID_T) :: file_handle, ot_handle
    integer :: error

    ! Create a new HDF file
    call h5open_f(error)
    call h5fcreate_f(filename, H5F_ACC_TRUNC_F, file_handle, error)

    ! Create a new group
    call h5gcreate_f(file_handle, group_ot, ot_handle, error)
    ! Call to subroutine
    call HDF_init_ot(ot_handle)
    ! Close group
    call h5gclose_f(ot_handle, error)

    ! Close file
    call h5fclose_f(file_handle, error)
    call h5close_f(error)

end subroutine HDF_init

!===============================================================================
! The culprit subroutine
!===============================================================================
subroutine HDF_init_ot(ot_handle)

    use hdf5

    character(len=1), parameter :: dset_t = "t"

    integer(HID_T) :: ot_handle, ot_space_handle
    integer(HID_T) :: data_handle

    integer(HSIZE_T), dimension(1) :: ot_dims, ot_max_dims

    integer :: error, rank

    ! Define rank and dimensions
    rank = 1
    ot_dims = (/0/)
    ot_max_dims = (/H5S_UNLIMITED_F/)

    ! Create a data space
    call h5screate_simple_f(rank, ot_dims, ot_space_handle, error, ot_max_dims)
    ! Create a data set within the space
    call h5dcreate_f(   ot_handle, dset_t, H5T_NATIVE_DOUBLE, ot_space_handle, &
                                        data_handle, error)
    ! Close the data set
    call h5dclose_f(data_handle, error)
    ! Close the data space
    call h5sclose_f(ot_space_handle, error)

end subroutine HDF_init_ot

!===============================================================================
! When I inline HDF_init_ot into the subroutine below, everything works
!===============================================================================
subroutine HDF_init2()

    use hdf5

    character(len=11), parameter :: filename = "output.hdf5"
    character(len=2), parameter :: group_ot = "ot"
    character(len=1), parameter :: dset_t = "t"

    integer(HID_T) :: file_handle, ot_handle, ot_space_handle, data_handle
    integer(HSIZE_T), dimension(1) :: ot_dims, ot_max_dims

    integer :: error, rank

    rank = 1
    ot_dims = (/0/)
    ot_max_dims = (/H5S_UNLIMITED_F/)

    call h5open_f(error)
    call h5fcreate_f(filename, H5F_ACC_TRUNC_F, file_handle, error)

    call h5gcreate_f(file_handle, group_ot, ot_handle, error)
    call h5screate_simple_f(rank, ot_dims, ot_space_handle, error, ot_max_dims)
    call h5dcreate_f(   ot_handle, dset_t, H5T_NATIVE_DOUBLE, ot_space_handle, &
                                        data_handle, error)

    call h5dclose_f(data_handle, error)
    call h5sclose_f(ot_space_handle, error)
    call h5gclose_f(ot_handle, error)

    call h5fclose_f(file_handle, error)
    call h5close_f(error)

end subroutine HDF_init2

!===============================================================================
! Main program
!===============================================================================
program test

    implicit none

    ! This one throws errors
    call HDF_init()
    ! This one does not
    call HDF_init2()

end program test
HDF5-DIAG: Error detected in HDF5 (1.8.16) thread 140274482874112:

#000: ../../../src/H5D.c line 194 in H5Dcreate2(): unable to create dataset
major: Dataset
minor: Unable to initialize object

#001: ../../../src/H5Dint.c line 453 in H5D__create_named(): unable to create and link to dataset
major: Dataset
minor: Unable to initialize object

#002: ../../../src/H5L.c line 1638 in H5L_link_object(): unable to create new link to object
major: Links
minor: Unable to initialize object

#003: ../../../src/H5L.c line 1882 in H5L_create_real(): can't insert link
major: Symbol table
minor: Unable to insert object

#004: ../../../src/H5Gtraverse.c line 861 in H5G_traverse(): internal path traversal failed
major: Symbol table
minor: Object not found

#005: ../../../src/H5Gtraverse.c line 641 in H5G_traverse_real(): traversal operator failed
major: Symbol table
minor: Callback failed

#006: ../../../src/H5L.c line 1685 in H5L_link_cb(): unable to create object
major: Object header
minor: Unable to initialize object

#007: ../../../src/H5O.c line 3016 in H5O_obj_create(): unable to open object
major: Object header
minor: Can't open object

#008: ../../../src/H5Doh.c line 293 in H5O__dset_create(): unable to create dataset
major: Dataset
minor: Unable to initialize object

#009: ../../../src/H5Dint.c line 1056 in H5D__create(): unable to construct layout information
major: Dataset
minor: Unable to initialize object

#010: ../../../src/H5Dcontig.c line 422 in H5D__contig_construct(): extendible contiguous non-external dataset
major: Dataset
minor: Feature is unsupported

HDF5-DIAG: Error detected in HDF5 (1.8.16) thread 140274482874112:

#000: ../../../src/H5D.c line 415 in H5Dclose(): not a dataset
major: Invalid arguments to routine
minor: Inappropriate type

HDF5-DIAG: Error detected in HDF5 (1.8.16) thread 140274482874112:

#000: ../../../src/H5D.c line 194 in H5Dcreate2(): unable to create dataset
major: Dataset
minor: Unable to initialize object

#001: ../../../src/H5Dint.c line 453 in H5D__create_named(): unable to create and link to dataset
major: Dataset
minor: Unable to initialize object

#002: ../../../src/H5L.c line 1638 in H5L_link_object(): unable to create new link to object
major: Links
minor: Unable to initialize object

#003: ../../../src/H5L.c line 1882 in H5L_create_real(): can't insert link
major: Symbol table
minor: Unable to insert object

#004: ../../../src/H5Gtraverse.c line 861 in H5G_traverse(): internal path traversal failed
major: Symbol table
minor: Object not found

#005: ../../../src/H5Gtraverse.c line 641 in H5G_traverse_real(): traversal operator failed
major: Symbol table
minor: Callback failed

#006: ../../../src/H5L.c line 1685 in H5L_link_cb(): unable to create object
major: Object header
minor: Unable to initialize object

#007: ../../../src/H5O.c line 3016 in H5O_obj_create(): unable to open object
major: Object header
minor: Can't open object

#008: ../../../src/H5Doh.c line 293 in H5O__dset_create(): unable to create dataset
major: Dataset
minor: Unable to initialize object

#009: ../../../src/H5Dint.c line 1056 in H5D__create(): unable to construct layout information
major: Dataset
minor: Unable to initialize object

#010: ../../../src/H5Dcontig.c line 422 in H5D__contig_construct(): extendible contiguous non-external dataset
major: Dataset
minor: Feature is unsupported

HDF5-DIAG: Error detected in HDF5 (1.8.16) thread 140274482874112:

#000: ../../../src/H5D.c line 415 in H5Dclose(): not a dataset
major: Invalid arguments to routine
minor: Inappropriate type
错误

!===============================================================================
! This subroutine makes a call to an external subroutine HDF_init_ot,
! which throws an error
!===============================================================================
subroutine HDF_init()

    use hdf5

    character(len=11), parameter :: filename = "output.hdf5"
    character(len=2), parameter :: group_ot = "ot"

    integer(HID_T) :: file_handle, ot_handle
    integer :: error

    ! Create a new HDF file
    call h5open_f(error)
    call h5fcreate_f(filename, H5F_ACC_TRUNC_F, file_handle, error)

    ! Create a new group
    call h5gcreate_f(file_handle, group_ot, ot_handle, error)
    ! Call to subroutine
    call HDF_init_ot(ot_handle)
    ! Close group
    call h5gclose_f(ot_handle, error)

    ! Close file
    call h5fclose_f(file_handle, error)
    call h5close_f(error)

end subroutine HDF_init

!===============================================================================
! The culprit subroutine
!===============================================================================
subroutine HDF_init_ot(ot_handle)

    use hdf5

    character(len=1), parameter :: dset_t = "t"

    integer(HID_T) :: ot_handle, ot_space_handle
    integer(HID_T) :: data_handle

    integer(HSIZE_T), dimension(1) :: ot_dims, ot_max_dims

    integer :: error, rank

    ! Define rank and dimensions
    rank = 1
    ot_dims = (/0/)
    ot_max_dims = (/H5S_UNLIMITED_F/)

    ! Create a data space
    call h5screate_simple_f(rank, ot_dims, ot_space_handle, error, ot_max_dims)
    ! Create a data set within the space
    call h5dcreate_f(   ot_handle, dset_t, H5T_NATIVE_DOUBLE, ot_space_handle, &
                                        data_handle, error)
    ! Close the data set
    call h5dclose_f(data_handle, error)
    ! Close the data space
    call h5sclose_f(ot_space_handle, error)

end subroutine HDF_init_ot

!===============================================================================
! When I inline HDF_init_ot into the subroutine below, everything works
!===============================================================================
subroutine HDF_init2()

    use hdf5

    character(len=11), parameter :: filename = "output.hdf5"
    character(len=2), parameter :: group_ot = "ot"
    character(len=1), parameter :: dset_t = "t"

    integer(HID_T) :: file_handle, ot_handle, ot_space_handle, data_handle
    integer(HSIZE_T), dimension(1) :: ot_dims, ot_max_dims

    integer :: error, rank

    rank = 1
    ot_dims = (/0/)
    ot_max_dims = (/H5S_UNLIMITED_F/)

    call h5open_f(error)
    call h5fcreate_f(filename, H5F_ACC_TRUNC_F, file_handle, error)

    call h5gcreate_f(file_handle, group_ot, ot_handle, error)
    call h5screate_simple_f(rank, ot_dims, ot_space_handle, error, ot_max_dims)
    call h5dcreate_f(   ot_handle, dset_t, H5T_NATIVE_DOUBLE, ot_space_handle, &
                                        data_handle, error)

    call h5dclose_f(data_handle, error)
    call h5sclose_f(ot_space_handle, error)
    call h5gclose_f(ot_handle, error)

    call h5fclose_f(file_handle, error)
    call h5close_f(error)

end subroutine HDF_init2

!===============================================================================
! Main program
!===============================================================================
program test

    implicit none

    ! This one throws errors
    call HDF_init()
    ! This one does not
    call HDF_init2()

end program test
HDF5-DIAG: Error detected in HDF5 (1.8.16) thread 140274482874112:

#000: ../../../src/H5D.c line 194 in H5Dcreate2(): unable to create dataset
major: Dataset
minor: Unable to initialize object

#001: ../../../src/H5Dint.c line 453 in H5D__create_named(): unable to create and link to dataset
major: Dataset
minor: Unable to initialize object

#002: ../../../src/H5L.c line 1638 in H5L_link_object(): unable to create new link to object
major: Links
minor: Unable to initialize object

#003: ../../../src/H5L.c line 1882 in H5L_create_real(): can't insert link
major: Symbol table
minor: Unable to insert object

#004: ../../../src/H5Gtraverse.c line 861 in H5G_traverse(): internal path traversal failed
major: Symbol table
minor: Object not found

#005: ../../../src/H5Gtraverse.c line 641 in H5G_traverse_real(): traversal operator failed
major: Symbol table
minor: Callback failed

#006: ../../../src/H5L.c line 1685 in H5L_link_cb(): unable to create object
major: Object header
minor: Unable to initialize object

#007: ../../../src/H5O.c line 3016 in H5O_obj_create(): unable to open object
major: Object header
minor: Can't open object

#008: ../../../src/H5Doh.c line 293 in H5O__dset_create(): unable to create dataset
major: Dataset
minor: Unable to initialize object

#009: ../../../src/H5Dint.c line 1056 in H5D__create(): unable to construct layout information
major: Dataset
minor: Unable to initialize object

#010: ../../../src/H5Dcontig.c line 422 in H5D__contig_construct(): extendible contiguous non-external dataset
major: Dataset
minor: Feature is unsupported

HDF5-DIAG: Error detected in HDF5 (1.8.16) thread 140274482874112:

#000: ../../../src/H5D.c line 415 in H5Dclose(): not a dataset
major: Invalid arguments to routine
minor: Inappropriate type

HDF5-DIAG: Error detected in HDF5 (1.8.16) thread 140274482874112:

#000: ../../../src/H5D.c line 194 in H5Dcreate2(): unable to create dataset
major: Dataset
minor: Unable to initialize object

#001: ../../../src/H5Dint.c line 453 in H5D__create_named(): unable to create and link to dataset
major: Dataset
minor: Unable to initialize object

#002: ../../../src/H5L.c line 1638 in H5L_link_object(): unable to create new link to object
major: Links
minor: Unable to initialize object

#003: ../../../src/H5L.c line 1882 in H5L_create_real(): can't insert link
major: Symbol table
minor: Unable to insert object

#004: ../../../src/H5Gtraverse.c line 861 in H5G_traverse(): internal path traversal failed
major: Symbol table
minor: Object not found

#005: ../../../src/H5Gtraverse.c line 641 in H5G_traverse_real(): traversal operator failed
major: Symbol table
minor: Callback failed

#006: ../../../src/H5L.c line 1685 in H5L_link_cb(): unable to create object
major: Object header
minor: Unable to initialize object

#007: ../../../src/H5O.c line 3016 in H5O_obj_create(): unable to open object
major: Object header
minor: Can't open object

#008: ../../../src/H5Doh.c line 293 in H5O__dset_create(): unable to create dataset
major: Dataset
minor: Unable to initialize object

#009: ../../../src/H5Dint.c line 1056 in H5D__create(): unable to construct layout information
major: Dataset
minor: Unable to initialize object

#010: ../../../src/H5Dcontig.c line 422 in H5D__contig_construct(): extendible contiguous non-external dataset
major: Dataset
minor: Feature is unsupported

HDF5-DIAG: Error detected in HDF5 (1.8.16) thread 140274482874112:

#000: ../../../src/H5D.c line 415 in H5Dclose(): not a dataset
major: Invalid arguments to routine
minor: Inappropriate type
编辑

!===============================================================================
! This subroutine makes a call to an external subroutine HDF_init_ot,
! which throws an error
!===============================================================================
subroutine HDF_init()

    use hdf5

    character(len=11), parameter :: filename = "output.hdf5"
    character(len=2), parameter :: group_ot = "ot"

    integer(HID_T) :: file_handle, ot_handle
    integer :: error

    ! Create a new HDF file
    call h5open_f(error)
    call h5fcreate_f(filename, H5F_ACC_TRUNC_F, file_handle, error)

    ! Create a new group
    call h5gcreate_f(file_handle, group_ot, ot_handle, error)
    ! Call to subroutine
    call HDF_init_ot(ot_handle)
    ! Close group
    call h5gclose_f(ot_handle, error)

    ! Close file
    call h5fclose_f(file_handle, error)
    call h5close_f(error)

end subroutine HDF_init

!===============================================================================
! The culprit subroutine
!===============================================================================
subroutine HDF_init_ot(ot_handle)

    use hdf5

    character(len=1), parameter :: dset_t = "t"

    integer(HID_T) :: ot_handle, ot_space_handle
    integer(HID_T) :: data_handle

    integer(HSIZE_T), dimension(1) :: ot_dims, ot_max_dims

    integer :: error, rank

    ! Define rank and dimensions
    rank = 1
    ot_dims = (/0/)
    ot_max_dims = (/H5S_UNLIMITED_F/)

    ! Create a data space
    call h5screate_simple_f(rank, ot_dims, ot_space_handle, error, ot_max_dims)
    ! Create a data set within the space
    call h5dcreate_f(   ot_handle, dset_t, H5T_NATIVE_DOUBLE, ot_space_handle, &
                                        data_handle, error)
    ! Close the data set
    call h5dclose_f(data_handle, error)
    ! Close the data space
    call h5sclose_f(ot_space_handle, error)

end subroutine HDF_init_ot

!===============================================================================
! When I inline HDF_init_ot into the subroutine below, everything works
!===============================================================================
subroutine HDF_init2()

    use hdf5

    character(len=11), parameter :: filename = "output.hdf5"
    character(len=2), parameter :: group_ot = "ot"
    character(len=1), parameter :: dset_t = "t"

    integer(HID_T) :: file_handle, ot_handle, ot_space_handle, data_handle
    integer(HSIZE_T), dimension(1) :: ot_dims, ot_max_dims

    integer :: error, rank

    rank = 1
    ot_dims = (/0/)
    ot_max_dims = (/H5S_UNLIMITED_F/)

    call h5open_f(error)
    call h5fcreate_f(filename, H5F_ACC_TRUNC_F, file_handle, error)

    call h5gcreate_f(file_handle, group_ot, ot_handle, error)
    call h5screate_simple_f(rank, ot_dims, ot_space_handle, error, ot_max_dims)
    call h5dcreate_f(   ot_handle, dset_t, H5T_NATIVE_DOUBLE, ot_space_handle, &
                                        data_handle, error)

    call h5dclose_f(data_handle, error)
    call h5sclose_f(ot_space_handle, error)
    call h5gclose_f(ot_handle, error)

    call h5fclose_f(file_handle, error)
    call h5close_f(error)

end subroutine HDF_init2

!===============================================================================
! Main program
!===============================================================================
program test

    implicit none

    ! This one throws errors
    call HDF_init()
    ! This one does not
    call HDF_init2()

end program test
HDF5-DIAG: Error detected in HDF5 (1.8.16) thread 140274482874112:

#000: ../../../src/H5D.c line 194 in H5Dcreate2(): unable to create dataset
major: Dataset
minor: Unable to initialize object

#001: ../../../src/H5Dint.c line 453 in H5D__create_named(): unable to create and link to dataset
major: Dataset
minor: Unable to initialize object

#002: ../../../src/H5L.c line 1638 in H5L_link_object(): unable to create new link to object
major: Links
minor: Unable to initialize object

#003: ../../../src/H5L.c line 1882 in H5L_create_real(): can't insert link
major: Symbol table
minor: Unable to insert object

#004: ../../../src/H5Gtraverse.c line 861 in H5G_traverse(): internal path traversal failed
major: Symbol table
minor: Object not found

#005: ../../../src/H5Gtraverse.c line 641 in H5G_traverse_real(): traversal operator failed
major: Symbol table
minor: Callback failed

#006: ../../../src/H5L.c line 1685 in H5L_link_cb(): unable to create object
major: Object header
minor: Unable to initialize object

#007: ../../../src/H5O.c line 3016 in H5O_obj_create(): unable to open object
major: Object header
minor: Can't open object

#008: ../../../src/H5Doh.c line 293 in H5O__dset_create(): unable to create dataset
major: Dataset
minor: Unable to initialize object

#009: ../../../src/H5Dint.c line 1056 in H5D__create(): unable to construct layout information
major: Dataset
minor: Unable to initialize object

#010: ../../../src/H5Dcontig.c line 422 in H5D__contig_construct(): extendible contiguous non-external dataset
major: Dataset
minor: Feature is unsupported

HDF5-DIAG: Error detected in HDF5 (1.8.16) thread 140274482874112:

#000: ../../../src/H5D.c line 415 in H5Dclose(): not a dataset
major: Invalid arguments to routine
minor: Inappropriate type

HDF5-DIAG: Error detected in HDF5 (1.8.16) thread 140274482874112:

#000: ../../../src/H5D.c line 194 in H5Dcreate2(): unable to create dataset
major: Dataset
minor: Unable to initialize object

#001: ../../../src/H5Dint.c line 453 in H5D__create_named(): unable to create and link to dataset
major: Dataset
minor: Unable to initialize object

#002: ../../../src/H5L.c line 1638 in H5L_link_object(): unable to create new link to object
major: Links
minor: Unable to initialize object

#003: ../../../src/H5L.c line 1882 in H5L_create_real(): can't insert link
major: Symbol table
minor: Unable to insert object

#004: ../../../src/H5Gtraverse.c line 861 in H5G_traverse(): internal path traversal failed
major: Symbol table
minor: Object not found

#005: ../../../src/H5Gtraverse.c line 641 in H5G_traverse_real(): traversal operator failed
major: Symbol table
minor: Callback failed

#006: ../../../src/H5L.c line 1685 in H5L_link_cb(): unable to create object
major: Object header
minor: Unable to initialize object

#007: ../../../src/H5O.c line 3016 in H5O_obj_create(): unable to open object
major: Object header
minor: Can't open object

#008: ../../../src/H5Doh.c line 293 in H5O__dset_create(): unable to create dataset
major: Dataset
minor: Unable to initialize object

#009: ../../../src/H5Dint.c line 1056 in H5D__create(): unable to construct layout information
major: Dataset
minor: Unable to initialize object

#010: ../../../src/H5Dcontig.c line 422 in H5D__contig_construct(): extendible contiguous non-external dataset
major: Dataset
minor: Feature is unsupported

HDF5-DIAG: Error detected in HDF5 (1.8.16) thread 140274482874112:

#000: ../../../src/H5D.c line 415 in H5Dclose(): not a dataset
major: Invalid arguments to routine
minor: Inappropriate type
我发现,当我从
h5screate\u simple\f
调用中删除
ot\u max\u dims
时,一切都按预期运行。奇怪的是,如果我在
HDF\u init
中定义
ot\u max\u dims
,并将其作为额外参数传递给
HDF\u init\u ot
,事情也会起作用。这对我来说意味着
H5S\u UNLIMITED\u F
HDF\u init()
私有的参数,可能与API实例相关(即
h5open\u F