繁体   English   中英

ISO C90 禁止变长数组 [-Werror=vla]

[英]ISO C90 forbids variable length array [-Werror=vla]

因此,我创建了一个名为 product 的结构,我想根据该结构的一个名为 price 的组件对具有该结构类型的数组进行排序,为此我复制了一个合并排序算法。

我稍微改变了它以按照我想要的方式对数组进行排序,如果我用普通的 gcc 编译文件,它就可以工作。 问题是我只能使用这个命令“gcc -Wall -Wextra -Werror -ansi -pedantic”来编译文件。

结构:

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];
     ^~~~~~~

认真的任何帮助将不胜感激。

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

这一行定义了一个可变长度数组。 也就是说,一个在编译时大小未知的数组。 此功能直到 C99 修订版才添加到 C 语言中,但 GCC 的-ansi标志指定使用该语言的旧 C90 修订版中的规则。

在 C 语言的旧版本中,您的选择是使用非标准平台功能,如alloca (除非您真的知道自己在做什么,否则不要这样做)或使用malloc / free进行动态内存分配:

product* L = malloc(n1 * sizeof(product));
// ...
free(L);

改用适当的动态数组。 喜欢:

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

完成使用后不要忘记释放它(在函数结束时):

free(L);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM