"错误数组类型具有不完整的元素类型"对于二维数组

时间:2014-10-31 09:04:17

标签: c arrays pointers

从今天早上开始,我试图找到如何从二维数组中编辑特定单元格,但是我试图让我的代码更干净(想要制作函数并让它们一起工作),我会陷入困境。

这当然不是我的整个计划,而是一部分(当然是简化的)。

当我尝试编译时,我在“char * TableauAfficher [] []”上遇到以下错误:

“错误数组类型具有不完整的元素类型”

#include <stdio.h>
#include <stdlib.h>

void AffTableau(int *i, int *j, char *TableauAfficher[][], int *LongLargMap) //ERROR
{
   for (i=0; i<LongLargMap; i++) {
    for(j=0; j<LongLargMap; j++) {
        printf("Tableau[%d][%d] = %c\n", i, j, TableauAfficher[i][j]);
    }
    printf("\n");
}

int main()
{
    int i, j;
    int LongLargMap = 5;

    char SaisieDirection;
    int SaisieNombre;

    char TableauAfficher[5][5];

    int *Pointeuri = &i;
    int *Pointeurj = &j;
    int *PointeurLongLargMap = &LongLargMap;
    char *PointeurTableauAfficher = &TableauAfficher;

    TableauAfficher [0][0] = 'V';
    TableauAfficher [0][1] = 'V';
    TableauAfficher [0][2] = 'A';
    TableauAfficher [0][3] = 'V';
    TableauAfficher [0][4] = 'V';

    TableauAfficher [1][0] = 'V';
    TableauAfficher [1][1] = 'V';
    TableauAfficher [1][2] = 'A';
    TableauAfficher [1][3] = 'V';
    TableauAfficher [1][4] = 'V';

    AffTableau(Pointeuri, Pointeurj, PointeurTableauAfficher, PointeurLongLargMap);
}

3 个答案:

答案 0 :(得分:4)

表达类型

&TableauAfficher

char ( * )[5][5]

当您尝试将此表达式分配给类型为char *

的指针时
char *PointeurTableauAfficher = &TableauAfficher;

在函数中,相应的参数定义为

char *TableauAfficher[][]

编译器需要知道大小的最右边的值。如果没有此信息,则数组TableauAfficher的元素类型不完整。

是否必须将参数定义为

char TableauAfficher[][5]

char ( *TableauAfficher )[5][5]

取决于你将如何在函数中使用它。

另一种方法是使用可变长度数组(如果您的编译器支持VLA) 这是一个示范程序

#include <stdio.h>

void AffTableau( size_t n, char TableauAfficher[][n] )
{
    for ( size_t i = 0; i < n; i++ ) 
    {
        for ( size_t j = 0; j < n; j++ ) 
        {
            printf( "Tableau[%zu][%zu] = %c\n", i, j, TableauAfficher[i][j] );
        }
        printf("\n");
    }       
}

int main(void) 
{
    char TableauAfficher[5][5] = { { '\0' } };

    TableauAfficher [0][0] = 'V';
    TableauAfficher [0][1] = 'V';
    TableauAfficher [0][2] = 'A';
    TableauAfficher [0][3] = 'V';
    TableauAfficher [0][4] = 'V';

    TableauAfficher [1][0] = 'V';
    TableauAfficher [1][1] = 'V';
    TableauAfficher [1][2] = 'A';
    TableauAfficher [1][3] = 'V';
    TableauAfficher [1][4] = 'V';

    AffTableau( 5, TableauAfficher );

    return 0;
}

输出

Tableau[0][0] = V
Tableau[0][1] = V
Tableau[0][2] = A
Tableau[0][3] = V
Tableau[0][4] = V

Tableau[1][0] = V
Tableau[1][1] = V
Tableau[1][2] = A
Tableau[1][3] = V
Tableau[1][4] = V

Tableau[2][0] = 
Tableau[2][1] = 
Tableau[2][2] = 
Tableau[2][3] = 
Tableau[2][4] = 

Tableau[3][0] = 
Tableau[3][1] = 
Tableau[3][2] = 
Tableau[3][3] = 
Tableau[3][4] = 

Tableau[4][0] = 
Tableau[4][1] = 
Tableau[4][2] = 
Tableau[4][3] = 
Tableau[4][4] = 

我认为声明函数参数int *iint *j

没有任何意义

答案 1 :(得分:2)

你有很多错误,让我指出一些,以帮助你开始。

你不能这样做:

char *PointeurTableauAfficher = &TableauAfficher;

PointeurTableauAfficher是指向char的指针,&TableauAfficher是指向[] [5]维的char数组的指针。

这是正确的

char (*PointeurTableauAfficher)[][5] = &TableauAfficher;

如果您将&TableauAfficher传递给某个函数,则必须接受正确的类型:

void AffTableau(int *i, int *j, char (*TableauAfficher)[][5], int *LongLargMap) {

请注意,5是硬编码的,因此只传递内部大小为5的数组。

由于TableauAfficher是指向数组而不是实际数组的指针,因此必须首先取消引用它才能到达数组。

(*TableauAfficher)[1][1] = 'a' ;


该函数的for循环中也缺少右括号。

答案 2 :(得分:2)

您无法将多维数组传递给函数,而无需指定某些维度。

2D数组存储在1D内存中。如果函数不知道前一行的长度,函数如何知道如何计算下一行的偏移量?它不可能。因此,您需要将行的长度添加到参数声明。

此外,数组元素的类型似乎是char,而不是char *

因此,函数参数应为:char TableauAfficher[][5]

您也在错误地调用该函数。行:

char *PointeurTableauAfficher = &TableauAfficher;

不正确,毫无意义。您可以直接将TableauAfficher传递给函数。