summaryrefslogtreecommitdiffstats
path: root/c++/examples/compound.cpp
diff options
context:
space:
mode:
authorBinh-Minh Ribler <bmribler@hdfgroup.org>2000-12-07 01:10:27 (GMT)
committerBinh-Minh Ribler <bmribler@hdfgroup.org>2000-12-07 01:10:27 (GMT)
commit146482863aa7f52392f663cd4015f045727786bf (patch)
tree728cec1ef1cf3ca0787039fd7ee6d611a8ecbba9 /c++/examples/compound.cpp
parent6bf869bd734dba0ae9ddde94a12ec21e20286730 (diff)
downloadhdf5-146482863aa7f52392f663cd4015f045727786bf.zip
hdf5-146482863aa7f52392f663cd4015f045727786bf.tar.gz
hdf5-146482863aa7f52392f663cd4015f045727786bf.tar.bz2
[svn-r3084] Renamed compound.C to compound.cpp
Diffstat (limited to 'c++/examples/compound.cpp')
-rw-r--r--c++/examples/compound.cpp194
1 files changed, 194 insertions, 0 deletions
diff --git a/c++/examples/compound.cpp b/c++/examples/compound.cpp
new file mode 100644
index 0000000..ba7f68f
--- /dev/null
+++ b/c++/examples/compound.cpp
@@ -0,0 +1,194 @@
+/*
+ * This example shows how to create a compound datatype,
+ * write an array which has the compound datatype to the file,
+ * and read back fields' subsets.
+ */
+
+#include <string>
+#ifndef H5_NO_NAMESPACE
+using namespace std;
+#endif
+
+#ifdef OLD_HEADER_FILENAME
+#include <iostream.h>
+#else
+#include <iostream>
+#endif
+#include "H5Cpp.h"
+
+#ifndef H5_NO_NAMESPACE
+using namespace H5;
+#endif
+
+const string FILE_NAME( "SDScompound.h5" );
+const string DATASET_NAME( "ArrayOfStructures" );
+const string MEMBER1( "a_name" );
+const string MEMBER2( "b_name" );
+const string MEMBER3( "c_name" );
+const int LENGTH = 10;
+const int RANK = 1;
+
+int main(void)
+{
+ /* First structure and dataset*/
+ typedef struct s1_t {
+ int a;
+ float b;
+ double c;
+ } s1_t;
+
+ /* Second structure (subset of s1_t) and dataset*/
+ typedef struct s2_t {
+ double c;
+ int a;
+ } s2_t;
+
+ // Try block to detect exceptions raised by any of the calls inside it
+ try
+ {
+ /*
+ * Initialize the data
+ */
+ int i;
+ s1_t s1[LENGTH];
+ for (i = 0; i< LENGTH; i++)
+ {
+ s1[i].a = i;
+ s1[i].b = i*i;
+ s1[i].c = 1./(i+1);
+ }
+
+ /*
+ * Create the data space.
+ */
+ hsize_t dim[] = {LENGTH}; /* Dataspace dimensions */
+ DataSpace space( RANK, dim );
+
+ /*
+ * Create the file.
+ */
+ H5File* file = new H5File( FILE_NAME, H5F_ACC_TRUNC );
+
+ /*
+ * Create the memory datatype.
+ */
+ CompType mtype1( sizeof(s1_t) );
+ mtype1.insertMember( MEMBER1, HOFFSET(s1_t, a), PredType::NATIVE_INT);
+ mtype1.insertMember( MEMBER3, HOFFSET(s1_t, c), PredType::NATIVE_DOUBLE);
+ mtype1.insertMember( MEMBER2, HOFFSET(s1_t, b), PredType::NATIVE_FLOAT);
+
+ /*
+ * Create the dataset.
+ */
+ DataSet* dataset;
+ dataset = new DataSet( file->createDataSet( DATASET_NAME, mtype1, space ));
+
+ /*
+ * Wtite data to the dataset;
+ */
+ dataset->write( s1, mtype1 );
+
+ /*
+ * Release resources
+ */
+ delete dataset;
+ delete file;
+
+ // Get the class of the first member in mtype1, then get its type
+ H5T_class_t member1_class = mtype1.getMemberClass( 2 );
+ if( member1_class == H5T_FLOAT )
+ {
+ FloatType member2 = mtype1.getMemberFloatType( 2 );
+ string norm_string;
+ H5T_norm_t norm = member2.getNorm( norm_string );
+ cout << "Normalization type is " << norm_string << endl;
+ }
+
+ /*
+ * Open the file and the dataset.
+ */
+ file = new H5File( FILE_NAME, H5F_ACC_RDONLY );
+ dataset = new DataSet (file->openDataSet( DATASET_NAME ));
+
+ /*
+ * Create a datatype for s2
+ */
+ CompType mtype2( sizeof(s2_t) );
+
+ mtype2.insertMember( MEMBER3, HOFFSET(s2_t, c), PredType::NATIVE_DOUBLE);
+ mtype2.insertMember( MEMBER1, HOFFSET(s2_t, a), PredType::NATIVE_INT);
+
+ /*
+ * Read two fields c and a from s1 dataset. Fields in the file
+ * are found by their names "c_name" and "a_name".
+ */
+ s2_t s2[LENGTH];
+ dataset->read( s2, mtype2 );
+
+ /*
+ * Display the fields
+ */
+ cout << endl << "Field c : " << endl;
+ for( i = 0; i < LENGTH; i++)
+ cout << s2[i].c << " ";
+ cout << endl;
+
+ cout << endl << "Field a : " << endl;
+ for( i = 0; i < LENGTH; i++)
+ cout << s2[i].a << " ";
+ cout << endl;
+
+ /*
+ * Create a datatype for s3.
+ */
+ CompType mtype3( sizeof(float) );
+
+ mtype3.insertMember( MEMBER2, 0, PredType::NATIVE_FLOAT);
+
+ /*
+ * Read field b from s1 dataset. Field in the file is found by its name.
+ */
+ float s3[LENGTH]; // Third "structure" - used to read float field of s1)
+ dataset->read( s3, mtype3 );
+
+ /*
+ * Display the field
+ */
+ cout << endl << "Field b : " << endl;
+ for( i = 0; i < LENGTH; i++)
+ cout << s3[i] << " ";
+ cout << endl;
+
+ /*
+ * Release resources
+ */
+ delete dataset;
+ delete file;
+ } // end of try block
+
+ // catch failure caused by the H5File operations
+ catch( FileIException error )
+ {
+ error.printError();
+ }
+
+ // catch failure caused by the DataSet operations
+ catch( DataSetIException error )
+ {
+ error.printError();
+ }
+
+ // catch failure caused by the DataSpace operations
+ catch( DataSpaceIException error )
+ {
+ error.printError();
+ }
+
+ // catch failure caused by the DataSpace operations
+ catch( DataTypeIException error )
+ {
+ error.printError();
+ }
+
+ return 0;
+}