Hi Todd,
I'm not sure I understood your data completely, but I wonder what you will get if you change this line: complex_t** iqData = new complex_t*[nelems]; to: complex_t* iqData = new complex_t[nelems]; and read without the for loop... Binh-Minh ________________________________ From: Hdf-forum <[email protected]> on behalf of Todd Dobmeyer <[email protected]> Sent: Monday, July 11, 2016 3:10 PM To: [email protected] Subject: [Hdf-forum] Reading Nested Compound objects in C++ All I have an HDF5 file I need to read in a C++ application. I performed an h5dump on the data and have the following structure (with many items removed that I am not interested in). I have successfully read in all 7500 values of "num_samps" using the C++ HDF5 library. What I am struggling to figure out how to read is the array of compound "iq_data". I know in the datatype it says there are 1000 compound objects. I don't know if I can get this value out of the DataType, but I do know the num_samps points to this array size as well, which is fine since I can read this. Can any of you help me figure out how to read the "iq_data" array. Below is the sample data followed by my code I have so far. In my code "numSamps" is good, but "iqData" is not holding anything useful. I am sure I am missing something. Thanks for your help! Todd Dobmeyer --------------SAMPLE DATA------------------------- HDF5 "hdfFile.be01" { GROUP "/" { DATATYPE "DRdata" H5T_COMPOUND { H5T_ARRAY { [5] H5T_STD_U32LE } "guid"; H5T_STD_I32LE "version"; ... H5T_STD_U32LE "num_samps"; ... H5T_STD_U32LE "sequence_dummy"; H5T_ARRAY { [1000] H5T_COMPOUND { H5T_IEEE_F32LE "f_i"; H5T_IEEE_F32LE "f_q"; } } "iq_data"; } DATASET "DRx1data" { DATATYPE "/DRx1" DATASPACE SIMPLE { ( 7500 ) / ( H5S_UNLIMITED ) } DATA { (0): { [ 352430272, 25602, 2314, 1442149219, 43629 ], 1, 1.44215e+09, 1442149219, 0, 1, 1, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 1, 31095000, 20000, 0, 1000, 1000, // (this is num_samps) 1, 1000, [ { 1.09068e+09, 4.53469e+08 }, { 4.03303e+08, 4.11846e+08 }, { -1.35295e+08, -1.70107e+08 }, ... --------------------CODE------------------ typedef struct { float f_i; float f_q; } complex_t; int main(int argc, char *argv[]) { std::string path = "/data/hdfFile.be01"; // Open the file, dataset, and dataspace H5::H5File file(path, H5F_ACC_RDONLY); H5::DataSet dataset = file.openDataSet("DRx1data"); H5::DataSpace dataspace = dataset.getSpace(); // Get the number of elements and number of samples int nelems = dataspace.getSimpleExtentNpoints(); int numSamps[nelems]; // Create number of samples type H5::CompType sampsType(sizeof(uint)); sampsType.insertMember("num_samps", 0, H5::PredType::STD_U32LE); // Read the number of samples dataset.read(numSamps, sampsType); // Now try to read the I/Q data H5::CompType iqDataType(sizeof(complex_t)); iqDataType.insertMember("f_i", HOFFSET(complex_t, f_i), H5::PredType::NATIVE_FLOAT); iqDataType.insertMember("f_q", HOFFSET(complex_t, f_q), H5::PredType::NATIVE_FLOAT); complex_t** iqData = new complex_t*[nelems]; for(int i = 0 ; i < nelems ; ++i) { iqData[i] = new complex_t[numSamps[i]]; } dataset.read(iqData, iqDataType);
_______________________________________________ Hdf-forum is for HDF software users discussion. [email protected] http://lists.hdfgroup.org/mailman/listinfo/hdf-forum_lists.hdfgroup.org Twitter: https://twitter.com/hdf5
