如何通过函数传递数组并将其 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::vector
或 std::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";
}
}
目前我有主函数调用 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::vector
或 std::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";
}
}