-1

嗨,我正在尝试使用来自http://blog.firetree.net/2006/08/23/nasa-srtm-elevation-data/的代码,但没有成功,经过多次追逐,我发现它失败的地方,但不知道如何解决它,请帮忙,这已经让我头疼了大约 6 个小时。这是失败的线路。data 是指向内存映射文件的空指针。

unsigned short datum=((unsigned short*)data)[i];

我在 OpenSuse 上使用 gcc 编译器。我在64位系统上。提前致谢。

4

3 回答 3

2

我认为这可能是由内存对齐引起的。在某些平台指针值不能转换为某些类型。

例如,一个平台需要 int* 应该与 4 对齐,所以 0x12345 可以是 void* 或 char*,但是如果你将它分配给 int*,就会发生崩溃。

对于您的情况,您可以先将 void 指针转换为 unsigned char*,然后将 2 个 unsigned char 转换为 unsigned short:

unsigned char a =((unsigned char*)data)[i];
unsigned char b =((unsigned char*)data)[i+1]; 
if (platform_is_little_endian()) {
    unsigned short datatum = (b << sizeof(unsigned char)) | a;
}
else {
    // platform is big endian
    unsigned short datatum = (a << sizeof(unsigned char)) | b;
}
于 2012-04-19T02:15:37.273 回答
1

如果你说它在那一点崩溃,那么我想你是在数组之外阅读。但是至少可以说,将指向 unsigned short 的指针存储为 unsigned short 很有趣,这甚至可以编译吗?

于 2012-04-19T01:53:42.197 回答
0

通过结合 Donald Tangs 方法和程序在数组外读取的实现来解决。对于其他潜在用户,当找到 num_rows num_cols 的值时会出现问题,因为作者的平方根函数不是平方根。

于 2012-04-19T16:39:49.287 回答