A qsort függvény paraméterezésében van a hiba? (C)
Üdv!
Létrehozok egy "mátrixot" az alábbi módon:
int ROWS=20, COLUMNS=4, r, c;
double **Matrix = (double**) malloc(ROWS * sizeof(double*));
for (r=0; r<ROWS, r++) Matrix[r] = (double*) malloc(ROWS * sizeof(double));
Vagyis a mátrix tartalma 20 pointer, amik 4 elemű tömbökre mutatnak. A tömböket feltöltjük véletlenszerű számokkal.
A feladat az, hogy qsort segítségével rendezzem sorba a tömböket. Van egy függvény (tetszőleges, double CalcError(double *p)), ami egy tömbre kiszámol egy értéket, ami az összehasonlítás alapja. Van egy "compare" függvény (double CompareFnc(const void* a1, const void* a2)), ami két pointert úgy hasonlít össze, hogy a hozzátartozó tömbökre alkalmazza a függvényt.
A fent említettek helyesen működnek.
A dolog szerintem valahol ott hasal el, hogy rosszul paraméterezem a qsort függvényt.
qsort(Matrix[0], ROWS, sizeof(Matrix[0]), CompareFnc);
Ezután nem változik szinte semmi, az eredeti sorrend marad, néha egy-két elem 0-ra változik, nem értem, miért. (talán rossz memóriacímre hivatkozás?)
A másik ötletem, hogy rossz az egész megközelítés, és ezt így nem is lehet rendezni, de nem látom be, hogy miért nem.
for (r=0; r<ROWS, r++) Matrix[r] = (double*) malloc(ROWS * sizeof(double));
a mallocnál ROWS helyett COLUMNS kell
Majdnem egy hétig törtem a fejem, mire sikerült rájönnöm, mi volt a hiba.
A CompareFnc, ha double* értékeket hasonlít össze, akkor a const void-ként kapott pointert nem (double*)-ként castolni, hanem *(double**)-ként.
Tönkretesz ez a nyelv.
már a qsort hívásánál is látszott hogy a pointer aritmetika nem teljesen világos számodra
de rájöttél, gratula :) programozás az ilyen
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!