我的一个功能有问题,我正在使用一个简单的平铺地图编辑器,我正在尝试实现一个3D数组来跟踪平铺(x,y,层)。在此之前,我有一个1D数组,其中所有的瓷砖都是按顺序列出的:
bool Map::OnLoad(char* File) {
TileList.clear();
FILE* FileHandle = fopen(File, "r");
if(FileHandle == NULL) {
return false;
}
for(int Y = 0;Y < MAP_HEIGHT;Y++) {
for(int X = 0;X < MAP_WIDTH;X++) {
Tile tempTile;
fscanf(FileHandle, "%d:%d ", &tempTile.TileID, &tempTile.TilePassage);
TileList.push_back(tempTile);
}
fscanf(FileHandle, "\n");
}
fclose(FileHandle);
return true;
}
这基本上是从文件中读取的字符串,如下所示:
2:1 1:0 3:2...
第一个数字表示tileID,第二个表示Tile可通过性。 以上功能正常运作。我的3D数组也正确构建,我用简单的赋值测试它们并从中调用值。 给我带来问题的功能如下(请注意,数字2即OnLoad2()已添加,因此我可以保持旧变量和函数不变,直到原型工作):
bool Map::OnLoad2(char* File) {
TileList2.clear();
FILE* FileHandle2 = fopen(File, "r");
if(FileHandle2 == NULL) {
return false;
}
for(int Y = 0;Y < MAP_HEIGHT;Y++) {
for(int X = 0;X < MAP_WIDTH;X++) {
Tile tempTile;
fscanf(FileHandle2, "%d:%d ", &tempTile.TileID, &tempTile.TilePassage);
TileList2[X][Y][0] = tempTile;
}
fscanf(FileHandle2, "\n");
}
fclose(FileHandle2);
return true;
}
虽然此函数不会触发编译器报告任何错误,但一旦应用程序启动,它就会冻结并崩溃。有关其他信息, MAP_WIDTH和MAP_HEIGHT设置为每个,3D阵列的构造如下:
TileList2.resize(MAP_HEIGHT);
for (int i = 0; i < MAP_HEIGHT; ++i) {
TileList2[i].resize(MAP_WIDTH);
for (int j = 0; j < MAP_WIDTH; ++j)
TileList2[i][j].resize(3);
}
如果您能指出我需要解决的问题,我将不胜感激,据我所知,我必须弄乱for循环结构,因为3D数组初始化并正常工作。谢谢你的帮助!
答案 0 :(得分:5)
TileList2.clear();
此行重新初始化TileList2,因此它返回到零长度向量。删除该行,你可能会没事的。