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

时间:2015-10-23 16:52:42

标签: c++ arrays function reference pass-by-reference

目前我有main函数调用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();
}

2 个答案:

答案 0 :(得分:2)

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

糟糕!

这实际上是编译的,因为0是一个空指针常量,可以变成const char*,可用于初始化std::string ...除了构造std::string从NULL指针是非法的。因此错误。

我不知道你真正打算从该功能返回什么,正如你从未说过的那样。

但我知道不是那样。

答案 1 :(得分:0)

遗憾的是,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";
    }
}

Live demo.