Hi Mathias,
On Feb 24, 2011, at 4:30 PM, Mathias Wilhelm wrote:
> Hi all,
> I am using compound data types with vlen strings and integers. The struct
> containing the strings and integers also contains a couple of methods, which
> prevents me from using the HOFFSET macro, so I used sizeof() and/or the
> getSize() method from the H5 data types to determine the offset of the
> components. This works under my personal 32-bit system, but ends with a
> segmentation fault under a 64-bit system.
> I found out that the offset determined by HOFFSET is different from the
> sizeof() and getSize() methods. I avoided this problem by inserting the int
> as the last element.
> A small sample code is added at the end of this mail.
>
> My test system is:
> > lsb_release -a
> No LSB modules are available.
> Distributor ID: Ubuntu
> Description: Ubuntu 9.10
> Release: 9.10
> Codename: karmic
> > uname -a
> Linux xxxxx 2.6.31-22-generic #70-Ubuntu SMP Wed Dec 1 23:48:17 UTC 2010
> x86_64 GNU/Linux
> > gcc --version
> gcc (Ubuntu 4.4.1-4ubuntu9) 4.4.1
>
> Is this a general problem/issue or due wrong usage?
You should use HOFFSET for inserting your fields into the compound
datatype. The compiler may insert padding before/after fields in the struct
and that information is not reflected in the value returned from getSize().
Quincey
> ~Mathias
>
> ---
>
> #include <iostream>
> #include <string>
>
> using std::cout;
> using std::endl;
> using std::string;
>
> #include "H5Cpp.h"
>
> using namespace H5;
>
> char* tc_string(const string& s) {
> char* ret = new char[s.length() + 1];
> size_t l = s.copy(ret, s.length(), 0);
> ret[l] = 0;
> return ret;
> }
>
> int main(int argc, char* argv[]) {
>
> {
> H5File* file = new H5File("test1.h5", H5F_ACC_TRUNC);
>
> StrType stringtype(PredType::C_S1, H5T_VARIABLE);
>
> struct cv {
> char* id;
> int accession;
> };
> cout << "char* first: " << endl;
> cout << " sizeof(char*) " << sizeof(char*) << endl;
> cout << " stringtype.getSize() " << stringtype.getSize() <<
> endl;
> cout << " HOFFSET(cv, accession) " << HOFFSET(cv, accession)
> << endl;
>
> CompType cvtype(sizeof(cv));
> size_t offset = 0;
> cvtype.insertMember("id", offset, stringtype);
> offset += stringtype.getSize();
> cvtype.insertMember("accession", offset, PredType::NATIVE_INT);
> offset += PredType::NATIVE_INT.getSize();
>
> cv* test = new cv[2];
> test[0].accession = 12;
> test[0].id = tc_string("1.1");
> test[1].accession = 23;
> test[1].id = tc_string("2.2");
>
> DSetCreatPropList cparms;
> hsize_t dimds[1] = { 2 };
> DataSpace dataspace(1, dimds, dimds);
> DataSet ds = file->createDataSet("test1", cvtype, dataspace,
> cparms);
> ds.write(test, cvtype);
> for (int i = 0; i < 2; ++i) {
> delete[] test[i].id;
> }
> delete[] test;
> delete file;
> }
>
> cout << endl;
>
> {
> H5File* file = new H5File("test2.h5", H5F_ACC_TRUNC);
>
> StrType stringtype(PredType::C_S1, H5T_VARIABLE);
>
> struct cv {
> int accession;
> char* id;
> };
>
> cout << "int* first:" << endl;
> cout << " sizeof(int) " << sizeof(int) << endl;
> cout << " PredType::NATIVE_INT " <<
> PredType::NATIVE_INT.getSize() << endl;
> cout << " HOFFSET(cv, id) " << HOFFSET(cv, id) << endl;
>
> CompType cvtype(sizeof(cv));
> size_t offset = 0;
> cvtype.insertMember("id", offset, stringtype);
> offset += stringtype.getSize();
> cvtype.insertMember("accession", offset, PredType::NATIVE_INT);
>
> cv* test = new cv[2];
> test[0].accession = 12;
> test[0].id = tc_string("1.1");
> test[1].accession = 23;
> test[1].id = tc_string("2.2");
>
> DSetCreatPropList cparms;
> hsize_t dimds[1] = { 2 };
> DataSpace dataspace(1, dimds, dimds);
> DataSet ds = file->createDataSet("test2", cvtype, dataspace,
> cparms);
> ds.write(test, cvtype);
> for (int i = 0; i < 2; ++i) {
> delete[] test[i].id;
> }
> delete[] test;
> delete file;
> }
> return 0;
> }
>
> _______________________________________________
> Hdf-forum is for HDF software users discussion.
> [email protected]
> http://mail.hdfgroup.org/mailman/listinfo/hdf-forum_hdfgroup.org
_______________________________________________
Hdf-forum is for HDF software users discussion.
[email protected]
http://mail.hdfgroup.org/mailman/listinfo/hdf-forum_hdfgroup.org