Ошибка в динамическом распределении памяти в C - PullRequest
0 голосов
/ 15 апреля 2011

Я пытаюсь вычислить определитель матрицы NxN. Этот фрагмент кода выдает ошибку в строках, где я пытаюсь выделить память динамически.

ошибка: значение типа "int" нельзя присвоить объекту типа "float *"

ошибка: значение типа "int" нельзя присвоить объекту типа "float **"

double CalcDeterminant( float **mat, int order)
{
    float **minor;
    unsigned short i;
    float det = 0;
    // order must be >= 0
    // stop the recursion when matrix is a single element
    if( order == 1 )
        return mat[0][0];

    // the determinant value
    // allocate the cofactor matrix

    **minor = malloc((order-1) * sizeof(float *));
    for(i=0;i<order-1;i++)
        minor[i] = malloc((order-1) * sizeof(float));**

    //float *mat2d = malloc( rows * cols * sizeof( float ));
    for(i = 0; i < order; i++ )
    {
        // get minor of element (0,i)
        GetMinor( mat, minor, 0, i , order);
        // the recusion is here!

        det += (i%2==1?-1.0:1.0) * mat[0][i] * CalcDeterminant(minor,order-1);
        //det += pow( -1.0, i ) * mat[0][i] * CalcDeterminant( minor,order-1 );
    }

    // release memory
    for(i=0;i<order-1;i++)
        free(minor[i]);
    free(minor);
    return det;
}

Ответы [ 2 ]

5 голосов
/ 15 апреля 2011

Вам необходимо добавить строку #include <stdlib.h>, чтобы malloc() был правильно объявлен.

В нынешнем виде компилятор работает очень слабо (режим C89) и допускает неявные объявления функций, поэтому, когда компилятор сталкивается с malloc(), он предполагает, что это функция, которая возвращает int вместо правильно void *.

Вам нужно изменить параметры компиляции, пока компилятор не будет жаловаться громче. Например, если вы используете GCC, вы должны учитывать:

gcc -std=c99 -Wall -Wextra -Wstrict-prototypes -Wmissing-prototypes ...

Вы можете предпочесть или даже использовать -std=gnu99 вместо -std=c99; это позволяет использовать многие расширения, все еще используя основной язык C99. Но использование опций в том же духе и отсутствие предупреждений о компиляции - хорошая дисциплина. Использование -Werror усиливает дисциплину; он преобразует любое предупреждающее сообщение от компилятора в ошибку, поэтому компиляция не удалась.

3 голосов
/ 15 апреля 2011

Вам необходимо включить заголовочный файл stdlib.h.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...