Нет необходимости в внешней паре скобок, 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;
}
Это, наверное, как я пишу это.
Я думаю, что если я удалю (int), он не вернет отрицательное значение, так как вычитание uint - uint всегда неотрицательно, или я ошибаюсь? –
Где находятся неявные скобки в этом. Может быть, '(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 –