Как исправить ошибку Е0028 Выражение должно иметь константное значение на С?

Вот сам код, и в функции ft_print_combn подчеркивается n в int x[n]; с указанием ошибки - "Выражение должно иметь константное значение". Как это исправить, что я делаю не так?

#include <stdio.h>

void ft_putchar(char c)
{
    write(1, &c, 1);
}

void ft_check_print(int x[], int n)
{
    int i = 0;
    int yes = 1;

    while (i < n - 1)
    {
        if (!(x[i] < x[i + 1]))
            yes = 0;
        i++;
    }
    if (yes == 1)
    {
        i = 0;
        while (i < n)
        {
            ft_putchar(x[i]);
            i++;
        }
        if (x[0] != '9' - n + 1)
        {
            ft_putchar(',');
            ft_putchar(' ');
        }
    }
}

void create_while(int x[], int k, int n)
{
    if (k == n - 1)
    {
        x[k] = '0';
        while (x[k] <= '9')
        {
            if (n == 9 && x[0] > '1')
                break;
            ft_check_print(x, n);
            x[k]++;
        }
    }
    else
    {
        x[k] = '0';
        while (x[k] <= '9')
        {
            create_while(x, k + 1, n);
            x[k]++;
        }
    }
}

void ft_print_combn(int n)
{
    int x[n];

    create_while(x, 0, n);
}

int main()
{
    ft_print_combn(2);
    return 0;
}
  • Вопрос задан
  • 322 просмотра
Решения вопроса 1
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
С вообще говоря, не умеет выделять массивы произвольного размера на стеке (вот так как у вас x локальная переменная). Ему надо знать размер массива во время компиляции. Вот про это он и ругается, n - не константа.

Есть расширение VLA, которое есть в стандарте C99. С ним вот такие вот массивы можно заводить. Оно включено не во всех компиляторах из коробки. В некоторых его вообще, наверное, нет.
Попробуйте передать компилятору в ключах флаг -std=c99.

Или, выделяйте массив через malloc (не забудьте free сделать потом).

Еще, можно завести достаточно большой глобальный массив фиксированного размера.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
includedlibrary
@includedlibrary
Компилятор студии не поддерживает массивы переменной длины. Надо использовать malloс и free для выделения памяти. Но лучше не объявлять массивы переменной длины, так как это может вызвать переполнение стека при больших размерах.
Ответ написан
Комментировать
CityCat4
@CityCat4
//COPY01 EXEC PGM=IEBGENER
Не хочет принимать n в качестве значение глубины массива. В С компилятор не умеет в такие штуки - придется явно выделять память:
void ft_print_combn(int n)
{
    int *x;

    x = calloc(n, sizeof(int));
    create_while(x, 0, n);
    free(x);
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы