为啥我会出现超出范围的错误?
Posted
技术标签:
【中文标题】为啥我会出现超出范围的错误?【英文标题】:Why am i getting out-of-range error?为什么我会出现超出范围的错误? 【发布时间】:2015-11-27 15:23:24 【问题描述】:我似乎找不到我的问题所在。它是一个三文件程序,一个文件中包含一个 Die 类,另一个文件中包含一个直方图类,以及 main.cpp 文件。它应该打印一个用 X 构建的直方图,以显示骰子落在六个面上的每一个上的次数。由于矢量错误,我无法继续前进......程序可能还有其他问题我还没有解决,但我只想知道矢量错误。谢谢。
main.cpp:
#include <iostream>
#include <stdlib.h> //srand and rand
#include <time.h> //Time
#include <vector>
#include <algorithm>
#include "aHistogram.h"
#include "aDie.h"
using namespace std;
int main()
srand (time(NULL));
int numRolls;
const int maxLengthOfLine = 50;
cout << "How many rolls? " << endl;
cin >> numRolls;
aDie fairDie;
aHistogram fairHistogram;
//For Loop rolls the die and updates the histogram vector ~~binHistogram.
for(int i = 0; i < numRolls; i++)
int face = fairDie.roll();
fairHistogram.update(face);
cout << "*******************" << endl;
cout << "*****Histogram*****" << endl;
cout << "*******************" << endl;
fairHistogram.display(maxLengthOfLine);
aDie.h:
#ifndef ADIE_H_INCLUDED
#define ADIE_H_INCLUDED
#include <stdlib.h>
#include <time.h>
#include <vector>
#include <algorithm>
using namespace std;
/********************************************/
/*******Definition of aDie class*************/
/********************************************/
class aDie
public:
int roll(); //return an integer between 1 and 6 to represent what face appears when the die is rolled.
aDie(); //Default constructor
~aDie(); //Destructor
private:
int numFaces = 6;
;
int aDie::roll()
return ((rand() % numFaces) + 1); //returns a random number between 1 and 6
aDie::aDie()
cout << "Dice Roll...." << endl;
return;
aDie::~aDie()
return;
#endif // ADIE_H_INCLUDED
aHistogram.h:
#ifndef AHISTOGRAM_H_INCLUDED
#define AHISTOGRAM_H_INCLUDED
#include <algorithm>
#include <stdlib.h>
#include <vector>
using namespace std;
/********************************************/
/*******Definition of aHistogram class*******/
/********************************************/
class aHistogram
public:
void update(int face);
void display(int maxLengthOfLine);
int Count(int face);
void clear();
aHistogram(); //Constructor
~aHistogram(); //Destructor
private:
vector<int> binHistogram;
const int numFaces = 6;
int totalRolls;
int largeBin = 0;
double xScale;
;
//Adds a count to each face every time the die lands on said face.
void aHistogram::update(int face)
binHistogram.at(face) += 1;
return;
//Displays the histogram with X's
//maxLengthOfLine represents the maximum number of x’s to be printed for the largest bin count.
void aHistogram::display(int maxLengthOfLine)
xScale = maxLengthOfLine / largeBin;
for(int i = 1; i <= 6; i++)
cout << i << " : " << Count(i) << " : ";
int numXs = xScale * binHistogram.at(i);
for(int j = 0; j < numXs; j++)
cout << "X";
//To be called AFTER aHistogram::update
//Returns a count of how many times for each face of the die
int aHistogram::Count(int face)
//For Loop determines the largest bin count
for (int i = 1; i < numFaces; i++)
while (binHistogram[i] >= largeBin)
largeBin = binHistogram.at(i);
//
return binHistogram.at(face);
void aHistogram::clear()
binHistogram.clear();
return;
//Defines the DEFAULT CONSTRUCTOR. Sets all elements of the histogram to zero.
aHistogram::aHistogram()
return;
//Defines the DESTRUCTOR. Clears vector after use.
aHistogram::~aHistogram()
binHistogram.clear(); //Clears vector
return;
#endif // AHISTOGRAM_H_INCLUDED
【问题讨论】:
您使用的是class
、object
和srand
,但您的问题与这些标签无关
【参考方案1】:
我没有找到初始化直方图的地方,这可能是问题所在。但即使你修复了它,你也会遇到另外两个错误:
for (int i = 1; i < numFaces; i++)
while (binHistogram[i] >= largeBin)
largeBin = binHistogram.at(i);
您正在访问元素1....6
,而它可能应该是0...5
。你所在的行也有同样的问题
largeBin = binHistogram.at(i);
这很可能是导致错误的那一行(上面的那一行不会很好地告诉你问题是什么,但只会让你的程序崩溃)。
【讨论】:
【参考方案2】:您永远不会更改 aHistogram
类中向量的大小,这意味着它的大小将始终为零。任何索引都将超出范围。
对于直方图之类的东西,我实际上建议您使用std::unorderd_map
而不是std::vector
,其中“面”是关键,而计数是数据。然后你可以做例如
binHistogramMap[face] += 1;
不用担心face
的元素不存在(如果条目不存在,它将被创建并初始化为零)。
【讨论】:
所以我正在尝试使用private: const int numFaces = 6; vector<int> binHistogram(6); int totalRolls; int largeBin; double xScale;
初始化向量
所以我尝试使用private: const int numFaces = 6; vector<int> binHistogram(6); int totalRolls; int largeBin; double xScale;
在直方图类的定义中初始化向量。当我这样做时,我得到错误 expected 或 ... before numeric constant 这是为什么。我已经在谷歌上搜索了几个小时。
@MaxMaurente 你不能那样做,你必须使用constructor member initializer list。以上是关于为啥我会出现超出范围的错误?的主要内容,如果未能解决你的问题,请参考以下文章
Python:出现“列表索引超出范围”错误;我知道为啥但不知道如何解决