Sortowanie tablicy 2-wymiarowej

0

Witam,
Mam tablicę 2-wymiarową, którą chcę posortować według pierwszej kolumny. Postanowiłem użyć funkcji quick sort. Nie mogę sobie jednak poradzić z funkcją sortującą

//alokacja tablicy
int (*polaczenia)[3] = new int[wielkosc][3];

//sortowanie tablicy
qsort(polaczenia, wielkosc, 3*sizeof(int), porownaj);

//funkcja sortujaca
int porownaj(const void * w1, const void * w2){
	const int (*a1)[3] = (int*)w1;
	const int (*a2)[3] = (int*)w2;
	if(*a1 > *a2)
		return 1;
	else if(*a1 == *a2)
		return 0;
	else
		return -1;
}

Dostaję taki błąd:
graf3.cpp29: error: cannot convert ‘int*’ to ‘const int ()[3]’ in initialization
graf3.cpp29: error: cannot convert ‘int
’ to ‘const int (*)[3]’ in initialization

Chodzi dokładnie o 2 pierwsze wiersze funkcji porównaj. W związku z tym, że nie czuję się jeszcze dobrze we wskaźnikach będę wdzięczny za pomoc. Tablica ma być posortowana według pierwszej kolumny.

0

Przerobiłem funkcję:

 
int porownaj(const void * w1, const void * w2){
	const int *a1 = (int*) w1;
	const int *a2 = (int*) w2;
	if(*a1 > *a2)
		return 1;
	else if(*a1 == *a2)
		return 0;
	else
		return -1;
}

Teraz kompiluje się bez błędów, tylko że po uruchomieniu wyświetla w konsoli mnóstwo komunikatów. Prawdopodobnie dlatego, że następuje naruszenie ochrony pamięci. Teraz powstaje pytanie: Gdzie jest błąd?

0
int (*polaczenia)[3] = new int[wielkosc][3];
 

?

0

Jest jakiś błąd w tym wierszu? Wydaje mi się, że to oznacza zaalokowanie miejsca na tablicę polaczenia o 'wielkosc' rzedach i 3 kolumnach.

0

A nie czasem tak?

    int**polaczenia=new int*[wielkosc];
    for(int i=0;i<wielkosc;i++)
        polaczenia[i]=new int[3];
     //*** *** ***
    for(int i=0;i<wielkosc;i++)
        delete polaczenia[i];
    delete[]polaczenia;
0

To chyba na jedno wychodzi, bo u mnie tablica normalnie działa. Tę linijkę akurat przepisałem z symfonii, więc powinno być ok. Do tablicy wczytywane są liczby, jest ona poprawnie wyświetlana. Problem jest tylko w tym, że nie potrafię jej posortować.

0

O ile dobrze rozumiem..

#include <iostream>
#include <algorithm>
bool porownaj(int *w,int*w1){
    return w[0]>w1[0];
}
int main(){
    int wielkosc=5;
    int**polaczenia=new int*[wielkosc];
    for(int i=0;i<wielkosc;i++){
        polaczenia[i]=new int[3];
    }
    for(int i=0;i<wielkosc;i++){
        for(int j=0;j<3;j++){
            polaczenia[i][j]=i+j;
        }
    }
    std::sort(polaczenia,polaczenia+wielkosc,porownaj);
    for(int i=0;i<wielkosc;i++){
        for(int j=0;j<3;j++){
            std::cout<<polaczenia[i][j]<<" ";
        }
        delete polaczenia[i];
        std::cout<<"\n";
    }
    delete[]polaczenia;
    return 0;
}
0

Dzięki wielkie! Problem rozwiązany.

1 użytkowników online, w tym zalogowanych: 0, gości: 1