구조 배열을 바이트 배열로 변환 한 다음 여러 번 hdf5 데이터 세트에 저장하는 프로그램을 시도하고있었습니다. (Dataset은 100이라는 차원을 가지고 있으므로 Ill는 쓰기 작업을 100 번 수행합니다). 구조를 바이트 배열로 변환하는 데 문제가 없다면 데이터 세트에 데이터를 쓰는 데 필요한 하이퍼 슬랩을 선택하려고 할 때 문제가있는 것처럼 보입니다. 나는 hdf5를 처음 사용합니다. 이 문제를 도와주세요.HDF5 파일 조작의 런타임 오류
#include "stdafx.h"
#include "h5cpp.h"
#include <iostream>
#include <conio.h>
#include <string>
#ifndef H5_NO_NAMESPACE
using namespace H5;
#endif
using std::cout;
using std::cin;
using std::string;
const H5std_string fName("dset.h5");
const H5std_string dsName("dset");
struct MyStruct
{
int x[1000],y[1000];
double z[1000];
};
int main()
{
try
{
MyStruct obj[10];
char* totalData;
char* inData;
hsize_t offset[1],count[1];
H5File file("sample.h5", H5F_ACC_TRUNC);
StrType type(PredType::C_S1,100*sizeof(obj));
Group *myGroup = new Group(file.createGroup("\\myGroup"));
hsize_t dim[] = {100};
DataSpace dSpace(1,dim);
DataSet dSet = myGroup->createDataSet("dSet", type, dSpace);
for(int m = 0; m < 100 ; m++)
{
for(int j = 0 ; j < 10 ; j++)
{
for(int i = 0 ; i < 1000 ; i++) // some random values stored
{
obj[j].x[i] = i*13 + i*19;
obj[j].y[i] = i*37 - i*18;
obj[j].z[i] = (i + 1)/(0.4 * i);
}
}
totalData = new char[sizeof(obj)]; // converting struct to byte array
memcpy(totalData, &obj, sizeof(obj));
cout<<"Start Write.\n";
cout<<"Total Size : "<<sizeof(obj)/1000<<"KB\n";
//Exception::dontPrint();
hsize_t dim[] = { 1 }; //I think am screwing up between this line and following 5 lines
DataSpace memSpace(1, dim);
offset[0] = m;
count[0] = 1;
dSpace.selectHyperslab(H5S_SELECT_SET, count, offset);
dSet.write(totalData, type, memSpace, dSpace);
cout<<"Write Done.\n";
cout<<"Read Start.\n";
inData = new char[sizeof(obj)];
dSet.read(inData, type);
cout<<"Read Done\n";
}
delete myGroup;
}
catch(Exception e)
{
e.printError();
}
_getch();
return 0;
}
내가 얻을 출력은,
을 내가 대신 H5S_SELECT_SET의 H5S_SELECT_APPEND를 사용하는 경우, 출력은
Start Write.
Total Size : 160KB
HDF5-DIAG: Error detected in HDF5 (1.8.12) thread 0:
#000: ..\..\src\H5Shyper.c line 6611 in H5Sselect_hyperslab(): unable to set hyperslab selection
major: Dataspace
minor: Unable to initialize object
#001: ..\..\src\H5Shyper.c line 6477 in H5S_select_hyperslab(): invalid selection operation
major: Invalid arguments to routine
minor: Feature is unsupported
는이 상황을 제발 도와주세요 말한다. 미리 감사드립니다.
독서에 관심이 없다고 가정하고 내가 읽은 부분을 제외하고 파일에 데이터를 계속 작성한다고 가정합니다. 당신의 대답에 따라, 나는 다음과 같은 변화를하면 일이 가능할 것이라고 생각할 것인가? 1) 타입 문을 DataType 타입으로 변경합니다 (H5T_OPAQUE, sizeof (obj)). (필자는 쓰기 작업을 100 번 수행함을 기억하십시오.)이 프로그램에 대한 쓰기 작업을 수행하는 올바른 방법이라고 언급하십시오. – user3297129
예. 크기가 각각'sizeof (obj)'인 요소 100 개를 가진 배열을 만들고 있다는 것을 기억하십시오. HDF5에서 데이터 유형은 배열의 _one_ 요소 유형이며 _dataspaces_는 요소 수를 포함합니다. – Simon