2013-06-24 1 views
0

Я пытаюсь выписать вектор 32-разрядного unsigned int в 64-разрядный unsigned long на диск с использованием HDF5; а затем прочитайте это обратно в 32 бит unsigned int в памяти. Для этого мои функции чтения-записи выглядят следующим образом (я все четко определенные функции для push_back, resize и т.д. реализованы для моего 32-битный unsigned int контейнер, my_container):HDF5 выписывает 32-битный без знака int до 64 бит на диске и считывает в 32-битный unsigned int

bool write(const my_container<unsigned int>& p, const std::string& datapath, const H5::DateType& datatype): 
    try { 
     const hsize_t h5size[1] = { p.size() }; 
     const H5::DataSpace h5space(1, h5size); 
     const H5::DataSet h5set = fileptr_->createDataSet(datapath, datatype, h5space); 
     //-Tried using void* here for data, no difference 
     const unsigned int* data = &(*p.begin()); 
     h5set.write(data, datatype); 
    } 
    catch(H5::Exception&) { 
     //-Handle exception here 
     return false; 
    } 
    return true; 
} 

read(my_container<unsigned int>& p, const H5::DataType& datatype, const std::string& datapath) { 
    H5::DataType h5set_datatype = h5set.getDataType(); 
    const std::size_t size = (std::size_t)h5space.getSimpleExtentNpoints(); 
    try { 
     if(h5set_datatype == H5::PredType::NATIVE_UINT64 && datatype == H5::PredType::NATIVE_UINT32) { 
      typedef unsigned long long u64; 
      typedef std::vector<u64> u64vec; 
      u64vec ivector; 
      ivector.resize(size); 
      void* data = (void*)(&(*ivector.begin())); 
      h5set.read(data, h5set_datatype); 
      p.resize(0); 
      BOOST_FOREACH(const u64 &v, ivector) { 
       //-I've handled the cast below using numeric cast separately 
       p.push_back(v); 
      } 
     } //-End compare datatypes on disk and memory 
    } //-End try 
    catch(const H5::Exception &e) { 
     //-Handle exception 
     return false; 
    } 
    return true; 
} 

Я называю write с аргументами : const-ссылка на my_container, H5::Pred::NATIVE_UINT64 и read с аргументами: ссылка на my_container и H5::Pred::NATIVE_UINT32. Возможно, это может быть одним из источников проблемы. Позвольте мне знать, требуется ли дополнительное уточнение. В основном я получаю мусор, когда я его читаю. Оцените предложения от любых экспертов HDF5. Спасибо за ваше время.

+0

Я думаю, что, возможно, я решил проблему с этим - нужно выполнить еще несколько тестов для подтверждения. –

ответ

0

Решение заключается в изменении функции записи, чтобы принимать файлы и данные памяти типов:

bool write(const my_container<unsigned int>& p, const H5::DataType& file_datatype, const H5::DataType& mem_datatype, const std::string& datapath) const { 

    try { 
     const hsize_t h5size[1] = { p.size() }; 
     const H5::DataSpace h5space(1, h5size); 

     const H5::DataSet h5set = fileptr_->createDataSet(datapath, file_datatype, h5space); 
     const void* data = &(*p.begin()); 
     h5set.write(data, mem_datatype); 
    } 
    catch(H5::Exception&) { 
     // Handle exception 
     return false; 
    } 

    return true; 
} 

Тогда остальные работали, как и ожидалось - функция чтения практически не меняется; смог сделать то же самое даже для контейнеров с парами неподписанных целых чисел и так далее. НТН.

+0

Если это решит вашу проблему, не стесняйтесь принимать свой ответ :) – Yossarian

+0

Да, это так! :-) –