-1

こんにちは、 http://blog.firetree.net/2006/08/23/nasa-srtm-elevation-data/のコードを使用しようとしていますが、成功していません。 、しかし、それを修正する方法がわかりません。助けてください。これは約6時間頭を悩ませています。これは失敗する行です。data は、メモリ マップ ファイルへの void ポインタです。

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

gcc コンパイラを使用して OpenSuse を使用しています。私は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 に答える