作者ric2k1 (Ric)
看板EE_DSnP
標題Re: [討論] vector
時間Fri Jan 16 23:53:35 2009
※ 引述《BloodyDuke (個巴樂)》之銘言:
: 恩我省略了部份程式碼,buffer是一個string(全域)在main中由檔案輸入的
: buffersize也在main裡決定(且是全域變數)
: class Char{
: friend class Bomb;
: public:
: Char():_numChar(0){}
: void genChar();
: void toScreen();
: private:
: int _numChar;
: vector<Bomb*> _bomb;
: };
: class Bomb{
: public:
: Bomb(char);
: char getCh(){return _ch;}
: int& getColumn(){return _column;}
: int& getRow(){return _row;}
: private:
: char _ch;
: int _column;
: int _row;
: };
: //main 呼叫一次,產生所有的bomb
: void Char::genChar(){
: for(int i=0;vector<Bomb*>::iterator it=_bomb.begin();
: i<bufferSize;i++,it++)
: *it=new Bomb(buffer[i]);
: ^^^^^^^^^^^^^^^^^^^^^^^^
你要分清楚 vector 裡面的 element 到底存了幾個?
簡單的說:
1. 只宣告 vector<Bomb*> ==> size = capacity = 0;
此時若去 access *it ==> crash!
2. vector<Bomb *> _arr(10); ==> size = capacity = 10;
OK 去存取 _arr[0] ~ _arr[10], or *it between [begin(), end())
3. 只宣告 vector<Bomb*> 但是用 push_back 將 element 塞入,
如: _arr.push_back(new Bomb);
4. 只宣告 vector<Bomb*> 但是用 reserve() 先去要記憶體 ==> size 不變, 但是
capacity 變成新的值.
所以很明顯的, 你的 array 還是空的 (you can check with end()),
但是卻去 access *it
: //這行存取違規
: }
: //在main中被循環呼叫 讓字母(Bomb)往下掉
: void Char::toScreen(){
: if(_numChar<bufferSize)
: _numChar++;
: int i=0;
: for(vector<Bomb*>::iterator it=_bomb.begin();
: i<_numChar;i++,it++){
: int &col=(*it)->getColumn();
: int &row=(*it)->getRow();
: ^^^^^^^^^^^^^^^^^^^^^^^^^
: //這裡也會存取違規
: if((*it!=(Bomb*)DELETED)||(*it!=(Bomb*)FAIL)){
: screen[col][row++]=(*it)->getCh();
: }
: if (((*it)->getRow()==Row)||(*it)->checkBelow()){
: delete *it;
: (*it)=(Bomb*)FAIL;
: }
: }
: }
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.4.96
推 BloodyDuke:恩了解了,其實這我有查到,只是沒想清楚,感謝回答 01/17 01:58
推 wintercobra:老師,如果有問題可以拿去問你嗎?電二444? 01/18 01:15
→ ric2k1:我現在在國外, 請用 e-mail 先... 01/18 06:23