ISO C90 запрещает массив переменной длины [-Werror = vla] - PullRequest
0 голосов
/ 30 марта 2020

Итак, я создал структуру с именем product и хотел отсортировать массив с этим типом структуры на основе компонента этой структуры, который называется price, и для этого скопировал алгоритм объединенной сортировки.

Я изменил Это немного, чтобы отсортировать массив так, как я хотел, и это работает, если я скомпилирую файл с обычным g cc. Проблема в том, что я могу скомпилировать файл только с помощью этой команды "g cc -Wall -Wextra -Werror -ansi -pedanti c".

Структура:

typedef struct product 
{
   int ident;
   char desc[64]; /* string that describes a product eg. "bread" */
   int price;  /* price of the product*/
   int weight; /* weight of the product eg. 2kg */
   int quant; /* quantity of the product in stock */
   int state_prod;
}product;

Алгоритм объединенной сортировки:

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

    product L[n1];  // line of the error
    product R[n2];  // line of the error

    for (i = 0; i < n1; i++) 
        L[i] = arr[l + i]; 
    for (j = 0; j < n2; j++) 
        R[j] = arr[m + 1+ j]; 

    i = 0; 
    j = 0;
    k = l; 
    while (i < n1 && j < n2) 
    { 
        if (L[i].price < R[j].price) 
        { 
            arr[k] = L[i]; 
            i++; 
        } 
        else if (L[i].price == R[j].price)
        {
           if (L[i].ident < R[j].ident)
           {
              arr[k] = L[i]; 
            i++;
           }
           else
           {
              arr[k] = R[j]; 
            j++;
           }
        }
        else
        { 
            arr[k] = R[j]; 
            j++; 
        } 
        k++; 
    } 

    while (i < n1) 
    { 
        arr[k] = L[i]; 
        i++; 
        k++; 
    } 

    while (j < n2) 
    { 
        arr[k] = R[j]; 
        j++; 
        k++; 
    } 
} 

void mergeSort(product arr[], int l, int r)
{ 
    if (l < r) 
    { 
        int m = l+(r-l)/2; 

        mergeSort(arr, l, m); 
        mergeSort(arr, m+1, r); 

        merge(arr, l, m, r); 
    } 
}

При компиляции я получаю эту ошибку:

In function ‘merge’:
error: ISO C90 forbids variable length array ‘L’ [-Werror=vla]
     product L[n1];
     ^~~~~~~
error: ISO C90 forbids variable length array ‘R’ [-Werror=vla]
     product R[n2];
     ^~~~~~~

Серьезно, любая помощь будет оценена.

Ответы [ 2 ]

1 голос
/ 30 марта 2020
product L[n1];  // line of the error

Эта строка определяет массив переменной длины. То есть массив, размер которого неизвестен во время компиляции. Эта функция не была добавлена ​​в язык C до версии C99, но флаг -ansi G CC указывает на использование правил из более старой версии языка C90.

В более старых версиях языка C вы можете использовать нестандартные функции платформы, такие как alloca (не делайте этого, если вы действительно не знаете, что делаете), или использовать malloc / free для выполнения динамического c выделения памяти:

product* L = malloc(n1 * sizeof(product));
// ...
free(L);
1 голос
/ 30 марта 2020

Вместо этого используйте правильный массив Dynami c. Как:

product *L = malloc(n1 * sizeof(product));

Не забудьте освободить его после окончания использования (в конце функции):

free(L);

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