【问题标题】:MSVS 2010 C code in HDF-EOS5 errorHDF-EOS5 错误中的 MSVS 2010 C 代码
【发布时间】:2015-10-26 06:55:31
【问题描述】:

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

这是什么错误?

【问题讨论】:

  • 现在找到了解决方案!这段代码是错误的。请参考此链接。 hdfdap.hdfgroup.uiuc.edu/examples/code/…
  • 标准警告:不要将 void * 转换为 malloc 和 C 中的朋友返回的那样。这不是 C++!
  • 哦!我明白。谢谢奥拉夫!

标签: c visual-studio-2010 hdf5


【解决方案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]);

【讨论】:

  • 哦!谢谢!我明白了,谢谢你!真的非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 2012-06-24
  • 2019-12-31
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多