【问题标题】:"error array type has incomplete element type" for a Two-dimensional array二维数组的“错误数组类型具有不完整的元素类型”
【发布时间】:2014-12-27 13:08:32
【问题描述】:

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

这当然不是我的整个程序,而是其中的一部分(当然是简化的)。

当我尝试编译时,“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);
}

【问题讨论】:

  • 您的代码似乎有很多不兼容类型的问题。编译器应该抛出警告或错误。如果没有,请检查您的编译器手册并将警告级别提高到最大。
  • ij 传递给函数没有任何意义。您可以在本地声明它们。
  • 另外,将指针int *LongLargMap 传递给函数没有任何意义。传值int LongLargMap,更快更简单。
  • 您似乎为TableauAfficher 的前两行赋值,但在函数中您似乎尝试读取所有行。读取未初始化的变量是未定义的行为
  • @Dinodzo 你在哪里着急?!首先看我的回答。

标签: c arrays pointers


【解决方案1】:

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

你不能这样做:

char *PointeurTableauAfficher = &TableauAfficher;

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

这是正确的

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

如果你将&amp;TableauAfficher 传递给一个函数,它必须接受正确的类型:

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

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

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

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


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

【讨论】:

    【解决方案2】:

    如果不指定某些维度,您不能将多维数组传递给函数。

    二维数组存储在一维内存中。如果函数不知道上一行的长度,它如何知道如何计算到下一行的偏移量?它不能。所以需要在参数声明中加上行的长度。

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

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

    您也错误地调用了该函数。线路:

    char *PointeurTableauAfficher = &TableauAfficher;
    

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

    【讨论】:

      【解决方案3】:

      表达类型

      &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 没有任何意义

      【讨论】:

        猜你喜欢
        • 2018-01-16
        • 2018-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-06
        • 2012-04-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多