Выделение динамического массива внутри структуры - PullRequest
0 голосов
/ 03 апреля 2019

Я устанавливаю структуру, которая определяет полином, то есть содержит две переменные:
- int degree, который содержит степень полинома
- int * coeff = (int*) malloc (degree * sizeof(int)), которая содержит все коэффициенты

Также я определил функцию new_polynome(), которая принимает степень и возвращает указатель на структуру, содержащую полином этой степени со всеми его коэффициентами, установленными в 1;

#include <stdio.h>
#include <stdlib.h>

// 1

typedef struct 
{
    int degree;
    int * coeff = (int *) malloc (degree * sizeof(int));
} polynome;


// 2

polynome * new_polynome(int n)
{
    polynome * newest_polynome = (polynome *) malloc (sizeof(polynome));
    for(int i = 0; i < n; i++)
        newest_polynome->coeff[i] = 1;

    return newest_polynome;
}

int main(void)
{
    polynome * new_polynome = (polynome *) malloc (sizeof(polynome));
    new_polynome = new_polynome(5);

    for(int i = 0; i < 5; i++)
        printf("%d", new_polynome->coeff[i]);

    free(new_polynome->coeff);
    return 0;
}


Однако, когда я пытаюсь вывести его коэффициенты, я получаю следующую ошибку.Есть ли правильный способ сделать это?Я не понимаю сообщение об ошибке. Как мне вывести его коэффициенты? Моя ошибка заключается в следующем:
TD_polynomes.c:9:17: error: expected ‘:’, ‘,’, ‘;’, ‘}’ or ‘__attribute__’ before ‘=’ token int * coeff = (int *) malloc (degree * sizeof(int)); ^ TD_polynomes.c: In function ‘new_polynome’: TD_polynomes.c:19:24: error: ‘polynome {aka struct <anonymous>}’ has no member named ‘coeff’ newest_polynome->coeff[i] = 1; ^~ TD_polynomes.c: In function ‘main’: TD_polynomes.c:27:20: error: called object ‘new_polynome’ is not a function or function pointer new_polynome = new_polynome(5); ^~~~~~~~~~~~ TD_polynomes.c:26:16: note: declared here polynome * new_polynome = (polynome *) malloc (sizeof(polynome)); ^~~~~~~~~~~~ TD_polynomes.c:30:34: error: ‘polynome {aka struct <anonymous>}’ has no member named ‘coeff’ printf("%d", new_polynome->coeff[i]); ^~ TD_polynomes.c:32:22: error: ‘polynome {aka struct <anonymous>}’ has no member named ‘coeff’ free(new_polynome->coeff); ^~

Ответы [ 3 ]

2 голосов
/ 03 апреля 2019

Обычно последние ошибки являются лишь следствием более ранних, и здесь это имеет место. У вас неверное определение полинома. Это приводит к тому, что у него нет члена, называемого coeff.

Вы не можете инициализировать структуру так, как вы это делаете. Удалите вызов malloc в структуре, и вы увидите, что несколько других ошибок волшебным образом исчезнут.

И эта строка: new_polynome = new_polynome(5); не имеет смысла. Кажется, вы пытаетесь выделить место для 5 коффов, но тогда вы совершенно не правы. Вы должны сделать так `new_polynome-> coeff = malloc (5 * sizeof (* (new_polynome-> coeff))

Также не разыгрывает malloc

Существует некоторый код, который вы должны переместить, например, распределение коэффициентов. Это должно идти внутри функции new_polynome, которую я переименовал в create_polynome.

Рабочий (и фиксированный) код:

#include <stdio.h>
#include <stdlib.h>

typedef struct
{
    int degree;
    int *coeff; // No init here. You're just defining a type here.
} polynome;


polynome *create_polynome(int n)
{
    // A polynomial of degree 0 is a constant
    const int N = n+1;

   // You need to set the degree
    new_polynome->degree = n;

    polynome *new_polynome = malloc(sizeof(*new_polynome));
    new_polynome->coeff = malloc(N * sizeof(*(new_polynome->coeff)));
    for(int i = 0; i < N; i++)
        new_polynome->coeff[i] = 1;

    return new_polynome;
}

int main(void)
{
    polynome *new_polynome = create_polynome(5);
    // Looping to degree makes much more sense
    for(int i = 0; i < new_polynome->degree+1; i++)
        printf("%d", new_polynome->coeff[i]);

    free(new_polynome->coeff);
    // Not necessary to free in the end, but if you want to do it,
    // do it properly and free everything. One malloc for each free and
    // vice versa
    free(new_polynome);
    // No need  to return 0 since that's the default in main
}

Я также сделал несколько хороших (субъективно говоря) модификаций, таких как отсутствие пробела между разыменованием * и идентификатором. Также удалено пространство между функциями и паретезом. Кроме того, я использовал размер объекта вместо типа.

И в качестве дополнительного бонуса, функция, которая производит:

polynome *derivate_polynom(polynome *pol)
{
    polynome * derivate = create_polynome(pol->degree - 1);
    for(int i = 0; i < derivate->degree + 1; i++)
        derivate->coeff[i] = (i+1) * pol->coeff[i+1];
    return derivate;
}
1 голос
/ 03 апреля 2019

Недопустимый синтаксис;Вы можете написать

typedef struct 
{
    int degree;
    int coeff[];
} polynome;

polynome *new_polynome(int n)
{
    polynome *p;

    p = malloc(sizeof *p + n * sizeof p->coeff[0]);
    for(int i = 0; i < n; i++)
        p->coeff[i] = 1;

    return p;
}

вместо.Возможно, проверьте на переполнение, когда n является ненадежным пользовательским вводом.

1 голос
/ 03 апреля 2019

1) int * coeff = (int *) malloc (degree * sizeof(int)); - недопустимый синтаксис в определении структуры:

typedef struct 
{
    int degree;
    int * coeff = (int *) malloc (degree * sizeof(int));
} polynome;

Должно быть просто:

typedef struct 
{
    int degree;
    int * coeff;
} polynome;

2) Это неправильно:

polynome * new_polynome = (polynome *) malloc (sizeof(polynome));
new_polynome = new_polynome(5);

Вы присваиваете результат malloc для new_polynome, а затем немедленно перезаписываете его с возвращаемым значением new_polynome(5). Это утечка памяти.

3) Я думаю, вы можете выделить место для N+1 целых чисел вместо N. Полином нулевой степени является константой.

...