我在头文件中声明了一个数组:
private:
int frames[10];
并在类构造函数中赋值,如下所示:
file.open(File);
if(file.is_open())
{
std::string line;
getline(file, line);
std::string param[10];
std::stringstream stream(line);
int n=0;
while(!stream.eof())
{
getline(stream, param[n], '$');
frames[n] = atoi(param[n].c_str());
n++;
}
file.close();
}
稍后此数组用于函数:
currentFrame++;
if(frames[currentAnimation] <= currentFrame)
{
currentFrame = 0;
}
当我运行时,我运行我的代码,我得到分段错误,gdb返回:
Program received signal SIGSEGV, Segmentation fault.
0x0000000000402c22 in Sprite::update (this=0x7ffff6efe678 <main_arena+88>) at Sprite.cpp:93 93
if(frames[currentAnimation] <= currentFrame)
(gdb) bt
#0 0x0000000000402c22 in Sprite::update (this=0x7ffff6efe678 <main_arena+88>) at Sprite.cpp:93
#1 0x0000000000401fcb in main (argc=1, argv=0x7fffffffeb88) at main.cpp:146
我不确定我哪里出错了,我认为错误就在这里。 我不能真正发布所有代码,但如果你需要的话 具体信息请问。
非常感谢你。
答案 0 :(得分:3)
试试这个
private:
std::vector<int> frames;
file.open(File);
if(file.is_open())
{
std::string line;
getline(file, line);
std::string param;
std::stringstream stream(line);
while(getline(stream, param, '$'))
frames.push_back(atoi(param.c_str()));
file.close();
}
currentFrame++;
if( currentAnimation < frames.size() && frames[currentAnimation] <= currentFrame)
{
currentFrame = 0;
}
答案 1 :(得分:0)
写
int n=0;
while(!stream.eof() && n < 10)
{
...
和
currentFrame++;
if(currentFrame < 10 && frames[currentAnimation] <= currentFrame)
{
currentFrame = 0;
}
或使用类似
的内容currentFrame = (currentFrame + 1) % 10;
答案 2 :(得分:0)
几个问题:
这里只有10个项目:
std::string param[10];
但是这里没有检查10:
while(!stream.eof())
所以这可能会增加10个以上,这肯定会引起问题。
这种形式的循环几乎总是错误的:
while(!stream.eof())
{
getline(stream, param[n], '$');
frames[n] = atoi(param[n].c_str());
n++;
}
如果输入中有任何不良数据,则会进入无限循环。否则,当您到达EOF时,std::getline()
无法读取数据并设置eof标志,但仍然分配给帧(并增加n)。错误数据的atoi()
返回0,因此Frames
中的最后一个元素将为零(不确定这是否是预期的行为(但是它的草率)。
正确的风格是将读取放入while条件。所以将这两个东西加在一起就可以看起来像这样。
while(n < 10 && getline(stream, param[n], '$'))
{
// loop is only entered if the read succeed.
// Not sure about the type of `frames` so hard to talk about
// if this loop is still correct. The meaning has changed slightly.
frames[n] = atoi(param[n].c_str());
n++;
}
if (n < 10) {/*We have an issue with not enough data!*/}