Reading compound type alters all members....

Hi all,

it is mentioned in
http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetPreserve that
H5Pset_preserve is deprecated. I save a class like this one:

class Myclass
{
    std::string m_classname;
    double m_double;
    int m_int;
    std::string m_base;
    std::vector<double> m_vector;
}

It's really a POD class. My compound data type looks like this:

    m_Myclass = H5Tcreate (H5T_COMPOUND, sizeof(Myclass));
    H5Tinsert(m_Myclass, "m_double", HOFFSET(Myclass, m_double),
H5T_NATIVE_DOUBLE);
    H5Tinsert(m_Myclass, "m_int", HOFFSET(Myclass, m_int), H5T_NATIVE_INT);

when I load it back, the double and the int are correctly read, but the
whole object is initialized to something else and therefore completely
destroyed.... any similar expereinces?

Thanks a loT

Dimitris

Hi Dimitris,

···

On Mar 4, 2010, at 3:45 AM, Dimitris Servis wrote:

Hi all,

it is mentioned in http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetPreserve that H5Pset_preserve is deprecated. I save a class like this one:

class Myclass
{
    std::string m_classname;
    double m_double;
    int m_int;
    std::string m_base;
    std::vector<double> m_vector;
}

It's really a POD class. My compound data type looks like this:

    m_Myclass = H5Tcreate (H5T_COMPOUND, sizeof(Myclass));
    H5Tinsert(m_Myclass, "m_double", HOFFSET(Myclass, m_double), H5T_NATIVE_DOUBLE);
    H5Tinsert(m_Myclass, "m_int", HOFFSET(Myclass, m_int), H5T_NATIVE_INT);

when I load it back, the double and the int are correctly read, but the whole object is initialized to something else and therefore completely destroyed.... any similar expereinces?

  Hmm, how is your dataset stored? Can you send us a simple example program that shows the problem?

  Quincey

Hi quincey,

there's really not much more than that. Probably it's my mistake though. If
I create a datatype like

    m_MyFileclass = H5Tcreate (H5T_COMPOUND, sizeof(int) + sizeof(double) );
    H5Tinsert(m_MyFileclass , "m_double", 0, H5T_NATIVE_DOUBLE);
    H5Tinsert(m_MyFileclass , "m_int", sizeof(double), H5T_NATIVE_INT);

and use that one to create the dataset and the normal one to write and read,
the data is mapped correctly. I just had the impression that this mapping
was done internally, i.e. the file data type does not account for the
offsets as laid out in the memory structure. So I assume in the previous
case when I read, it reads everything into a buffer of sizeof(Myclass) and
overwrites with that all data.

Thanks a lot1

-- dimitris

···

2010/3/4 Quincey Koziol <koziol@hdfgroup.org>

Hi Dimitris,

On Mar 4, 2010, at 3:45 AM, Dimitris Servis wrote:

Hi all,

it is mentioned in
http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetPreserve that
H5Pset_preserve is deprecated. I save a class like this one:

class Myclass
{
    std::string m_classname;
    double m_double;
    int m_int;
    std::string m_base;
    std::vector<double> m_vector;
}

It's really a POD class. My compound data type looks like this:

    m_Myclass = H5Tcreate (H5T_COMPOUND, sizeof(Myclass));
    H5Tinsert(m_Myclass, "m_double", HOFFSET(Myclass, m_double),
H5T_NATIVE_DOUBLE);
    H5Tinsert(m_Myclass, "m_int", HOFFSET(Myclass, m_int), H5T_NATIVE_INT);

when I load it back, the double and the int are correctly read, but the
whole object is initialized to something else and therefore completely
destroyed.... any similar expereinces?

Hmm, how is your dataset stored? Can you send us a simple example program
that shows the problem?

Quincey

_______________________________________________
Hdf-forum is for HDF software users discussion.
Hdf-forum@hdfgroup.org
http://mail.hdfgroup.org/mailman/listinfo/hdf-forum_hdfgroup.org