1

次の関数でエラーが発生するコードをコンパイルしています。

inline char *align(char *var, DataType_e type)
{
    return (DataTypeSize[type] == 0) ? var :
        (char*) (((unsigned int)(var) + DataTypeSize[type]-1) /
                 DataTypeSize[type] * DataTypeSize[type]);
}

次のエラーは、 "(unsigned int)(var)" と一致しています。

error: cast from 'char*' to 'unsigned int' loses precision

「unsigned int」を「unsigned long」に変更すると、コンパイルは機能しますが、プログラムの実行中に期待した結果が得られません。この問題を解決する方法について何か考えはありますか?

4

3 に答える 3

5

C では[u]intptr_t、ポインターを整数型に変換する必要がある場合に使用する必要があります (ただし、そもそもこれを避ける必要があります)。

それらが存在する場合、これらのタイプは情報を失わないことが保証されます。

于 2012-06-26T13:37:16.690 に答える
3

型はPODへのuintptr_tポインタと同じサイズです。他のデータ型へのポインター、特にメンバー関数へのポインターは、より大きくなる可能性があります。

inline char *align(char *var, DataType_e type)
{
    size_t alignSize = DataTypeSize[type];

    if (1 >= alignSize) {
        return var;
    }

    uintptr_t varInt = reinterpret_cast<uintptr_t>(var);
    varInt = alignSize * ((varInt + alignSize - 1) / alignSize);

    return reinterpret_cast<char *>(varInt);
}
于 2012-06-26T13:50:03.810 に答える
0

ポインターを使用して数学演算を実行する場合は、ポインター値を「int」または「long」にキャストする代わりに、ポインター算術を使用し、計算してポインターにキャストバックする必要があります。コンパイラは計算のアライメントルールを尊重できないため、これは悪い結果になりがちです。

あなたの例の関数の「予期しない」結果は、キャストとはまったく関係がないと確信しています。DataSize[type]値を使用して行われた計算と、それを使用して達成したいことについて詳しく説明する必要があります。

于 2012-06-26T13:16:37.533 に答える