我正在尝试制作一个迷宫解决方案,虽然算法是合理的(至少在我脑海中),但我一直在遇到有2D阵列的障碍。我来自C#和Java,所以语法让我感到悲伤。
这是一个SSCCE:
//Main.cpp
#include "MazeSolver.h"
int main()
{
MazeSolver mazeSolver;
char maze[51][51] = { }; // Not bothering to show code for populating the array
mazeSolver.setMaze(maze);
}
//MazeSolver.cpp
#include "MazeSolver.h"
MazeSolver::MazeSolver() { }
void MazeSolver::setMaze(char maze[51][51])
{
this->maze = maze;
}
//MazeSolver.h
#ifndef _MAZESOLVER_H
#define _MAZESOLVER_H
class MazeSolver
{
private:
char **maze; // This is likely the problem, I'm at wits end in regards to
// what notation is needed here. I do not want to hard-copy
// the entire array, I just need to access it (via pointer)
// I've also tried just using char maze[51][51] here, char *maze, etc...
public:
MazeSolver();
void setMaze(char maze[51][51]);
}
答案 0 :(得分:2)
你不能将2d数组(array[ROWS][COLUMNS]
)分配(或转换)为指针指针(又名**
),因为2d数组的内存布局(可能)与内存布局非常不同指针的指针可以指向。
检查this thread以获取有关此主题的更多信息。
如果建议您使用事实上的C ++标准容器std::vector
,而不是普通数组:
class MazeSolver
{
std::vector<std::vector<char>> maze;
void setMaze( const std::vector<std::vector<char>>& new_maze )
{
maze = new_maze;
}
};
请注意,默认情况下,向量的大小为0(在初始化时),因此您应该使用元素填充它:
for( std::size_t i = 0 i < ROWS ; ++i )
{
maze.push_back( std::vector<char>() );
for( std::size_t j = 0 ; j < COLUMNS ; ++j )
maze[i].push_back( ' ' );
}
但是,C ++ 11(该语言的当前迭代)有一个std::array
容器,它类似于C数组,但具有其他标准库容器的接口:
std::array<char,ROWS*COLUMNS> maze;
答案 1 :(得分:1)
<rant>
这是C ++的一个奇怪的怪癖。
C ++ 2D数组不是锯齿状数组。当你声明char maze [51] [51]时,它实际上分配了1个连续数组51 * 51个成员。 sizeof(maze) == 51*51
。当您取消引用某个值maze[a][b]
时,它实际执行的操作是*(maze+51*a+b)
。所有这一切都在幕后。
Jagged Array是一个数组数组,一个char **。在这种情况下,你有一个51指针大小==(51 * sizeof(void *))的数组。在每个位置,指针指向一个完全不同的内存位置,分配给51个成员。
这太烦人了,因为你不能只是通过施法来转换这两者。您必须处理奇怪的语法,例如char (*maze)[51]
以获取指向2D数组的指针。
更令人讨厌的是以下情况:
int foo(int maze[51][51])
{
return sizeof(maze);
}
int maze[51][51];
int main(int argc, char** argv)
{
std::cout << sizeof(maze) << std::endl;//return 51*51*sizeof(int);
std::cout << foo(maze) << std::endl;//return 8, sizeof(void*);
}
因此它隐含地通过引用传递,而不是通过值传递,这与C ++的其余部分相反。
</rant>
TL;博士;
指向2D数组的指针的正确语法是char (*maze)[51];
。您的语法是针对锯齿状数组(数组数组),这与C ++中的情况不同。