【问题标题】:Array has incomplete element type. What does this mean? [duplicate]数组的元素类型不完整。这是什么意思? [复制]
【发布时间】:2021-01-03 22:10:55
【问题描述】:

我想创建一个数组来存储任何整数 n 的乘法值。 之后,我想将该数组传递给另一个函数并打印出该数组。但是,我收到以下错误:

我的代码:

这是我的 .c 文件:

 #include "multiplication.h"
#include <stdio.h> 
int main(){
int num;
int arr=multiplication(4);
printArray(arr);



}

int mulitpication(int num){
 /* initialize array and build*/
    int arr[num][num];
    for(int i=0; i<num;i++){
        printf("row number: %d ",i);
         for(int j=0;j<num;j++){
             printf("column number: %d", j);
            arr[i][j]= (i+1)*(j+1);
         }
    }
    return arr;
    }

    void printArray(int arr[][]){
    
    int i;
    for(i=0;i<sizeof(arr);i++){
        for(int j=0;j<sizeof(arr);j++){
            printf("%d ",arr[i][j]);
        }
        
    }

这是我的头文件:

void multiplication(int num);
void print(int arr[][]);

错误:

 multiplication.h:4:19: error: array has incomplete element type 'int []'
void print(int arr[][]);
                  ^

【问题讨论】:

    标签: arrays c function-declaration


    【解决方案1】:

    首先,您不要将源文件相互包含,而是将它们编译并链接在一起以形成二进制文件。

    也就是说,实际问题出在您没有显示的代码(multiplication.h 文件)中,但从错误消息中我们可以看到

     void print(int arr[][]);
    

    不是有效的语法。您只能将外部(-most)索引保留为空,所有其他索引必须具有适当的值。类似的东西

    void print(int arr[ ][10]);
                          ^^---------- inner index
                     ^^^------------- outer index
    

    或者,更多维度

        void print(int arr[ ][5][10][15]);
    

    这背后的类比是,对于函数声明器,

    “将参数声明为''类型数组''应调整为''限定类型指针'',....”

    因此,为了进行调整,type 应该在编译时为编译器所知。

    如果是这样的声明

    void print(int arr[][10]);
    

    类型是int[10],但如果语法类似

        void print(int arr[][]);     
    

    是允许的,无法知道类型。因此出现错误。


    其他问题:您似乎还有很多其他问题,例如

    函数定义为

    int mulitpication(int num){  // returning an int
    

    其实你是这样的

    return arr;  //where arr is an array of size int[num][num], defined locally
    

    这是无效的,因为两件事

    • intint[num][num] 不是同一类型。
    • VLA 的范围,即arr 仅限于功能块,您不能让数组将地址返回给调用者并期望一些有意义的东西,因为返回的地址将不再有效。

    我相信,您最好使用分配的内存(malloc() 和家人)并手动跟踪您的索引/元素计数。

    【讨论】:

    • 谢谢@Sourav,但你能解释一下你所说的外部索引是什么意思吗?
    • @Justin 尝试将该插图添加到我的答案中。
    • 好的,我更新了代码:我也包含了我的 .h 文件。我希望能够创建一个数组,然后将其传递给打印函数进行打印。 print 函数不知道列号或行数,它接收参数作为参数。我将如何写它来反映这一点?无效打印(int arr[][int num]);?
    • 关于“要进行调整,编译器应该在编译时知道类型”:不,这不是原因。可以有一个指向 i 完整类型的指针,因此调整 to 指针不需要完整类型。原因是C标准中有一条规则,数组的元素类型必须是完整类型,对于要调整的数组参数,这条规则也不例外。编译器实际上可以接受int a[][] 并将其调整为int (*)[](没有技术障碍);它只是阻止它的规则。
    【解决方案2】:

    要修复printArray 函数,您需要包含数组维度。在 C 中,数组只是一个元素块,在任何地方都没有存储长度。程序员需要通过某种方法来跟踪长度。

    例如:

    // header
    void printArray(int num, int arr[num][num]);
    
    // source file
    void printArray(int num, int arr[num][num])
    {
        for(int i=0;i<num;i++){
            for(int j=0;j<num;j++){
                printf("%d ",arr[i][j]);
    }
    

    对于multiplication 函数,您需要执行类似的操作,调用者应分配数组(例如int arr[num][num];),然后函数应填写数组单元格的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-03
      • 1970-01-01
      • 2015-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多