【问题标题】:passing argument 1 of 'a function' makes pointer from integer without a cast传递'a function'的参数1使指针从整数而不进行强制转换
【发布时间】:2021-08-13 02:36:27
【问题描述】:

可能是一个非常简单的问题,但我正在尝试制作一个井字游戏引擎,这就是代码(稍后放它,因为尽管我关闭了三重坟墓,但它仍然将它放在代码块中,如果下面有一些原因)

我收到以下警告: [警告] 传递 'resetboard' 的参数 1 使指针从整数而不进行强制转换

[警告] 传递 'getnewboardO' 的参数 1 使指针从整数而不进行强制转换

[警告] 传递 'printboard' 的参数 1 使指针从整数而不进行强制转换

我是一个初学者,但我在另一个项目中以几乎相同的方式使用 2d bool 数组,所以我对自己做错了什么感到困惑。


void getnewboardO(char board[3][3])
{
    char inputrow;
    
    int inputcoloumn;
    
    scanf("%c%d", &inputrow, &inputcoloumn);
    
    inputcoloumn--;
    
    if(inputrow=='A')
        board[0][inputcoloumn]='O';
    
    if(inputrow=='B')
        board[1][inputcoloumn]='O';
        
    if(inputrow=='C')
        board[2][inputcoloumn]='O';
}

void resetboard(char board[3][3])
{
    int i, j;
    
    for (i=0;i<2;i++)
        for (j=0;j<3;j++)
            board[i][j]='_';
    for (j=0;j<3;j++)
        board[2][j]=' ';
}

void printboard(char board[3][3])
{
    printf("%c|%c|%c\n%c|%c|%c\n%c|%c|%c",board[0][0], board[0][1], board[0][2], board[1][0], board[1][1], board[1][2], board[2][0], board[2][1], board[2][2]);
}


main()
{
    char board[3][3];
    
    resetboard(board[3][3]);
    
    printf("_|_|_\n_|_|_\n | |");
    
    getnewboardO(board[3][3]);
    
    printboard(board[3][3]);
}

【问题讨论】:

  • resetboard(board[3][3]); ==> resetboard(board); board[3][3] 是一个整数 char 值(但索引超出范围),而不是(指向)数组本身。
  • 呃,我必须承认,出于信任我做了你所说的,但它给了我大量 [错误] 下标值既不是数组也不是指针也不是向量
  • @AnProg 你也没有将char board[3][3]; 更改为char board; 或更改函数签名,是吗?
  • 还有另外两个需要改变的地方(调用另外两个函数)。我的测试程序编译干净。请注意,我建议更改电话 resetboard(board[3][3]); 而不是 void resetboard(char board[3][3])
  • 我是个白痴,抱歉现在编译时没有警告

标签: c function multidimensional-array implicit-conversion function-call


【解决方案1】:

让我们以这个函数声明为例。

void getnewboardO(char board[3][3]);

编译器会将具有数组类型的参数调整为指向数组元素类型的指针。

也就是这个函数声明等价于

void getnewboardO(char ( *board )[3]);

你甚至可以像这样声明函数

void getnewboardO(char board[100][3]);

void getnewboardO(char board[10][3]);

在任何情况下,编译器都会将两个函数声明都调整为函数

void getnewboardO(char ( *board )[3]);

但是在函数调用中

getnewboardO(board[3][3]);

您正在使用char 类型的阵列板的不存在元素,因为两个索引的有效范围都是[0, 3)

就是这个表达式用作参数

board[3][3]

不表示声明的数组board。它表示char 类型的标量不存在对象,由于整数提升依次转换为int 类型。

您需要将整个数组传递给函数。那就是你需要写的是

getnewboardO(board);

在这种情况下,数组指示符将转换为指向其类型为 char ( * )[3] 的第一个元素的指针,作为函数参数的类型。

【讨论】:

    猜你喜欢
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-18
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多