将H5 :: CompType初始化为类

时间:2017-09-12 07:40:52

标签: c++ hdf5 static-members

我正在使用HDF5库来保存二进制文件。

我想要某种用户定义" global"我在开始时初始化的数据类型,然后在需要时使用它。

例如,我想为" Vector"定义一个复合类型。 (它只是一个结构,其组件是两个双精度:x,y)。

我尝试通过以下方式实现这个想法(我基本上从这个答案中得出:https://stackoverflow.com/a/27088552/4746978

// inside Vector.h
struct Vector
{
     double x;
     double y;
}


// inside Hdf5types.h
#include "Vector.h"
class Hdf5types
{

private:
    static H5::CompType m_vectorType;

public:
    static const H5::CompType& getVectorType();

};


//inside Hdf5types.cpp
#include "Hdf5types.h"
H5::CompType Hdf5types::m_vectorType = Hdf5types::getVectorType();

const H5::CompType& Hdf5types::getVectorType()
{
    struct Initializer {
          Initializer() {
              m_vectorType = H5::CompType(sizeof(Vector));
              m_vectorType.insertMember("x", HOFFSET(Vector, x), H5::PredType::NATIVE_DOUBLE);
              m_vectorType.insertMember("y", HOFFSET(Vector, y), H5::PredType::NATIVE_DOUBLE);
          }
     };
     static Initializer ListInitializationGuard;
     return m_vectorType;
}

代码编译但是我在运行时遇到问题,因为抛出异常:

  

抛出异常:读取访问冲突。

     

这 - >是nullptr。

"这"是指一个被称为" IdComponent"在HDF5库中。 我不知道如何继续,因为我没有时间深入图书馆。也许知道HDF5的人有解决方案!

1 个答案:

答案 0 :(得分:1)

您在程序启动期间过早地分配值。所以你是静态赋值调用HDF5库的功能,尚未实例化。所以SIGSEV。

你能做的就是:

// inside Hdf5types.h
#include <H5Cpp.h>
#include "Vector.h"

class Hdf5types{

private:
  static H5::CompType* m_vectorType;

public:
  static const H5::CompType& getVectorType();

  Hdf5types();

};

#include "hdf5types.h"

H5::CompType* Hdf5types::m_vectorType = nullptr; 

Hdf5types::Hdf5types() {}

const H5::CompType& Hdf5types::getVectorType() {
  if (m_vectorType == nullptr) {
    struct Initializer {
      Initializer() {
        m_vectorType = new H5::CompType(sizeof(Vector));
        m_vectorType->insertMember("x", HOFFSET(Vector, x), H5::PredType::NATIVE_DOUBLE);
        m_vectorType->insertMember("y", HOFFSET(Vector, y), H5::PredType::NATIVE_DOUBLE);
      }
    };
    static Initializer ListInitializationGuard;
  }
  return *m_vectorType;
}

这会懒惰地初始化m_vectorType