2016-11-17 17 views
-3

私はこのプログラムでランタイムエラーが発生していて、問題が何かを見つけることができました。何らかの理由でpush_back関数があります完了せずにクラッシュする。ベクトルのベクトルにプッシュするときにランタイムエラーが発生する

コンストラクターは問題ありません。stringstreamは問題ありませんが(coutは両方ともテスト済みです)、vctr[i].push_back(Pixel(r,g,b);以降のものは実行されません。プログラムはすぐにその時点でタイムアウトします。

また、ベクターに直接値を割り当てるときも同じことが行われます。例:問題のvctr[i][j] = Pixel(r,g,b);

コード:

bool Picture::filetoVector(ifstream& fin, vector<vector<Pixel> >& vctr, int& cmax){ 
    string line, filetype; 
    istringstream ssin; 
    int width, height, r, g, b; 

    //if fin fails to open file, return false & quite function. 
    if(fin.fail()) return false; 

    //This for loop grabs filetype, # of rows & columns (height & width), and cmax. 
    for(int i = 0; getline(fin,line) && i < 3;i++){....} 

    //This loop reads to vctr. 
    for(int i = 0; i < height; i++){ 
     for(int j = 0; j < width; j++){ 
      getline(fin,line); 
      ssin.clear(); 
      ssin.str(line); 

      ssin >> r >> g >> b; 
      //This is where things are breaking. 
      vctr[i].push_back(Pixel(r,g,b)); 
     } 
    } 
    return true; 
} 

ピクセルクラス:

struct Pixel{ 
    int red, green, blue; 
    Pixel(); 
    Pixel(int r, int g, int b); 
}; 

ピクセルのみが3つの整数と2つのコンストラクタを含む、非常に基本的なものです。 Pixel()は赤、緑を&青をゼロに、Pixel(int r、int g、int b)は赤をr、緑をgに設定します。

filetoVectorのコール:

if(newpicture.filetoVector(filein, newvector, colorMax)){ 
    cout << "Error: unable to read PPM file " << inputFilename; 
    return -1; 
} 
+4

実際に「Pixel」はどのように見えますか?そして外側のループは疑わしいように見えます。あなたは3行だけを期待していますか?最初に行を読み取った後にループカウンタを評価するので、4行を読み込むためです。 3行しか読みたくない場合は、ループ本体の中で 'getline()'を動かしてください。その点については、外側のループは各反復で読み込んだ行を無視しています。本当にそれをしたいのですか? 'fileToVector()'を呼び出す前に 'height'個の要素を保持するために' vctr'をあらかじめサイズ設定しましたか?存在しない要素にアクセスするために 'operator []'を使うことはできません –

+2

あなたの 'vctr'は小さすぎるので、あなたはそれをboudsからアクセスしています。あなたが検証可能な例を投稿できるなら、それが最善でしょう。また、エラーを最小限に抑えながら見つけることができます。 – krzaq

+0

'for(int i = 0; i Xirema

答えて

2

はStackOverflowのダンテへようこそ。あなたは間違いなくここに迅速かつスマートな答えを得るために十分な情報を投稿していません。あなたは、特別に、より多くのコードを投稿する必要があります

  • 人々がvctrが初期化された方法を見つけ出すことができるように関数を呼び出すものを。
  • ピクセルクラス定義(ない場合はこの1つは、最も可能性の高い危険なベクトルにPixel項目をされて押し、?3のルールを尊重しない)

私は、とにかくそれをあなたの「ブラインドモード」で試してみます「あなたはvctr[i]を行う場合に最も可能性の高い外の束縛指数でvctrにアクセス再:

だから、あなたは、単に実行する必要があります。

vctr.resize(height) 

あなたの開始のforループのネストされた2の前に。 heightの要素が存在することを確認するには...

+0

これは間違いなく、貧しい質問についても謝ります。私は先に進み、PixelクラスとfiletoVectorの呼び出しで編集しました。どうもありがとうございました! – Dante

関連する問題