2014-11-30 2 views
-2

компилятора показывает мне, что:Преобразовать константный недействительный указатель на Int указатель

In function ‘int compare(const void*, const void*)’: 
invalid conversion from ‘const int*’ to ‘int*’ [-fpermissive] 
invalid conversion from ‘const int*’ to ‘int*’ [-fpermissive] 

Это моя функция:

int compare(void const *a, void const *b) { 
    int *a2 = (int*)a; 
    int *b2 = (int*)b; 

    int *uziv1=*((const int**)a2); 
    int *uziv2=*((const int**)b2); 

    if(abs(uziv1[0]) < abs(uziv2[0])) return -1; 
    if(abs(uziv1[0]) > abs(uziv2[0])) return 1; 
    if(abs(uziv1[1]) < abs(uziv2[1])) return -1; 
    if(abs(uziv1[1]) > abs(uziv2[1])) return 1; 

    return 0; 
} 

Мне нужно преобразовать два указатель из ничтожного ИНТА для чтения из массива они указать и сравнить значения. Функция должна иметь заданную подпись, чтобы ее можно было использовать для qsort.

+0

Показать соответствующую часть кода, вызывающего qsort. – 2501

+0

http://stackoverflow.com/q/27166757/971127 – BLUEPIXY

+0

'qsort (array, count, sizeof (int **), compare);' –

ответ

0

Я, наконец исправить с:

... 
    int const *uziv1=*((int const **)a); 
    int const *uziv2=*((int const **)b); 
... 
+2

Редактирование вопросов так, как вы предлагаете, неверно. Вопрос - вопрос и ответ - ответ, и оба должны быть разделены здесь. Этот ответ выглядит для меня прекрасным, поэтому нет оснований жаловаться или понижаться. ЕСЛИ это решение его проблемы, оно должно закончиться также принятым ответом. –

1

Преобразование из const указатель на обычный указатель не допускается, так как это нарушило бы гарантию, данное const (никто не должен быть в состоянии написать к нему).

Однако, поскольку вы хотите читать только эти указатели, можно (и рекомендуется) просто объявить их как const. Тогда вам даже не нужны никакие отливки:

const int *uziv1 = a; 
const int *uziv2 = b; 
Смежные вопросы