2013-11-27 2 views
7

は私のエラーです:理解エラー "のインスタンス投げた後に呼び出さTERMINATE 'のstd ::のlength_error' 何を():のbasic_string :: _ S_create中止(コアダンプ)" だからここ

terminate called after throwing an instance of 'std::length_error' 
    what(): basic_string::_S_create 
Aborted (core dumped) 

、ここでは私ですコード:

//Code removed 

string generateSong(string list[], int num) 
{ 
    //Code removed 

    //Code removed 

    for (i = 0; i < num; i++) 
    { 
     output += list[i]; 
     output += bone1; 
     output += list[i + 1]; 
     output += bone2; 
    } 

    return output; 
} 

int main() 
{ 
    string list[9] = 
    { 

    //Code removed 

    }; 

    //Code removed 

    return 0; 
} 

私はそのエラーの意味を知りたいので、私はそれを修正する方法を知っています。私は似たようなエラーを持つ多くの投稿を見ましたが、まったく同じものはありません。私は文字通りC++で始まったばかりで、これまでに学んだことは、これらの答えのどれも意味をなさない。ご覧のとおり、これは曲を出力する簡単なプログラムです。それは私が取っているクラスの弦を練習するのに役立つことを意味しますが、それは私には絶対に意味がなく、この本はあまり役に立ちません。誰かがこれを私に説明してもらえますか?

P.S.これが有用な場合は、g ++を使ってコンパイルしますが、実行するとエラーが発生します(基本的にコンパイルエラーではなく、実行エラーです)。

+0

デバッグを助けるために、list.at(i)とlist.at(i + 1)を使うことができます。これらは、通常、より役に立つメッセージでオーバーランのインデックスを作成します。 – emsr

答えて

8

コードのこの部分が疑わしい:

for (i = 0; i < num; i++) 
{ 
    output += list[i]; 
    output += bone1; 
    output += list[i + 1]; // <--- here 
    output += bone2; 
} 

あなたの配列は、長さ9を有しているので、その中の有効なインデックスは0、1、2の範囲、...、反復8 8.、示された行は無効な配列インデックス9を読み取ろうとします。この結果、未定義の動作が発生します。この場合、無効な文字列に関する誤解を招くエラーメッセージが表示されます。

この問題を解決するにはどのような手順をとるべきかを判断する必要がありますが、これが問題の直接的な原因だと私は信じています。

希望すると便利です。

+1

ありがとうございました!あなたは完全に正確でした。あなたがそれを指摘したとき、私はそれが本当にエラーであることに気付きました。私のクラスでは最近、配列を使用することから文字列を使用するようになりました。文字列は異なりますが、配列から逸脱したときには専門用語を表示するだけでした。とにかく、ありがとうございました。正確に何が必要なのか、forループが正しく表示されるように修正しました。 :) – scbeacham

2

9本のボーンを持っている場合は、9本ではなく8本の接続だけを印刷してください。最後のものはbone[8] & bone[9]です。 bone[9]は存在しません。

関連する問題