2013-10-30 150 views
0

我宣佈我的頭文件中像這樣的數組:C++ Segfault,我不知道爲什麼?

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 

我不確定我要去哪裏錯,我認爲這個錯誤在這裏。 我真的不能發佈所有的代碼作爲它的很多,但如果你需要更多 具體信息請直接詢問。

非常感謝您提前。

+2

你如何確保'ñ<10'或'currentAnimation <10'?最有可能你被界訪問了調用未定義的行爲。 –

+2

我猜框架[currentAnimation]引用數組外 – Ashalynd

+2

你試過打印出你使用的索引嗎? –

回答

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; 
} 

See Loki's answer for why while(!stream.eof()) is bad

+0

謝謝你這個工作,但仍然不明白爲什麼我的沒有。 – user2936306

+0

@ user2936306:因爲你的代碼假設只有10個輸入項(因此當n> = 10時,'param [n]'和'frames [n]'失敗)。此代碼對輸入大小沒有限制。 –

+0

@DieterLücking更新,謝謝 –

0

int n=0; 
while(!stream.eof() && n < 10) 
{ 

...

currentFrame++; 
if(currentFrame < 10 && frames[currentAnimation] <= currentFrame) 
{ 
    currentFrame = 0; 
} 

或使用類似

currentFrame = (currentFrame + 1) % 10; 
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!*/} 
相關問題