Вот часть кода 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.
Но для этого особого случая, я думаю, ни один из них не может быть полезен. Пожалуйста помоги!
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);
Вы можете использовать
malloc
и друзей для динамического распределения памяти.