2016-12-07 3 views
-1

私はintベクトルデータメンバを持つクラスを持っています。ベクトルを26個の要素に初期化し、すべてコンストラクタで-99という値を使用します。私はコンストラクタ内の要素0を取り除くことができ、 "-99"を出力します。その後、コンストラクタはベクトルを変更しない別のメンバ関数を呼び出しますが、その関数から要素0を取り除こうとするとセグメント化エラーが発生します。以下では、ヘッダーの関連部分と2つのメンバー関数のスクリーンショットを掲載しました。具体的には、コードは投稿されたものとして動作しますが、私が26行目を46行目に移動すると、segフォルトが発生します。参考になりましたか?ありがとうございました!ベクトルを出力するときにC++のseg faultが発生するメンバ関数からの要素

ヘッダファイル:

class Seq 
{ 
private: 
    vector<int> assignments; 
    string original; 
    vector<Expression> sequence; 
    bool valid; 

public: 

    void print_assignments(); 
    Seq(); 
    Seq(const string& s); 
    void parse(const string s, int); 
    vector<Expression> get_sequence(); 
    void display_sequence(); 
    void evaluate(); 

Constructiorとメンバ関数(解析)がコール。最初のcout文を移動すると、2番目のcout文の下の行でフォルトが発生します。

Seq::Seq(const string& s) 
{ 
    original = s; 
    vector<int> assignments(26, -99); 
    parse(s, s.size()); 
    cout << assignments[0] << endl; 
} 

void Seq::parse(const string s, int length) 
{ 
    Expression e; 
    string temp1, temp2; 
    int i = 0; 
    while((s[i] != ';')&&(i < length)) 
    { 
     i++; 
    } 
    if(i>0) 
    { 
     temp1 = s.substr(0, i); 
     e.set(temp1); 
     sequence.push_back(e); 
     if(sequence.back().get_type() == 0) 
     { 
      cout << sequence.back().get_token(0).get_token()[0] << endl; 

     } 
    } 
+0

ではなく、外部リンクで、**質問に*特に*ない画像をコード**を投稿してください。 – tadman

+0

さて、私はそれを修正しようとします –

+1

^----すべてのコードやいくつかのスニペットではありませんが、[mcve]してください! –

答えて

1

同じ名前のデータメンバーをシャドーイングするコンストラクタ内に "assignments"という名前のローカルベクタを定義しているため、データメンバー "assignment"の長さがゼロのままなので、segフォルトが発生します。

+0

ああ!それは理にかなっている!!どうもありがとうございます!!! –

0

変更

while((s[i] != ';')&&(i < length)) 

お使いのバージョンで
while(i < length && s[i] != ';') 

からsが空であるかiがすでにlengthより大きい場合、あなたはAVやセグメンテーション違反を取得します。

また、変数名tempを停止します。

+0

私はそのフォーマットで複数の条件を列挙することができるのか分からなかった!それは、私のコードの多くをきれいにするよ、ありがとう! –

関連する問題