私はこのプログラムでランタイムエラーが発生していて、問題が何かを見つけることができました。何らかの理由で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;
}
実際に「Pixel」はどのように見えますか?そして外側のループは疑わしいように見えます。あなたは3行だけを期待していますか?最初に行を読み取った後にループカウンタを評価するので、4行を読み込むためです。 3行しか読みたくない場合は、ループ本体の中で 'getline()'を動かしてください。その点については、外側のループは各反復で読み込んだ行を無視しています。本当にそれをしたいのですか? 'fileToVector()'を呼び出す前に 'height'個の要素を保持するために' vctr'をあらかじめサイズ設定しましたか?存在しない要素にアクセスするために 'operator []'を使うことはできません –
あなたの 'vctr'は小さすぎるので、あなたはそれをboudsからアクセスしています。あなたが検証可能な例を投稿できるなら、それが最善でしょう。また、エラーを最小限に抑えながら見つけることができます。 – krzaq
'for(int i = 0; i
Xirema