diff options
author | Frank Baker <fbaker@hdfgroup.org> | 2000-12-22 20:47:59 (GMT) |
---|---|---|
committer | Frank Baker <fbaker@hdfgroup.org> | 2000-12-22 20:47:59 (GMT) |
commit | c1d537db2b803d6908fe3f21f62c592c9cd2bf70 (patch) | |
tree | 56a6cb7f00a6fbec3b071722df9705e744368073 /doc/html/Tutor/compound.html | |
parent | d4c3773742b8dee426e7325fee4e8fc4015f2802 (diff) | |
download | hdf5-c1d537db2b803d6908fe3f21f62c592c9cd2bf70.zip hdf5-c1d537db2b803d6908fe3f21f62c592c9cd2bf70.tar.gz hdf5-c1d537db2b803d6908fe3f21f62c592c9cd2bf70.tar.bz2 |
[svn-r3196]
Purpose:
Adding Tutorial to development branch (R 1.4)
Platforms tested:
IE 5
Diffstat (limited to 'doc/html/Tutor/compound.html')
-rw-r--r-- | doc/html/Tutor/compound.html | 378 |
1 files changed, 378 insertions, 0 deletions
diff --git a/doc/html/Tutor/compound.html b/doc/html/Tutor/compound.html new file mode 100644 index 0000000..7983bf4 --- /dev/null +++ b/doc/html/Tutor/compound.html @@ -0,0 +1,378 @@ +<HTML><HEAD> +<TITLE>HDF5 Tutorial - Compound Data Types +</TITLE> +</HEAD> + +<body bgcolor="#ffffff"> + +<!-- BEGIN MAIN BODY --> + +<A HREF="http://www.ncsa.uiuc.edu/"><img border=0 +src="http://www.ncsa.uiuc.edu/Images/NCSAhome/footerlogo.gif" +width=78 height=27 alt="NCSA"><P></A> + + [ <A HREF="title.html"><I>HDF5 Tutorial Top</I></A> ] +<H1> +<BIG><BIG><BIG><FONT COLOR="#c101cd">Compound Data Types</FONT> +</BIG></BIG></BIG></H1> + +<hr noshade size=1> + +<BODY> +<H2>Contents:</H2> +<UL> + <LI><A HREF="#def">Creating Compound Data Types</A> + <LI>Programming Example +<UL> + <LI> <A HREF="#desc">Description</A> + <LI> <A HREF="#rem">Remarks</A> + <LI> <A HREF="#fc">File Contents</A> +</UL> +</UL> +<HR> +<A NAME="def"> +<H2>Creating Compound Data Types</H2> +A compound data type is similar to a struct in C or a common block in +Fortran. It is a collection of one or more atomic types or small arrays of +such types. To create and use a compound data type you need to refer to +various properties of the data compound data type: +<UL> + <LI>It is of class compound. + <LI>It has a fixed total size, in bytes. + <LI>It consists of zero or more members (defined in any order) with + unique names and which occupy non-overlapping regions within the datum. + <LI>Each member has its own data type. + <LI>Each member is referenced by an index number between zero and N-1, + where N is the number of members in the compound data type. + <LI>Each member has a name which is unique among its siblings in a + compound data type. + <LI>Each member has a fixed byte offset, which is the first byte + (smallest byte address) of that member in a compound data type. + <LI>Each member can be a small array of up to four dimensions. +</UL> +Properties of members of a compound data type are defined when the +member is added to the compound type and cannot be subsequently modified. +<P> +Compound data types must be built out of other data types. First, one +creates an empty compound data type and specifies its total size. Then +members are added to the compound data type in any order. + +<H2> Programming Example</H2> +<A NAME="desc"> +<H3><U>Description</U></H3> + +This example shows how to create a compound data type, write an array +to the file which uses the compound data type, and read back subsets of +the members.<BR> + +[<A HREF="examples/h5_compound.c">Download h5_compound.c</A>] +<PRE> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +#include "hdf5.h" + +#define FILE "SDScompound.h5" +#define DATASETNAME "ArrayOfStructures" +#define LENGTH 10 +#define RANK 1 + +int +main(void) +{ + + /* First structure and dataset*/ + typedef struct s1_t { + int a; + float b; + double c; + } s1_t; + s1_t s1[LENGTH]; + hid_t s1_tid; /* File datatype identifier */ + + /* Second structure (subset of s1_t) and dataset*/ + typedef struct s2_t { + double c; + int a; + } s2_t; + s2_t s2[LENGTH]; + hid_t s2_tid; /* Memory datatype handle */ + + /* Third "structure" ( will be used to read float field of s1) */ + hid_t s3_tid; /* Memory datatype handle */ + float s3[LENGTH]; + + int i; + hid_t file, dataset, space; /* Handles */ + herr_t status; + hsize_t dim[] = {LENGTH}; /* Dataspace dimensions */ + + + /* + * Initialize the data + */ + 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. + */ + space = H5Screate_simple(RANK, dim, NULL); + + /* + * Create the file. + */ + file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + + /* + * Create the memory data type. + */ + s1_tid = H5Tcreate (H5T_COMPOUND, sizeof(s1_t)); + H5Tinsert(s1_tid, "a_name", HOFFSET(s1_t, a), H5T_NATIVE_INT); + H5Tinsert(s1_tid, "c_name", HOFFSET(s1_t, c), H5T_NATIVE_DOUBLE); + H5Tinsert(s1_tid, "b_name", HOFFSET(s1_t, b), H5T_NATIVE_FLOAT); + + /* + * Create the dataset. + */ + dataset = H5Dcreate(file, DATASETNAME, s1_tid, space, H5P_DEFAULT); + + /* + * Wtite data to the dataset; + */ + status = H5Dwrite(dataset, s1_tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, s1); + + /* + * Release resources + */ + H5Tclose(s1_tid); + H5Sclose(space); + H5Dclose(dataset); + H5Fclose(file); + + /* + * Open the file and the dataset. + */ + file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + + dataset = H5Dopen(file, DATASETNAME); + + /* + * Create a data type for s2 + */ + s2_tid = H5Tcreate(H5T_COMPOUND, sizeof(s2_t)); + + H5Tinsert(s2_tid, "c_name", HOFFSET(s2_t, c), H5T_NATIVE_DOUBLE); + H5Tinsert(s2_tid, "a_name", HOFFSET(s2_t, a), H5T_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". + */ + status = H5Dread(dataset, s2_tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, s2); + + /* + * Display the fields + */ + printf("\n"); + printf("Field c : \n"); + for( i = 0; i < LENGTH; i++) printf("%.4f ", s2[i].c); + printf("\n"); + + printf("\n"); + printf("Field a : \n"); + for( i = 0; i < LENGTH; i++) printf("%d ", s2[i].a); + printf("\n"); + + /* + * Create a data type for s3. + */ + s3_tid = H5Tcreate(H5T_COMPOUND, sizeof(float)); + + status = H5Tinsert(s3_tid, "b_name", 0, H5T_NATIVE_FLOAT); + + /* + * Read field b from s1 dataset. Field in the file is found by its name. + */ + status = H5Dread(dataset, s3_tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, s3); + + /* + * Display the field + */ + printf("\n"); + printf("Field b : \n"); + for( i = 0; i < LENGTH; i++) printf("%.4f ", s3[i]); + printf("\n"); + + /* + * Release resources + */ + H5Tclose(s2_tid); + H5Tclose(s3_tid); + H5Dclose(dataset); + H5Fclose(file); + + return 0; +} ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +</PRE> +The program outputs the following: +<PRE> + +Field c : +1.0000 0.5000 0.3333 0.2500 0.2000 0.1667 0.1429 0.1250 0.1111 0.1000 + +Field a : +0 1 2 3 4 5 6 7 8 9 + +Field b : +0.0000 1.0000 4.0000 9.0000 16.0000 25.0000 36.0000 49.0000 64.0000 81.0000 + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +</PRE> + +<A NAME="rem"> +<H3><U>Remarks</U></H3> +<UL> +<LI>H5Tcreate creates a new data type of the specified class with +the specified number of bytes. +<PRE> + hid_t H5Tcreate ( H5T_class_t class, size_t size ) +</PRE> +<UL> +<LI>The <I>class</I> parameter specifies the data type to create. +Currently only the H5T_COMPOUND data type class is supported with this +function. +<LI>The <I>size</I> parameter specifies the number of bytes in the +data type to create. +</UL> +<P> +<LI>H5Tinsert adds a member to the compound data type specified by +<I>type_id</I>. +<PRE> + herr_t H5Tinsert ( hid_t type_id, const char * name, off_t offset, hid_t field_id ) +</PRE> +<UL> +<LI>The <I>type_id</I> parameter is the identifier of the compound data type +to modify. +<LI>The <I>name</I> parameter is the name of the field to insert. The new +member name must be unique within a compound data type. +<LI>The <I>offset</I> parameter is the offset in the memory structure of +the field to insert. + +The library defines the HOFFSET macro to compute the offset of a member within +a struct: +<PRE> + HOFFSET ( s, m ) +</PRE> +This macro computes the offset of member <I>m</I> within a struct +variable <I>s</I>. + +<LI>The <I>field_id</I> parameter is the data type identifier of the +field to insert. +</UL> +<P> +<LI>H5Tclose releases a data type. +<PRE> + herr_t H5Tclose ( hid_t type_id ) +</PRE> +The <I>type_id</I> parameter is the identifier of the data type to release. +</UL> +<A NAME="fc"> +<H3><U>File Contents</U></H3> + +<PRE> +HDF5 "SDScompound.h5" { +GROUP "/" { + DATASET "ArrayOfStructures" { + DATATYPE { + H5T_STD_I32BE "a_name"; + H5T_IEEE_F32BE "b_name"; + H5T_IEEE_F64BE "c_name"; + } + DATASPACE { SIMPLE ( 10 ) / ( 10 ) } + DATA { + { + [ 0 ], + [ 0 ], + [ 1 ] + }, + { + [ 1 ], + [ 1 ], + [ 0.5 ] + }, + { + [ 2 ], + [ 4 ], + [ 0.333333 ] + }, + { + [ 3 ], + [ 9 ], + [ 0.25 ] + }, + { + [ 4 ], + [ 16 ], + [ 0.2 ] + }, + { + [ 5 ], + [ 25 ], + [ 0.166667 ] + }, + { + [ 6 ], + [ 36 ], + [ 0.142857 ] + }, + { + [ 7 ], + [ 49 ], + [ 0.125 ] + }, + { + [ 8 ], + [ 64 ], + [ 0.111111 ] + }, + { + [ 9 ], + [ 81 ], + [ 0.1 ] + } + } + } +} +} +</PRE> + + + +<!-- BEGIN FOOTER INFO --> + +<P><hr noshade size=1> +<font face="arial,helvetica" size="-1"> + <a href="http://www.ncsa.uiuc.edu/"><img border=0 + src="http://www.ncsa.uiuc.edu/Images/NCSAhome/footerlogo.gif" + width=78 height=27 alt="NCSA"><br> + The National Center for Supercomputing Applications</A><br> + <a href="http://www.uiuc.edu/">University of Illinois + at Urbana-Champaign</a><br> + <br> +<!-- <A HREF="helpdesk.mail.html"> --> +<A HREF="mailto:hdfhelp@ncsa.uiuc.edu"> +hdfhelp@ncsa.uiuc.edu</A> +<BR> <H6>Last Modified: August 27, 1999</H6><BR> +<!-- modified by Barbara Jones - bljones@ncsa.uiuc.edu --> +</FONT> +<BR> +<!-- <A HREF="mailto:hdfhelp@ncsa.uiuc.edu"> --> + +</BODY> +</HTML> + + + |