Постоянное значение размера массива! Как это сделать?

Вот часть кода C:

void merge(int arr[], int l, int m, int r)
{
    int i, j, k;
    int n1 = m - l + 1;
    int n2 = r - m;

    /* create temp arrays */
    int L[n1], R[n2];

    /* Copy data to temp arrays L[] and R[] */
    for (i = 0; i < n1; i++)
        L[i] = arr[l + i];
    for (j = 0; j < n2; j++)
        R[j] = arr[m + 1 + j];

    
.
.
.

Для заявления int L[n1],R[n2]; у меня есть эта ошибка:

выражение должно иметь постоянное значение

А этот снимок для лучшего пояснения:

Я запустил этот код на Code::Blocks без проблем и абсолютно чисто! Но на MSVC у меня есть эта проблема.

У меня была эта проблема раньше, и я мог ее исправить, но на этот раз я не мог ее исправить и, возможно, я забыл путь!

Насколько я знаю, есть два способа справиться с этим: 1. Использование #define 2. Использование enum.

Но для этого особого случая, я думаю, ни один из них не может быть полезен. Пожалуйста помоги!

Вы можете использовать malloc и друзей для динамического распределения памяти.

alex01011 12.02.2023 20:15
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
1
55
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

L и R — массивы переменной длины. Не все реализации поддерживают их. В частности, MSVC их не поддерживает.

Ближайшая альтернатива — использовать _alloca, который динамически создает массив в стеке.

int *L = _alloca(n1 * sizeof *L);
int *R = _alloca(n2 * sizeof *R);
Ответ принят как подходящий

Массивы переменной длины были добавлены в C99.

Microsoft C соответствует стандарту для языка C, как указано в редакции 9899:1990 стандарта ANSI C

MSVC не является компилятором C99. Вы можете динамически распределять память с malloc() и семьей.

/* create temp arrays */
    int *L = malloc (n1 * sizeof *L);
    int *R = malloc (n2 * sizeof *R);

/* Check the return value of `malloc().
*  It returns `NULL` to signal failure.
*/

/* some code here .... */

    free (R);
    free (L);

Другие вопросы по теме