Как я могу извлечь определенное поле типа данных compund в виде массива - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть файл HDF5, содержащий (среди других элементов) массив составных данных, например, например:

    DATASET "AgentDataSet" {
        DATATYPE  H5T_COMPOUND {
           H5T_STD_I32LE "LifeState";
           H5T_STD_I32LE "CellIdx";
           H5T_STD_I32LE "CellID";
           H5T_STD_I64LE "AgentID";
           H5T_IEEE_F32LE "BirthTime";
           H5T_STD_U8LE "Gender";
           H5T_IEEE_F32LE "Age";
           H5T_IEEE_F32LE "LastBirth";
        }
        DATASPACE  SIMPLE { ( 2252984 ) / ( 2252984 ) }
}

Члены составных данных могут различаться в разных файлах, но я знаю, что LifeState, CellIdx, CellID и AgentID всегда содержатся в составном типе данных (даже в тех же местах).

Мое приложение не знает точную структуру составных данных и поэтомуневозможно определить соответствующий struct для использования в H5Tread().

Есть ли способ извлечь поля AgentID и CellID из массива составных данных в массив

struct {
  int iAgendID;
  int iCellID;   
}

т.е. игнорировать остальные поля?

Спасибо

1 Ответ

0 голосов
/ 07 февраля 2019

Я узнал, как это сделать: я определил эту структуру:

struct info_t {
    idtype   m_ulID;
    gridtype m_ulCellID;
};

Затем я создаю соответствующий тип данных HDF5:

    hid_t hInfoDataType = H5Tcreate (H5T_COMPOUND, sizeof (info_t));

    info_t ii;
    H5Tinsert(hInfoDataType, SPOP_DT_CELL_ID,  HOFFSET(info_t, m_ulCellID), H5T_NATIVE_INT);
    H5Tinsert(hInfoDataType, SPOP_DT_AGENT_ID, HOFFSET(info_t, m_ulID),     INT_NATIVE_LONG);

Затем, предполагая соответствующее пространство данных (hDataSpace) был открыт, я читаю и использую данные:

    hsize_t dims;
    H5Sget_simple_extent_dims(hDataSpace, &dims, NULL);
    info_t *pInfos = new info_t[dims];

    hid_t hMemSpace = H5Screate_simple (1, &dims, NULL); 
    herr_t status = H5Dread(hDataSet, hAgentDataType, hMemSpace, hDataSpace, H5P_DEFAULT, pInfos);

    for (int i = 0; i < 10; i++) {
        printf("%d; a %ld, c %d\n", i, pInfos[i].m_ulID, pInfos[i].m_ulCellID);
    }
    delete[] pInfos;
...