如何将二维数组设置为二维返回[重复]

Posted

技术标签:

【中文标题】如何将二维数组设置为二维返回[重复]【英文标题】: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。 【参考方案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];)而有很大差异。 很公平。我会读一些关于这个主题的书。

以上是关于如何将二维数组设置为二维返回[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何从二维数组中删除重复项? [关闭]

返回二维数组子数组联通和最大

C 语言二级指针案例 ( 字符串切割 | 返回 二维数组 作为结果 )

将二维 JavaScript 数组转换为一维数组 [重复]

如何将二维数组传递给函数[重复]

php将一个二维数组按照某个字段值合并成一维数组,如果有重复则将重复的合并成二维数组