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

How to pass an array through functions and return it back

本文关键字:返回 数组 何通过 函数      更新时间:2023-10-16

目前我有一个主函数调用 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......除了从 NULL 指针构造一个std::string是非法的。因此错误。

我不知道你实际上打算从那个函数中返回什么,因为你从来没有说过。

但我知道事实并非如此。

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

但是,如果您真的想使用多维数组并且在编译时知道大小,那么一个相对简单的解决方案是将多维数组包装在结构中,然后从 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";
    }
}

现场演示。