嗨,我正在尝试使用来自http://blog.firetree.net/2006/08/23/nasa-srtm-elevation-data/的代码,但没有成功,经过多次追逐,我发现它失败的地方,但不知道如何解决它,请帮忙,这已经让我头疼了大约 6 个小时。这是失败的线路。data 是指向内存映射文件的空指针。
unsigned short datum=((unsigned short*)data)[i];
我在 OpenSuse 上使用 gcc 编译器。我在64位系统上。提前致谢。
嗨,我正在尝试使用来自http://blog.firetree.net/2006/08/23/nasa-srtm-elevation-data/的代码,但没有成功,经过多次追逐,我发现它失败的地方,但不知道如何解决它,请帮忙,这已经让我头疼了大约 6 个小时。这是失败的线路。data 是指向内存映射文件的空指针。
unsigned short datum=((unsigned short*)data)[i];
我在 OpenSuse 上使用 gcc 编译器。我在64位系统上。提前致谢。
我认为这可能是由内存对齐引起的。在某些平台指针值不能转换为某些类型。
例如,一个平台需要 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;
}
如果你说它在那一点崩溃,那么我想你是在数组之外阅读。但是至少可以说,将指向 unsigned short 的指针存储为 unsigned short 很有趣,这甚至可以编译吗?
通过结合 Donald Tangs 方法和程序在数组外读取的实现来解决。对于其他潜在用户,当找到 num_rows num_cols 的值时会出现问题,因为作者的平方根函数不是平方根。