/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * * the files COPYING and Copyright.html. COPYING can be found at the root * * of the source code distribution tree; Copyright.html can be found at the * * root level of an installed copy of the electronic HDF5 document set and * * is linked from the top-level documents page. It can also be found at * * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * * access to either file, you may request a copy from help@hdfgroup.org. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /***************************************************************************** FILE tarray.cpp - HDF5 C++ testing the array datatype functionality ***************************************************************************/ #ifdef OLD_HEADER_FILENAME #include #else #include #endif #include #ifndef H5_NO_NAMESPACE #ifndef H5_NO_STD using std::cerr; using std::endl; #endif // H5_NO_STD #endif #include "H5Cpp.h" // C++ API header file #ifndef H5_NO_NAMESPACE using namespace H5; #endif #include "h5cpputil.h" // C++ utilility header file const H5std_string FILENAME("tarray.h5"); const hsize_t SPACE1_RANK = 1; const hsize_t SPACE1_DIM1 = 4; const hsize_t ARRAY1_RANK = 1; const hsize_t ARRAY1_DIM1 = 4; typedef enum flt_t { FLT_FLOAT, FLT_DOUBLE, FLT_LDOUBLE, FLT_OTHER } flt_t; typedef enum int_t { INT_CHAR, INT_UCHAR, INT_SHORT, INT_USHORT, INT_INT, INT_UINT, INT_LONG, INT_ULONG, INT_LLONG, INT_ULLONG, INT_OTHER } int_t; /*------------------------------------------------------------------------- * Function: test_array_compound_array * * Purpose: Tests 1-D array of compound datatypes (with array fields) * * Return: None. * * Programmer: Binh-Minh Ribler (using C version) * January, 2016 * * Modifications: * *------------------------------------------------------------------------- */ static void test_array_compound_array() { SUBTEST("ArrayType::getArrayNDims & ArrayType::getArrayDims"); typedef struct { // Typedef for compound datatype */ int i; float f[ARRAY1_DIM1]; } s1_t; s1_t wdata[SPACE1_DIM1][ARRAY1_DIM1]; // Information to write s1_t rdata[SPACE1_DIM1][ARRAY1_DIM1]; // Information read in hsize_t sdims1[] = {SPACE1_DIM1}; hsize_t tdims1[] = {ARRAY1_DIM1}; int nmemb; // Number of compound members int ii, jj, kk; // counting variables H5T_class_t mclass; // Datatype class for field // Initialize array data to write for (ii =0; ii < SPACE1_DIM1; ii++) for (jj = 0; jj < ARRAY1_DIM1; jj++) { wdata[ii][jj].i = ii * 10 + jj; for(kk = 0; kk < ARRAY1_DIM1; kk++) wdata[ii][jj].f[kk]=(float)(ii * 10.0F + jj * 2.5F + kk); } // end for try { // Create File H5File file1(FILENAME, H5F_ACC_TRUNC); // Create dataspace for datasets DataSpace space(SPACE1_RANK, sdims1, NULL); /* * Create an array datatype of compounds, arrtype. Each compound * datatype, comptype, contains an integer and an array of floats, * arrfltype. */ // Create a compound datatype CompType comptype(sizeof(s1_t)); // Insert integer field comptype.insertMember("i", HOFFSET(s1_t, i), PredType::NATIVE_INT); // Create an array of floats datatype ArrayType arrfltype(PredType::NATIVE_FLOAT, ARRAY1_RANK, tdims1); // Insert float array field comptype.insertMember("f", HOFFSET(s1_t, f), arrfltype); // Close array of floats field datatype arrfltype.close(); // Create an array datatype of the compound datatype ArrayType arrtype(comptype, ARRAY1_RANK, tdims1); // Close compound datatype comptype comptype.close(); // Create a dataset DataSet dataset = file1.createDataSet("Dataset1", arrtype, space); // Write dataset to disk dataset.write(wdata, arrtype); // Close all dataset.close(); arrtype.close(); space.close(); file1.close(); // Re-open file file1.openFile(FILENAME, H5F_ACC_RDONLY); // Open the dataset dataset = file1.openDataSet("Dataset1"); /* * Check the datatype array of compounds */ // Verify that it is an array of compounds DataType dstype = dataset.getDataType(); mclass = dstype.getClass(); verify_val(mclass, H5T_ARRAY, "f2_type.getClass", __LINE__, __FILE__); dstype.close(); // Get the array datatype to check ArrayType atype_check = dataset.getArrayType(); // Check the array rank int ndims = atype_check.getArrayNDims(); verify_val(ndims, ARRAY1_RANK, "atype_check.getArrayNDims", __LINE__, __FILE__); // Get the array dimensions hsize_t rdims1[H5S_MAX_RANK]; atype_check.getArrayDims(rdims1); // Check the array dimensions for (ii =0; ii