我目前在C ++学习的背景是我在一个学期学习了大学课程。
我遇到了麻烦,弄清楚如何在if-else语句之外保留我指定的值。我想如果我事先在外面声明它并使用指针来处理内存地址本身,这将是公平的游戏,但显然不是。
my" MAZE"暂时存档:
. # # # # # #
. . . . . # #
# . # # . # #
# . # # . . #
# . . # # . #
# . # # . . #
# . # # . # #
. . . # . . .
# # . . . # #
这就是我在maze.h文件中的内容,定义了构造函数。我还没有完成大部分程序,但我的main.cpp已经处理了计算文本文件的迷宫尺寸,然后只是调用
Maze *testMaze = new Maze(rows,columns);
我的maze.h文件将bool maze [0] [0]列为私人会员。它被设置为0,因为在代码的第一次执行时,还没有办法知道迷宫的大小。我运行代码来计算大小,然后在Maze构造函数中作为参数传递行和列。
我的maze.cpp文件的参数构造函数:
Maze::Maze(int rows, int columns)
{
string mazeRow="";
int roIndex=0; //Row Index
int coIndex=0; //Column Index
bool maze[rows][columns];
bool* target = NULL;
ifstream input;
input.open("MAZE",ios::in);
if(input)
{
while (getline(input, mazeRow))
{
//Testprint this row of the maze.
cout << mazeRow << endl; //mazeRow is the data in that row of the text file.
//Store each non-space value.
for (coIndex=0; coIndex<mazeRow.length(); coIndex++) //For each character in that row...
{
char check=mazeRow[coIndex];
target = &maze[roIndex][coIndex];
if (check=='.') //Path
{
*target=true;
cout << *target << " "; //These print statements print correctly.
}
else if (check=='#') //Wall
{
*target=false;
cout << *target << " "; //These print statements print correctly.
}
else if (check==' ') //Space
{
//ignore spaces
}
else //For all other cases, an invalid character is present.
{
cout << "Invalid character detected." << endl;
}
cout << *target << " "; //For some odd reason, this line BY ITSELF doubles up print. Ex. instead of printing 1 1 0 1 0, it would print 1 1 1 1 0 0 1 1 0 0.
}
cout << "End of row." << endl;
roIndex++;
}
}
input.close();
cout << "Storage completed." << endl;
for (int i=0; i<rows; i++)
{
cout << "Row " << i << endl;
for (int j=0; j<columns; j++)
{
/* This is the print test to see if the values
are retained outside of the first block.
None of them print the maze file properly.
*/
if (maze[i][j] == true)
cout << maze[i][j] << "\t" << "." << "\t";
if (maze[i][j] == false)
cout << maze[i][j] << "\t" << "#" << "\t";
cout << "Column " << j << endl;
}
cout << "End of row." << endl;
}
cout << "Verification completed." << endl;
}
第一次在这里提问,所以如果我遗漏了什么,请告诉我。
只想在这里发布更新。事实证明,我要么过度紧张,要么睡眠不足,要么两者兼而有之。我把这段代码放了几个小时并重新审视了一下,我在代码中发现了很多逻辑错误,包括但不限于忘记为什么存在某些变量以及它们用于什么,而不是清楚地考虑所有在循环中增加(++)的后果,以及其他类似的错误。我已经采取了以下几个答案/评论,并刷新了我对自己的代码的理解,帮助我纠正这些错误。当我解决这个问题时,如果可以的话,我会提供完成的代码。
解决了这个问题。我能在几个小时内自我回答并解释实际发生的事情。
答案 0 :(得分:0)
成员变量。
严肃的建议:在进入指针,内存地址,类等之前先学习基本的C ++。
答案 1 :(得分:0)
我不确定你在这里想要实现什么,或者实际上你正试图寻求帮助的问题是什么。
你突出显示了一条没有达到预期效果的行:
cout << *target << " "; //For some odd reason, this line BY ITSELF doubles up print. Ex. instead of printing 1 1 0 1 0, it would print 1 1 1 1 0 0 1 1 0 0.
但是,此行仅输出bool,因此如果更改为:
cout << "[" << *target << "] ";
它给出了:
. # # # # # #
1 [1] [254] 0 [0] [72] 0 [0] [0] 0 [0] [0] 0 [0] [77] 0 [0] [90] 0 [0] [0] [32] End of row.
现在您可以看到,因为您的代码输出了读入的行,然后遍历该行,如果该字符是'',则首先输出1。如果字符是'#',则为0;否则,您不指定值,因此行开头的1 [1] [254]
正在读取第一个'。'。字符(1 [1]
)然后忽略空格([254]
)
(请注意,您没有发布代码以将初始值分配给bool矩阵 - 不确定您是否正在执行此操作,但您肯定使用矩阵中的值进行输出,而无需在此设置它们代码。这解释了奇数的整数值。)
因此它并没有加倍,只是按照你的要求去做。也许您需要查看代码可以通过条件的所有路径?
答案 2 :(得分:0)
您要根据target = &maze[roIndex][coIndex];
设置数据coIndex
,但在示例数据中有空格。这些被“忽略”(未打印),但您仍然会增加索引,因此每次都在跳过数组中的值:
第一次迭代设置maze[0][0];
第二次迭代没有设置,因为你有空格
第三次迭代设置maze[0][2];
等...
永远不会设置 maze[0][1];
...等
答案 3 :(得分:0)
您已在if(输入)中保留值。它们被保留在bool迷宫中[行] [列]; if-else后完全可以访问。如果你正在重新打印迷宫的部分,你将在if-else之后访问它们。
我认为你的问题应该是“如何为其他成员方法保留一个成员方法(ctor)的值?”。这个问题的答案是将数组存储在成员变量而不是本地变量中。
将phresnel的建议铭记于心。 C ++中没有二维数组。你可以有阵列数组,这就是全部。
class CMaze
{
int m_Rows;
int m_Columns;
bool** m_arrarrMazeData;
public:
CMaze(int rows, int columns)
{
m_Rows = rows;
m_Columns = colums;
//create array of pointers, each one will store another array
m_arrarrMazeData = new bool*[rows];
for (int i = 0; i<rows; i++)
{
//create new column for every row
m_arrarrMazeData[i] = new bool[columns];
}
//rest of your code here, read into m_arrarrMazeData and forget about local variables, especially bool maze[rows][columns];
}
}
答案 4 :(得分:0)
首先,谢谢大家的帮助。我原本以为错误来自与仅修改变量的本地副本的语句有关的问题。 “存储已完成”下面的代码的最后一部分。应该打印出某种形式的验证,测试并打印出数组的值,以便我可以确认那里的值,因为我试图分配。
事实证明,感谢 Component 10 的帖子,我将代码暂时搁置一段时间后重新分析了我的代码,并发现错误与空格也有关外部cout声明。这让我重新分析了我在何处以及如何使用roIndex和coIndex,以及为什么在for-loop中使用coIndex的问题。就在那时我发现并注意到我在for循环中使用的任何变量都会指示mazeRow字符串中的位置,而coIndex表示数组中的列。这些不要相互混淆。 msam 也抓住了这个。
例如,使用mazeRow [ i ]和迷宫[roIndex] [ coIndex ]
一旦我理解了组件10解释的“额外”数字的来源,并清除了对我自己的变量用法的理解,其余的就快速排序了。这个问题与变量的本地副本无关。
我目前的代码如下:(抱歉这里有点混乱 - MAZE文件确实目前有一个S和G来标记迷宫的起点和目标。)
Maze::Maze(int rows, int columns)
{
string mazeRow="";
bool maze[rows][columns];
for (int i=0; i<rows; i++)
{
for (int j=0; j<columns; j++)
{
maze[i][j] = false;
}
}
bool* target = NULL;
ifstream input;
input.open("MAZE",ios::in);
if(input)
{
int roIndex=0; //Row Index
while (getline(input, mazeRow))
{
//Testprint this row of the maze.
cout << mazeRow << endl; //mazeRow is the data in that row of the text file.
//Store each non-space value.
int coIndex=0; //Column Index
for (int i=0; i<mazeRow.length(); i++) //For each character in that row...
{
char check=mazeRow[i];
target = &maze[roIndex][coIndex];
if (check=='.') //Path
{
*target=true;
coIndex++;
}
else if (check=='#') //Wall
{
*target=false;
coIndex++;
}
else if (check=='S') //Start
{
*target=true;
coIndex++;
}
else if (check=='G') //Goal
{
*target=true;
coIndex++;
}
else if (check==' ') //Space
{
//ignore spaces
}
else //For all other cases, an invalid character is present.
{
cout << "Invalid character detected." << endl;
}
}
roIndex++;
}
}
input.close();
cout << "Storage completed." << endl;
for (int i=0; i<rows; i++)
{
for (int j=0; j<columns; j++)
{
cout << maze[i][j] << " ";
}
cout << endl;
}
cout << "Verification completed." << endl;
}
我希望这将对未来的某些人有所帮助,让这成为一个教训:有时最好的解决方案是暂时解决你的问题并分析你所做的一切应该做什么与什么做什么它实际上在做。知道为什么你有东西,以及他们需要用什么。