2017-09-12 18 views
0

라이브러리 HDF5를 사용하여 바이너리로 저장하고 있습니다.H5 :: CompType을 클래스의 정적 멤버로 초기화하십시오.

사용자 정의 된 "전역"데이터 형식을 갖고 싶습니다. 처음에 초기화 한 다음 필요할 때 사용할 수 있습니다.

예를 들어 "Vector"(두 개의 구성 요소가 x, y 인 구성 요소 인 경우)의 복합 유형을 정의하려고합니다.

나는 (I 기본적으로이 대답에서 걸렸다 : 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; 
} 

코드는 컴파일을하지만 예외가 발생합니다 나는 런타임에 문제를 얻을 :

예외가 발생했습니다. 읽기 액세스 위반입니다.

this-> nullptr입니다.

"this"는 HDF5 라이브러리에서 "IdComponent"라고하는 개체를 나타냅니다. 라이브러리를 파고 들어갈 시간이 없기 때문에 진행 방법을 모르겠습니다. 아마 HDF5를 아는 사람이 해결책을 가지고있을 것입니다!

답변

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를 초기화합니다.

+1

감사합니다. 그게 내 문제를 해결 했어! 할당 된 메모리를 해제해야겠습니까? 소멸자에서 작업을 수행하면 Hdf5 객체가 생성되지 않기 때문에 확실하지 않습니다. 어떻게 생각해? – Turms

+0

valgrind가 개체가 해제되지 않았 음을 알 수 없습니다. 하지만 가장 확실하게 소멸자를 추가해야합니다. –