Fortran 응용 프로그램을 컴파일하여 HDF5 파일을 작성하려고합니다. 내 컴파일러는 gfortran 4.7.2입니다. 특히, 현재 차원과 최대 차원의 특정 집합으로 데이터 공간을 만들려고합니다. 마지막 치수에 무제한 최대 치수가 있어야합니다. Fortran HDF5에 대한 많은 문서는 없지만 문제의 치수를 H5S_UNLIMITED_F
으로 설정하여 지정할 수 있음을 알 수있었습니다. 이 값은 -1로 평가되지만, 내 응용 프로그램에서는 0이 현재 오류 (해당 경우 20)보다 작기 때문에 런타임 오류를 발생시키는 대신 0으로 평가됩니다. 이 오류입니다 :Fortran HDF5의 무제한 최대 치수 매개 변수 (H5S_UNLIMITED_F)가 -1 대신 0으로 계산되는 이유는 무엇입니까?
HDF5-DIAG: Error detected in HDF5 (1.8.11) thread 0:
#000: H5S.c line 1388 in H5Screate_simple(): maxdims is smaller than dims
major: Invalid arguments to routine
minor: Bad value
나도 같은 H5S_UNLIMITED_F 매개 변수 (h5_extend.f90)를 사용 HDF5와 함께 제공되는 포트란 예제 중 하나를 컴파일하지만, 해당 응용 프로그램에 대한 매개 변수가 -1로 평가하지 않고있다 문제.
내가 뭘 잘못하고 있니?
program simple_test
use hdf5
implicit none
integer :: irank, hdferr
integer(hsize_t) :: ny, nx, nz
real, dimension(:,:,:), allocatable :: dset
character (len = 256) :: hdf_file, dlab
integer(hid_t) :: file_handle, mem_space, file_space, dset_handle
integer(hsize_t), dimension(:), allocatable :: dim_array, max_array
irank = 3
ny = 10
nx = 15
nz = 20
allocate (dset(ny, nx, nz))
hdf_file = 'simple_test.hdf5'
dlab = 'simple_data'
allocate (dim_array(irank))
allocate (max_array(irank))
dim_array = (/ ny, nx, nz /)
max_array = (/ ny, nx, H5S_UNLIMITED_F /)
print *, 'h5s_unlimited_f: ', h5s_unlimited_f
print *, 'dim_array: ', dim_array
print *, 'max_array: ', max_array
call h5open_f(hdferr)
if (hdferr .eq. -1) then
print *, 'Error opening HDF5 Fortran interface.'
end if
! Create a new file.
call h5fcreate_f(hdf_file, H5F_ACC_TRUNC_F, file_handle, hdferr)
if (hdferr .eq. -1) then
print *, 'Error creating HDF5 file.'
end if
! Create memory dataspace.
call h5screate_simple_f(irank, dim_array, mem_space, hdferr, max_array)
if (hdferr .eq. -1) then
print *, 'Error creating HDF5 memory dataspace.'
end if
! Create the dataset.
call h5dcreate_f(file_handle, trim(dlab), H5T_IEEE_F32LE, mem_space, &
dset_handle, hdferr)
if (hdferr .eq. -1) then
print *, 'Error creating HDF5 dataset.'
end if
! Create file dataspace.
call h5screate_simple_f(irank, dim_array, file_space, hdferr, max_array)
if (hdferr .eq. -1) then
print *, 'Error creating HDF5 file dataspace.'
end if
call h5dwrite_f(dset_handle, H5T_IEEE_F32LE, dset, dim_array, hdferr, &
mem_space, file_space)
if (hdferr .eq. -1) then
print *, 'Error writing HDF5 dataset.'
end if
call h5close_f(hdferr)
if (hdferr .eq. -1) then
print *, 'Error closing HDF5 Fortran interface.'
end if
deallocate (dset)
deallocate (dim_array)
deallocate (max_array)
end program simple_test
h5s_create_simple_f
에 대한 첫 번째 호출이 실패 할 것입니다 : 아래
h5s_create_simple_f
).
gfortran -c simple_test.f90 -o simple_test.o -I<hdf5_include_path>
gfortran -o simple_test simple_test.o -L<hdf5_lib_path> -lhdf5_fortran -lhdf5hl_fortran
가 나는 또한 -1로 max_array(irank)
설정을 시도했다, 그러나 그것은 완전히 다른 오류를 얻을 : 다음과 같이
나는 컴파일하고 있습니다.
내 프로그램이 속성 목록 및 청킹 호출의 유무에 관계없이 'HDF5 메모리 데이터 공간 생성 중 오류'를 출력하고 있습니다. 그 출력은 첫 번째'h5s_create_simple_f'가 실패했음을 나타냅니다. 중요한 요소는'h5s_unlimited_f'가'print' 문이 확인하는 (문서에서 명시한 -1 대신) 0으로 평가된다는 것입니다. – patrickvacek
라이브러리를 초기화하기 위해 H5open_f()를 호출하면 먼저 h5s_unlimited_f 변수를 참조해야합니다. 초기화되지 않았습니다. – IanH
정말 확실합니다! 다시 확인하십시오. :) – patrickvacek