2015-10-08 2 views
0

У меня возникла проблема с использованием функции сравнения qsort C++ для корректного лексикографического сортировки 2-мерного массива int. Я уже прочитал много подобных вопросов здесь, но без успеха. При создании пользовательской функции сравнения, ее аргументы в видеСортировка 2D-массивов с qsort - правильное typecasting

int compar (const void* p1, const void* p2) 

теперь, я знаю, что это аргументы являются указателями на мой переменные, которые каждый ponters к одной строке моего массива. Я хотел бы индексировать и сравнивать свой массив обычным обычным способом, используя что-то вроде следующего.

if(p1[0] <= p2[0]) {...} 

Потому что я знаю, что формат

p1[i] 

это просто ярлык для арифметики указателей, я думаю, когда я ПОЛУЧАТЬ аргумент «указатель на указатель на INT», я должен типаж и использовать это так:

if(*(int**)p1[0] <= *(int**)p2[0]) {...} 

Компилятор однако дает мне много этих ошибок

main.cpp:8:20: error: ‘const void*’ is not a pointer-to-object type 
main.cpp:8:37: warning: pointer of type ‘void *’ used in arithmetic [-Wpointer-arith] 

Вопрос в том, как правильно вывести этот тип, чтобы он мог сравнивать мои строки. Кроме того, я хотел бы понять, что я делаю неправильно здесь, чтобы избежать ошибок, связанных с указателями, в будущем.

+3

В C++ вы можете захотеть рассмотреть 'std :: sort' вместо' qsort' –

+0

Но по-прежнему необходимо использовать эту функцию пользовательского сравнения, и потому, что мне нужно отсортировать мой массив по-разному - лексикографически на cols 231, 321, 123 и так, это не упрощает, мне все еще нужно приписывать или нет? – fifco

+0

Нет, нет. C++ имеет ** шаблоны **, чтобы обрабатывать типы изящно во время компиляции. 'std :: sort' - яркий пример. –

ответ

0

Это потому, что operator[] имеет преимущество перед литом. b[0] пытается решить сначала. Так что даже если это b[0], он жалуется, что вы выполняете арифметику указателя на void* типа. Вам нужно бросить 1-й.

#include <iostream> 
using namespace std; 

int main() { 
    int a[10]; 
    a[0] = 1337; 
    a[1] = 42; 
    void* b; 
    b = (void*)a; 

    // cout << (int*)b[0] << '\n'; // will break 
    cout << ((int*)b)[0] << '\n'; 

    // dedicated c++ cast imposes more verbose syntax - i.e. you can't miss the() 
    cout << static_cast<int*>(b)[1] << '\n'; 
    return 0; 
} 

Это, как говорится, я бы порекомендовал использовать специальные функции C++ для того, что вы делаете =).

+0

Кажется, что это был преступник, я добавил скобки и компилятор не дает никаких ошибок, спасибо! – fifco

+0

Он объясняет вашу ошибку, но я все еще думаю, что c-style не путь =). Добро пожаловать в любом случае =) – luk32

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