[C] Funkcja malloc, błąd kompilacji

0

Witam napisałem częściowo program, który mieliśmy oddać na zajęcia, ale mój nauczyciel zmiótł go w większości i napisał se od nowa bo się nie podobało. Po usunięciu prawie wszystkich błędów kompilacji został mi taki który moim zdaniem implikuje pozostałe. Nie wiem co gość nie tak napisał w tej funkcji i czy w ogóle jest błąd.
Wrzucam

 

matrix_w       *
makem(int lw, int lk)
{
        int             i;
        matrix_w       *nm = malloc(*nm);
        if (nm == NULL)
                return NULL;
        nm->wn = lw;
        nm->kn = lk;
        if ((nm->q = malloc(lw * sizeof *nm->q)) == NULL) {
                free(nm);
                return NULL;
        }
        nm->q[0] = malloc(lw * lk * sizeof *nm->q[0]);

        for (i = 1; i < lw; i++)
                nm->q[i] = nm->q[i - 1] + lk;

        return nm;
}

A oto przedefiniowana struktura martrix_w

 

typedef struct {
        double        **q;
        int             wn;
        int             kn;
}               matrix_w;

I błąd kompilacji w 5 linijce zamieszczonego kodu.

macierze.c: In function 'makem':
macierze.c error: incompatible type for argument 1 of 'malloc'

0

A co wg ciebie znaczy na przykład:

*nm = malloc(*nm)

lub

malloc(lw * sizeof *nm->q))

?
W pierwszym przypadku alokujesz losową wartość pamięci (zalezy od wartości która znajduje się pod adresem na który wskazuje w danej chwili nm)
W drugim przypadku nie bardzo rozumiem sizeof() czego chcesz pobrać.

0

To może powinno tam być sizeof *nm->q[0], nie wiem.

A w tym pierwszym powinno być użyte jakoś sizeof?

Nie wiem może mojemu nauczycielowi chciało się mnie sprawdzić, jak tak to głupi cham.

0

Chłopie ty w ogóle masz JAKIEKOLWIEK pojęcie o języku w którym próbujesz coś napisać? (pytanie retoryczne, wiem że nie...)
Pierwszy malloc() miał zapewne wyglądać tak:

matrix_w *nm = malloc(sizeof(matrix_w));

Można równie dobrze napisać tam

matrix_w *nm = malloc(sizeof(*nm));

Drugi malloc (ten w if) zapewne miał wyglądać tak:

nm->q = malloc(lw * sizeof(nm->q))

Trzeci malloc zapewne miał wyglądać tak:

nm->q[0] = malloc(lw * lk * sizeof(double));

Co można zapisać równoważnie:

nm->q[0] = malloc(lw * lk * sizeof(nm->q[0]));
0

Dzięki, mam jeszcze jeden problem.

W innej funkcji kompilator sadzi błedy o zły return. W tej funkcji znajduje się wywołanie makem, więc myślałem że jak to rozwiąże to będzie git, ale błędy zostały.

Oto one:

macierze.c: In function 'read':
macierze.c error: incompatible types in return
macierze.c error: incompatible types in return
macierze.c error: incompatible types in return
macierze.c error: incompatible types in return
macierze.c warning: control reaches end of non-void function

oraz kod funkcji read

 
matrix_w
read(FILE * p)
{

        int             n         , m, i = 0, j;        /* zmienne robocze */
        matrix_w       *a;

        if (fscanf(p, "%d %d", &n, &m) != 2)
                return NULL;

        if ((a = makem(n, m)) == NULL)
                return NULL;


        /* pomijamy spacje po liczbie */
        /* elementow */
        for (i = 0; i < n; i++) {
                for (j = 0; j < m; j++) {
                        if ((fscanf(p, "%lf", a->q[i] + j)) != 1)
                                return NULL;
                }
        }

        return a;
}

0
matrix_w read(FILE * p)

oznacza że program oczekuje że ta funkcja zwróci mu obiekt matrix_w
A co robisz?

matrix_w *a; //a jest wskaźnikiem (!) na matrix_w
//
return a; //?

Więc zdecyduj sie czy chcesz zeby ta metoda zwróciła wskaźnik (wtedy zmieniasz nagłówek funkcji) czy obiekt, wtedy dodajesz gwiazdkę przed 'a' w returnie).
(patrząc na jakieś zwracanie tam NULLi to jednak chyba opcja nr 1 jest poprawna).

0

Niestety nie mogę sobie dać radę z qsortem, chciałem wykorzystać standarowego.

Napiszę na czym polega problem. Przechowuje macierz w strukturze, gdzie p jest tablicą wskaźników na wiersze. Potrzebne mi jest usortowanie wierszy według pierwszego elementu wiersza. Czytałem kilka przykładów, ale nie mogę tego w pełni u siebie zrobić napisałem:

 
matrix_w *
szereguj( matrix_w* a)
{
        qsort(a->q,6,sizeof (int) , por);
        return a;
}



int     por( const void *a, const void *b )
{
        if(*(const int*)a>*(const int*)b)
                return  *(const int*)a;
       return   *(const int*)b;
}

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