2

我试图从一个较小的二维数组对象返回一个数组数据成员,并试图将数组插入到一个更大的二维数组对象中。但是在尝试这个时,我遇到了两个问题。

第一个问题是我想返回二维数组的名称,但我不知道如何正确地返回二维数组名称。

这就是我的二维数组数据成员的样子

私人的:
intpieceArray[4][4];
// 2D 较小的数组

我想将此数组返回到一个函数中,但这会导致编译器错误:

int Piece::returnPiece()
{
    返回片数组;//无效
    // 返回二维数组名
}

我厌倦了使用这种返回类型并且它起作用了:

int Piece::returnPiece()
{
    返回片数组[4][4];
}

但我不确定这是否是我想要的,因为我想返回数组及其所有内容。

另一个问题是 InsertArray() 函数,我将 returnPiece() 函数放在 InsertArray() 的参数中。

InsertArray() 的问题是参数,下面是它的代码:

void Grid::InsertArray( int arr[4][4] ) //编译器接受,但不起作用
{
    for(int i = 0; i < x_ROWS ; ++i)
    {
         for (int j = 0; j < y_COLUMNS ; ++j)
         {
             平方[i][j] = arr[i][j];
         }
    }
}

问题是它不接受我的 returnPiece(),如果我删除“[4][4]”,我的编译器不接受。

大多数这些都是语法错误,但我该如何解决这些问题呢?

  1. 在 returnPiece() 中返回整个pieceArray
  2. InsertArray() 中参数的正确语法
  3. InsertArray() 的参数接受 returnPiece()

这三个是我需要帮助的主要问题,并且在我尝试使用指针指针方法时遇到了同样的问题。有谁知道如何解决这三个问题?

4

4 回答 4

4

在传递数组时,您必须决定是否要制作数组的副本,或者是否只想返回指向数组的指针。对于返回数组,您不能(轻松)返回副本 - 您只能返回指针(或 C++ 中的引用)。例如:

// Piece::returnPiece is a function taking no arguments and returning a pointer to a
// 4x4 array of integers
int (*Piece::returnPiece(void))[4][4]
{
    // return pointer to the array
    return &pieceArray;
}

要使用它,请像这样调用它:

int (*arrayPtr)[4][4] = myPiece->returnPiece();
int cell = (*arrayPtr)[i][j];  // cell now stores the contents of the (i,j)th element

请注意类型声明和使用它之间的相似性——括号、取消引用运算符*和方括号位于相同的位置。

你的声明Grid::InsertArray是正确的 - 它有一个参数,它是一个 4x4 整数数组。这是按值调用:无论何时调用它,都会复制 4x4 数组,因此您所做的任何修改都不会反映在传入的数组中。如果您想使用按引用调用,您可以将指针传递给数组:

// InsertArray takes one argument which is a pointer to a 4x4 array of integers
void Grid::InsertArray(int (*arr)[4][4])
{
     for(int i = 0; i < x_ROWS; i++)
     {
         for(int j = 0; j < y_COLUMNS ; j++)
             squares[i][j] = (*arr)[i][j];
     }
}

这些带有指向多维数组的指针的类型声明很快就会变得非常混乱。我建议typedef像这样为它制作一个:

// Declare IntArray4x4Ptr to be a pointer to a 4x4 array of ints
typedef int (*IntArray4x4Ptr)[4][4];

然后你可以声明你的函数更具可读性:

IntArray4x4Ptr Piece::returnPiece(void) { ... }
void Grid::InsertArray(IntArray4x4Ptr arr) { ... }

您还可以使用cdecl程序来帮助破译复杂的 C/C++ 类型。

于 2008-12-31T07:12:36.727 回答
0

似乎您需要阅读更多关于 C++ 中的指针以及按引用传递与按值传递的信息。

您的 returnPiece 方法被定义为返回单个单元格的值。给定索引(例如,[4][4]),您将返回该单元格内容的副本,因此您将无法更改它,或者更准确地说,更改它会更改副本。

我相信有人会给你正确的语法,但我真的建议学习这些东西,否则你可能会使用你得到的代码不正确。

于 2008-12-31T06:58:26.537 回答
0

这是我的做法:

类数组 {
  上市:

    大批() {
      对于 (int i = 0; i < 4; ++i)
      {
         对于 (int j = 0; j < 4; ++j)
         {
            (*这个)(i, j) = 0;
         }
      }
    }


    int &operator()(int i, int j)
    {
      返回片数组[i][j];
    }

  私人的:
    intpieceArray[4][4];
};

然后,您可以执行以下操作:

  数组 x; // 创建 4x4 数组
  x(1, 2) = 3; // 修改元素
于 2008-12-31T07:07:01.217 回答
0

Piece::pieceArray中,Adam Rosenfield 的 arrayPtr的问题可能会从您的下方发生变化。(按引用复制与按值复制。)

按值复制效率低下。但是,如果您真的想这样做,那就作弊:

struct FOO { int  piece [4][4]; };

FOO Piece::returnPiece()
{
  FOO f;
  memcpy( f.piece, pieceArray, sizeof(pieceArray) );
  return f;
}

void Grid::InsertArray( const FOO & theFoo )
{
  // use theFoo.piece[i][j]
}

当然,更好、更面向对象的解决方案是让returnPiece()创建并返回一个PieceArray对象。(正如胡安建议的那样……)

于 2009-01-01T06:01:04.373 回答