HDF-EOS5中的MSVS 2010 C代码错误

时间:2015-08-04 02:16:42

标签: c visual-studio-2010 hdf5

我想阅读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:访问冲突'

这是什么错误?

1 个答案:

答案 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]);