Я пытаюсь решить, эквивалентны ли два составных типа данных HDF5, используя функции H5Tget_nmembers()
, H5Tget_member_name()
, H5Tget_member_offset()
, H5Tget_member_class()
и H5Tget_member_type()
.
Первые четыре функции работают как и ожидалось, но H5Tget_member_type()
возвращает странные значения.
Этот фрагмент кода
struct Agent0 {
int m_iInt1;
int m_iInt2;
} ta0;
hid_t hAgentDataType = H5Tcreate (H5T_COMPOUND, sizeof(ta0));
H5Tinsert(hAgentDataType, "my_int1", qoffsetof(ta0, m_iInt1), H5T_NATIVE_INT);
H5Tinsert(hAgentDataType, "my_int2", qoffsetof(ta0, m_iInt2), H5T_NATIVE_INT);
printf("type of member %d: %ld\n", 0, H5Tget_member_type(hAgentDataType, 0));
printf("type of member %d: %ld\n", 1, H5Tget_member_type(hAgentDataType, 1));
printf("H5T_NATIVE_INT: %ld\n", H5T_NATIVE_INT);
дает следующий вывод:
type of member 0: 216172782113784122
type of member 1: 216172782113784123
H5T_NATIVE_INT: 216172782113783820
Таким образом, хотя члены 0 и 1 являются целыми числами, они имеют разные значения типа. И оба эти значения отличаются от значения H5T_NATIVE_INT
. Я ожидал, что все 3 значения будут равны ...
Так что же на самом деле возвращает H5Tget_member_type()
?
Как я могу на самом деле сравнивать типы данных членов составного типа данных?
РЕДАКТИРОВАТЬ: что еще страннее: если я вызываю H5Tget_meber_type () два раза для одного и того же члена, я получаю разные значения:
printf("call #1 for member %d: %016lx\n", 0, H5Tget_member_type(hAgentDataType, 0));
printf("call #2 for member %d: %016lx\n", 0, H5Tget_member_type(hAgentDataType, 0));
приводит к
call #1 for member 0: 0300000000000151
call #2 for member 0: 0300000000000152