1
int compare_acd(const void *a, const void * b)
{
return ((int)(*((ADC_VALUE_TYPE*)a)) - (int)(*((ADC_VALUE_TYPE*)b)));
}
私の場合ADC_VALUE_TYPE
はuint16_t
ですが、これはルールではありません。このダブルキャスティングは有効なコードですか?
int compare_acd(const void *a, const void * b)
{
return ((int)(*((ADC_VALUE_TYPE*)a)) - (int)(*((ADC_VALUE_TYPE*)b)));
}
私の場合ADC_VALUE_TYPE
はuint16_t
ですが、これはルールではありません。このダブルキャスティングは有効なコードですか?
括弧の外側のペアは必要ありません。return
は機能ではありません。
それ以外は、私は問題を見ることができません...逆参照の前にポインタをキャストして、適切なビット数を読み取ってから「アップキャスト」をint
に送ります。
更新:あなたのコメントに基づいて、たとえばa
で指される値はb
で指される値よりも小さいので、符号付きの型に変換する必要があります。私はそれが必須かどうかは100%ではないが、少なくともそれは何が起こっているかはかなり明確だとは思えない。それがさらに明確にするため、複数の文に分けることができもちろん
:
私はそれを書くだろうか、おそらくだint compare_acd(const void *a, const void * b)
{
const ADC_VALUE_TYPE va = *(ADC_VALUE_TYPE) a;
const ADC_VALUE_TYPE vb = *(ADC_VALUE_TYPE) b;
/* Cast to int to get signed response if a < b. */
return (int) va - (int) vb;
}
。
uint - uintを減算すると常に負でないか、間違っているため、削除(int)すると負の値が返されないと思いますか? –
ここに暗黙の括弧が入っています。おそらく '(int)va - (int)vb'は実際に'(int)(va - (int)vb) 'のようなものでしょうか?私はおそらく間違っていますが、私は妄想しています。私は '((int)va) - ((int)vb)' –
(最後のコメントは気にしないでください)と書くと思います。安全。キャスティングは減算の前に行われます。 http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence –