H5Tget_member_type () возвращает странные значения для составных типов данных HDF5 - PullRequest
1 голос
/ 08 января 2020

Я пытаюсь решить, эквивалентны ли два составных типа данных 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
...