2011-12-22 3 views

ответ

5

Нет необходимости в внешней паре скобок, 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; 
} 

Это, наверное, как я пишу это.

+0

Я думаю, что если я удалю (int), он не вернет отрицательное значение, так как вычитание uint - uint всегда неотрицательно, или я ошибаюсь? –

+0

Где находятся неявные скобки в этом. Может быть, '(int) va - (int) vb' на самом деле как' (int) (va - (int) vb) '? Возможно, я ошибаюсь, но я параноик. Я думаю, что я бы написал '((int) va) - ((int) vb)' –

+0

(Не обращайте внимания на мой последний комментарий). Это безопасно. Кастинг произойдет до вычитания. http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence –

Смежные вопросы