如何通过函数传递数组并将其 return 返回

How to pass an array through functions and return it back

目前我有主函数调用 GenerateMap 函数,GenerateMap 函数执行它应该做的,但我想将它传回 int main 中的 Map[][]。即使代码按预期运行,也会出现运行时错误。

terminate called after throwing an instance of 'std::logic_error'
what():  basic_string::_S_construct null not valid

有人可以帮我解决这个问题吗?我是编程新手,所以有人可以向我解释我需要做什么。谢谢!

代码

#include <iostream>
#include <stdlib.h>
#include <cstdlib>
#include <ctime>
using namespace std;

string GenerateMap() {
   int MapDimension = 5;
   string Map[MapDimension][MapDimension];
   for (int i = 0; i <= MapDimension-1; ++i) {

      for (int j = 0; j <= MapDimension-1; ++j) {

         int random = rand() % 6;
         string x;
         switch  (random) {
            case 0:
               x = "D";
               break;

            case 1:
               x = "F";
               break;

            case 2:
               x = "P";
               break;

            case 3:
               x = "M";
               break;

            case 4:
               x = "L";
               break;

            case 5:
               x = "S";
               break;
         }
         Map[i][j] = x;
         cout <<"[" << Map[i][j] << "]" << "  ";
      }
      cout << endl;

   }

   return 0;   
}

void MoveForward(){
}

void MoveBackward() {
}

void MoveLeft(){
}

void MoveRight(){
}

void Player() {
   string Player;
}

int main() {
   GenerateMap();
}
string GenerateMap() {
   // ...
   return 0;
}

哎呀!

这实际上是编译通过的,因为0是一个空指针常量,它可以变成const char*,它可以用来初始化一个std::string…除了构造一个[=13] =] 来自 NULL 指针是非法的。因此错误。

我不知道你从那个函数中 return 的实际意图,正如你从未说过的那样。

但我知道不是那样。

遗憾的是,C++ 对多维数组的支持相当薄弱,尤其是动态数组。完全不使用它们通常更简单,只使用一维 std::vectorstd::array 代替。

但是如果你真的想使用多维数组并且大小在编译时已知,那么一个相对简单的解决方案是将你的多维数组包装在一个结构中,然后 return GenerateMap。类似于:

struct Map {
    static const int Dimension = 5;
    std::string data[Dimension][Dimension];
};

Map GenerateMap() {
    Map map;
    for (int i = 0; i < Map::Dimension; ++i) {
        for (int j = 0; j < Map::Dimension; ++j) {
            std::string x;
            // fill x...
            map.data[i][j] = x;
        }
    }
    return map;   
}

int main() {
    Map map = GenerateMap();
    for (int i = 0; i < Map::Dimension; ++i) {
        for (int j = 0; j < Map::Dimension; ++j) {
            std::cout <<"[" << map.data[i][j] << "]" << "  ";
        }
        std::cout << "\n";
    }
}

Live demo.