我一直在玩c ++游戏,只是为了练习编程。我创建了一个类,该类本质上是一个二维的细胞矢量,它们充当地牢的不同图块。当我尝试调用将边缘单元变成壁的函数时,我遇到了段错误11。根据我的研究,错误是试图访问向量边界之外的元素,或者是堆内存不足但我不确定这是否是其中一种情况。
int main(){
floor myfloor(18,9);
myfloor.setwalls();
}
#ifndef FLOOR_H
#define FLOOR_H
#include "cell.h"
#include <vector>
using namespace std;
class floor{
public:
floor(int xmax, int ymax);
void setwalls();
private:
int sizeX;
int sizeY;
vector< vector<cell*> > layout;
};
#endif
floor::floor(int xmax, int ymax){
sizeX = xmax;
sizeY = ymax;
layout.resize(xmax, vector<cell*>(ymax));
for(int i = 0; i < xmax; i++){
for(int j = 0; j < ymax; j++){
layout[i][j] = new cell();
}
}
}
void floor::setwalls(){
for(int i = 0; i < sizeY; i++){
layout[0][i]->setwall();
layout[sizeX][i]->setwall();
}
for(int i = 0; i < sizeX; i++){
layout[i][0]->setwall();
layout[i][sizeY]->setwall();
}
}
什么是导致段错误11的原因?我所做的测试表明,我的程序将其设置为setwalls(),但它似乎在尝试访问布局矢量的第一个元素时就会遇到段错误。
答案 0 :(得分:1)
您做错了几件事,所以我为您编写了一个有关如何使用多维向量的示例。
#include<vector>
#include<iostream>
using namespace std;
int main()
{
vector < vector < int >>myarr;
myarr.resize(100); // resizes 1st dimension
for (auto i = 0; i < 100; i++)
myarr[i].resize(100); // resizes 2nd dimension
// initilization
for (int i = 0; i < 100; i++)
{
for (int j = 0; j < 100; j++)
myarr[i][j] = j; // 0- 99 100 times.
}
for (int i = 0; i < 100; i++)
{
for (int j = 0; j < 100; j++)
cout << myarr[i][j] << " ";
cout << endl;
}
}
您没有正确调整向量的大小,也没有正确初始化向量的使用方式。同样,您的类型应该是std :: unique_ptr,并用std :: make_unique初始化它,并且两者都位于内存头中。
您的代码应为
int main(){
floor myfloor(18,9);
myfloor.setwalls();
}
#ifndef FLOOR_H
#define FLOOR_H
#include "cell.h"
#include <vector>
#include<memory>
using namespace std;
class floor{
public:
floor(int xmax, int ymax);
void setwalls();
private:
int sizeX;
int sizeY;
vector<vector<unique_ptr<cell*>>> layout;
};
#endif
floor::floor(int xmax, int ymax){
sizeX = xmax;
sizeY = ymax;
layout.resize(xmax);
for(int i = 0; i < xmax; i++)
layout[i].resize(ymax);
for(int i = 0; i < xmax; i++){
for(int j = 0; j < ymax; j++){
layout[i][j] = make_unique(cell());
}
}
}
void floor::setwalls(){
for(int i = 0; i < sizeY; i++){
layout[0][i]->setwall();
layout[sizeX - 1][i]->setwall();
}
for(int i = 0; i < sizeX; i++){
layout[i][0]->setwall();
layout[i][sizeY - 1]->setwall();
}
}
现在,您的董事会将是您想要的两个方面的规模。
答案 1 :(得分:-1)
索引基于0。因此,bounds的有效值为0 <= bound <=(N-1)。
您需要使用sizeX-1而不是sizeX。与sizeY相同。