【问题标题】:How to set 2d array a 2d return [duplicate]如何将二维数组设置为二维返回[重复]
【发布时间】:2013-12-04 16:51:01
【问题描述】:

编辑:可能找到了解决方案

我想将二维数组设置为二维返回,但它总是给我一些无意义的错误:

In function 'int main()':
error: expected primary-expression before ']' token
error: expected primary-expression before ']' token
In function 'int initBoard(int (*)[25])':
error: invalid conversion from 'int (*)[25]' to 'int' [-fpermissive]

我无法弄清楚哪里出了问题以及如何消除错误。

#include <iostream>

using namespace std;

const short WIDTH = 80;
const short HEIGHT = 25;

int clearBoard();
int initBoard(int board[WIDTH][HEIGHT]);
int drawBoard();

int main()
{
     int board[WIDTH][HEIGHT] = {{0}};
     board = initBoard(board); // problem is this place AND should be initBoard(board);
     cout << board[79][24]
     return 0;
}

int initBoard(int board[WIDTH][HEIGHT])
{
    unsigned int localWidth  = 1;
    unsigned int localHeight = 1;

    while(localHeight < HEIGHT)
    {
        while(localWidth < WIDTH)
        {
            board[localWidth][localHeight] = 0;
            localWidth++;
        }
        localHeight++;
        localWidth = 1;
    }
}

【问题讨论】:

  • 欢迎来到 Stack Overflow。请尽快阅读About 页面。您确定您粘贴的代码会生成关于] 的两个错误吗?它不应该;当我编译代码时它不会。 (它合理地抱怨其他事情,但它并没有抱怨。)您可能必须在程序上运行预处理器并查看输出,这可能令人生畏(我从前 17 行得到了 16437 行输出代码行;幸运的是,我只需要查看最后 17 行输出)。如果你使用g++,试试g++ -E program.cpp,看看数组定义是否OK。

标签: c++ arrays multidimensional-array


【解决方案1】:

函数 initBoard 的返回类型为 int:

int initBoard(int board[WIDTH][HEIGHT]);

您试图在 return 语句的函数体内转换为 int type int ( * )[HEIGHT] 类型,并在调用该函数的语句中将一个 int 类型的对象分配给数组。

在 C/C++ 中,数组没有赋值运算符。

按以下方式定义函数就足够了

void initBoard(int board[WIDTH][HEIGHT])
{
    unsigned int localWidth  = 1;
    unsigned int localHeight = 1;

    while(localHeight < HEIGHT)
    {
        while(localWidth < WIDTH)
        {
            board[localWidth][localHeight] = 0;
            localWidth++;
        }
        localHeight++;
        localWidth = 1;
    }
}

并在 main 中调用它

initBoard(board); 

【讨论】:

    【解决方案2】:

    数组总是通过引用传递的,你不需要显式地返回它。您在函数中对其所做的任何更改都是全局的。您收到编译错误是因为二维数组在技术上是“指向 int 指针的指针”或int**。您可以将initBoard 更改为void,它应该可以工作。您不分配数组,而是声明它们。

    您可以进行动态分配而不是编译时间,但是由于您似乎知道数组的大小应该是多少,所以这可能比它的价值更麻烦。

    【讨论】:

    • 此外,该函数被声明为返回int,但您(OP)正试图将数组指针作为int返回。在这种情况下,函数应该返回void,并且应该删除return board; 语句。
    • 天哪;哦亲爱的!不,数组不是int *。我赞成您的原始答案,因为它是准确的,如果有点少的话。我现在投了反对票,因为它是错误的(但如果你修复它,我会删除我的反对票)。在许多情况下,数组的名称转换为int *。然而,在这种情况下,数组是一个二维数组,它变成了一个int (*)[25],一个指向25个数组的指针int。此外,您不能在 C++(或 C)中分配数组。
    • 您已对其进行了修改,但二维数组与int ** 不同。类型的数组和类型的指针之间存在差异。在某些情况下,两者看起来很相似,因为数组会自动转换为指向该类型的指针,但仍然存在差异。查找值 matrix[i][j] 的机制因变量定义是 int matrix[10][20]; 还是 int **matrix;(或者实际上是 int *matrix[10];)而有很大差异。
    • 很公平。我会读一些关于这个主题的书。
    猜你喜欢
    • 2021-08-11
    • 2017-12-22
    • 2020-09-10
    • 1970-01-01
    • 2020-07-06
    • 2017-02-06
    • 2023-04-11
    • 2014-07-01
    • 2021-10-18
    相关资源
    最近更新 更多