KUDO_WYF 2023-06-16 00:19 采纳率: 83.3%
浏览 24
已结题

关于Arduino中二维数组作为函数参数的问题

我有一个关于Arduino里,二维数组作为函数参数的问题
代码如下:

char tastatur[3][3] = {
  {'a','c','1'},
  {'g','8','5'},
  {'q','Q','s'}
};

void ausgabe(char *tas,int hangshu,int lieshu);

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  ausgabe(tastatur,3,3);
}


void ausgabe(char *tas,int hangshu,int lieshu){
  for(int i = 0;i < hangshu;i++)
  {
    for(int j = 0;j < lieshu;j++)
    {
      Serial.println(tas[i][j]);
      delay(1000);
    }
  }
}

编译后报了如下错误:
Compilation error: cannot convert 'char ()[3]' to 'char' for argument '1' to 'void ausgabe(char*, int, int)'
具体报错信息如下:

C:\Users\91274\AppData\Local\Temp\.arduinoIDE-unsaved2023515-5160-1inuzg1.r527\sketch_jun15a\sketch_jun15a.ino: In function 'void loop()':
C:\Users\91274\AppData\Local\Temp\.arduinoIDE-unsaved2023515-5160-1inuzg1.r527\sketch_jun15a\sketch_jun15a.ino:16:23: error: cannot convert 'char (*)[3]' to 'char*' for argument '1' to 'void ausgabe(char*, int, int)'
   ausgabe(tastatur,3,3);
                       ^
C:\Users\91274\AppData\Local\Temp\.arduinoIDE-unsaved2023515-5160-1inuzg1.r527\sketch_jun15a\sketch_jun15a.ino: In function 'void ausgabe(char*, int, int)':
C:\Users\91274\AppData\Local\Temp\.arduinoIDE-unsaved2023515-5160-1inuzg1.r527\sketch_jun15a\sketch_jun15a.ino:25:30: error: invalid types 'char[int]' for array subscript
       Serial.println(tas[i][j]);
                              ^

exit status 1

Compilation error: cannot convert 'char (*)[3]' to 'char*' for argument '1' to 'void ausgabe(char*, int, int)'

如果把函数ausgabe()里面的for循环直接放在loop里是没有问题的。
就想知道如果二维数组作为函数参数需要注意些什么,为什么这里会报错。

  • 写回答

1条回答 默认 最新

  • Minuw 2023-06-16 08:30
    关注
    #include <stdio.h>
     
    #define ROW 2   //二维数组的行数
    #define COL 2   //二维数组的列数
     
    //4个版本的求和函数
    //方式一:数组形式
    int TwoDimArraySum1(int twoDimAr[][COL], int row, int col);
     
    //方式二:指针形式,prArray是一个指向包含COL个int的数组的指针
    int TwoDimArraySum2(int (*prArray)[COL], int row, int col);
     
    //方式三:指针形式,pr是一个指向int的指针
    int TwoDimArraySum3(int *pr, int row, int col);
     
    //方式四:变长数组(C99开始支持)
    int TwoDimArraySum4(int row, int col, int twoDimAr[row][col]);
     
    int main(void)
    {
        int twoDimArray[ROW][COL] = {{-2, 5}, {4, 9}};
        int result;
     
        //方式一
        result = TwoDimArraySum1(twoDimArray, ROW, COL);
        printf("Sum1函数结果:%d\n", result);
     
        //方式二
        result = TwoDimArraySum2(twoDimArray, ROW, COL);
        printf("Sum2函数结果:%d\n", result);
     
        //方式三
        result = TwoDimArraySum3(twoDimArray[0], ROW, COL);
        printf("Sum3函数结果:%d\n", result);
     
        //方式四
        result = TwoDimArraySum4(ROW, COL, twoDimArray);
        printf("Sum4函数结果:%d\n", result);
     
        return 0;
    }
     
    int TwoDimArraySum1(int twoDimAr[][COL], int row, int col)
    {
        int i, j;
        int result = 0;
     
        for (i = 0; i < row; i++)
        {
            for (j = 0; j < col; j++)
            {
                //下面两种寻址方式都行
                result += twoDimAr[i][j];
                // result += *(*(twoDimAr + i) + j);
            }
        }
        return result;
    }
     
    int TwoDimArraySum2(int (*prArray)[COL], int row, int col)
    {
        int i, j;
        int result = 0;
     
        for (i = 0; i < row; i++)
        {
            for (j = 0; j < col; j++)
            {
                //下面两种寻址方式都行
                result += prArray[i][j];
                // result += *(*(prArray + i) + j);
            }
        }
        return result;
    }
     
    int TwoDimArraySum3(int *pr, int row, int col)
    {
        int i, j;
        int result = 0;
     
        for (i = 0; i < row; i++)
        {
            for (j = 0; j < col; j++)
            {
                //下面两种寻址方式都行
                result += pr[i*col + j];
                // result += *(pr + i*col + j);
            }
        }
        return result;
    }
     
    int TwoDimArraySum4(int row, int col, int twoDimAr[row][col])
    {
       int i, j;
       int result = 0;
     
       for (int i = 0; i < row; i++)
       {
           for (int j = 0; j < col; j++)
           {
               //下面两种寻址方式都行
               result += twoDimAr[i][j];
               // result += *(*(twoDimAr+ i) + j);
           }
       }
       return result;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月18日
  • 已采纳回答 6月18日
  • 创建了问题 6月16日

悬赏问题

  • ¥15 做数电题要具体的步骤
  • ¥20 PDF元数据中的XMP媒体管理属性
  • ¥15 R语言中lasso回归报错
  • ¥15 网站突然不能访问了,上午还好好的
  • ¥15 有没有dl可以帮弄”我去图书馆”秒选道具和积分
  • ¥15 semrush,SEO,内嵌网站,api
  • ¥15 Stata:为什么reghdfe后的因变量没有被发现识别啊
  • ¥15 振荡电路,ADS仿真
  • ¥15 关于#c语言#的问题,请各位专家解答!
  • ¥15 这个如何解决详细步骤