我想阅读he5
格式,但我在HDF-EOS5
库中有错误。我的库版本是HDF5 1.8.14,EOS5 1.15和MSVS 2010。
这是我的代码:
void main()
{
hid_t gridfileid = 0;
hid_t gridid = 0;
short *terrain[720];
hsize_t i, j;
int a = 0;
for( a = 0; a < 720; a++ )
{
terrain[a] = (short*)malloc(sizeof(short) * 1440);
}
gridfileid = HE5_GDopen( "D:\\MyHDFEOS\\OMI-Aura_L3-OMAEROe_2004m1001_v003-2009m0114t094640.he5", H5F_ACC_RDONLY );
if( gridfileid == FAIL )
{
printf( "he5 File Open FAIL!" );
return;
}
gridid =HE5_GDattach( gridfileid, "ColumnAmountAerosol" );
if( gridid == FAIL )
{
printf( "Grid Open FAIL!" );
return;
}
HE5_GDreadfield( gridid, "TerrainReflectivity", NULL, NULL, NULL, terrain );
HE5_GDdetach( gridid );
HE5_GDclose( gridfileid );
for( i = 0; i < 7; ++i ) {
for( j = 0; j < 14; ++j ) {
printf( "%d", terrain[i][j ]);
}
}
printf("\n");
for( a = 0; a < 720; a++ )
{
free( terrain[a] );
}
free( terrain );
}
此代码错误。
HE5_GDreadfield( gridid, "TerrainReflectivity", NULL, NULL, NULL, terrain );
'HDF-EOS5.exe的0x76f315fe中存在未处理的异常。 0xC0000005:访问冲突'
这是什么错误?
答案 0 :(得分:1)
According to the documentation,
HE5_GDreadfield( gridid, "TerrainReflectivity", NULL, NULL, NULL, terrain );
terrain
参数应该是:
short terrain[720][1440];
这是一个1,036,800字节内存的单个连续块。
但是,您使用:
short *terrain[720];
然后一次分配1440个字节。这相当于720块非连续内存,每个1440字节长,因此您的代码失败。看一下源代码,我看到该函数的声明是:
herr_t HE5_GDreadfield(hid_t gridID, const char *fieldname, const hssize_t start[],
const hsize_t stride[], const hsize_t edge[],
void * buffer);
terrain
参数是void *
,这意味着要传入任何指针,所以如果你使用:
short *terrain;
terrain = malloc(sizeof(short) * 720 * 1440);
/* etc... */
HE5_GDreadfield( gridid, "TerrainReflectivity", NULL, NULL, NULL, terrain );
/* etc... */
free( terrain );
然后访问您必须执行的元素:
printf( "%d", terrain[i * 1440 + j]);
或者,您可以使用:
short (*terrain)[1440];
terrain = malloc(sizeof(short) * 720 * 1440);
/* etc... */
HE5_GDreadfield( gridid, "TerrainReflectivity", NULL, NULL, NULL, terrain );
/* etc... */
free( terrain );
然后,要访问元素,您可以使用更自然的:
printf( "%d", terrain[i][j]);