1

void build()将创建一个 2D 数组,其大小在运行时确定并modify()通过引用传递给它。

void modify()将对数组进行一些更改。

.h 文件:

void modify(______, int mySize);
void build(int size);

在 .cpp 文件中:

void modify(______, int mySize) {
    for (int i = 0; i < mySize; i++) 
        for (int j = 0; j < mySize; j++)
            myArray[i][j] = false;
}

void build(int size) {
    bool myArray[size][size];
    modify(______, size);
}

有人能告诉我在这些空白处放什么吗?我尝试了很多方法来投射myArray,但仍然无法正常工作。非常感谢!

4

2 回答 2

1

首先,请注意可变长度数组 (VLA) 不是标准 C++。这一行编译的事实是由于 GCC 编译器扩展:

bool myArray[size][size];

它根本不是有效的 C++。数组的维度需要是编译时常量,但在这里您使用的是传递给函数的参数build

无论如何,要将 VLA 传递给函数,您必须继续使用编译器扩展。但是,据我测试,这些仅在编译为 C 时有效。第一个选项使用允许在其他参数声明中使用参数的扩展:

void modify(int mySize, bool array[][mySize]);

第二个选项,如果你想mySize成为第二个参数,也使用允许参数前向声明的编译器扩展:

void modify(int mySize; bool array[][mySize], int mySize);

int mySize;是一个参数前向声明。

尽管如此,您确实不应该使用可变长度数组。您可以动态分配可变长度的数组,如下所示:

void modify(bool** array, int mySize);

void build(int size) {
  bool** myArray = new bool*[size];
  for (int i = 0; i < size; i++) {
    myArray[i] = new bool[size];
  }
  modify(myArray, size);
}

但是,这仍然不是 C++ 中的推荐做法。你应该避免动态分配,除非你真的需要它,当你确实需要它时,你应该以某种方式管理它。在这里,您需要记住delete[]每个元素myArray 及其 myArray本身。

您真正应该使用的是标准容器。Astd::vector<std::vector<bool>>在这里很适合你:

void modify(std::vector<std::vector<bool>>& array);

void build(int size) {
  std::vector<std::vector<bool>> myArray(size, std::vector<bool>(size));
  modify(myArray);
}

现在您甚至不必传递大小。

于 2013-03-10T11:35:42.233 回答
0

以这种方式使用它:

    void modify(bool**& myArray, const int mySize) 
    {
        for (int i = 0; i < mySize; i++) 
            for (int j = 0; j < mySize; j++)
               myArray[i][j] = false;
    }

    void build(const int size) 
    {
        // create the array
        bool** myArray = new bool*[size];
        for (int i=0; i<size; i++)
            myArray[i] = new bool[size];

        modify(myArray, size);

        // release the array
        for (int i=0; i<size; i++)
            delete[] myArray[i];
        delete[] myArray; 
    }
于 2013-03-10T11:59:30.233 回答