1

いくつかの行列補完アルゴリズムをテストするためだけに書いたこの小さなプログラムに対して、私は頭を悩ませてきました。バッファがオーバーフローしている可能性があると思いますが、バッファ全体が破損する理由について最も興味があります。ありがとうございました

    MovieRating base[baseNum];
MovieRating test[NUM_RATINGS - baseNum];


//load the base data set
string line ="";
ifstream baseF("assets/u1.base");
ifstream testF("assets/u1.test");
if(baseF.fail()){
    cout << "Unable to open File. Program Terminating..."<<endl;
    return 1;
}

int i = 0;
getline(baseF, line);
while(baseF || i < sizeof(base)){
    base[i] = StringToRating(line);
    i++;
    getline(baseF,line);
}

cout << base[15000].mId << " " << base[15000].uId << " " << base[15000].rating << " " << base[15000].timestamp << endl;
baseF.close();
cout << base[15000].rating << endl;


//load testing dataset
if(testF.fail()){
    cout << "Unable to open File. Program Terminating..."<<endl;
    return 1;
}


i = 0;
getline(testF, line);
while(testF || i < sizeof(test)){
    test[i] = StringToRating(line);
    i++;
    getline(testF,line);
}
testF.close();
cout << base[15000].rating << endl;

GlobalMeanValue(base, test);
return 0;

NUM_RATINGS は 100,000 で、baseNum は 80,000 です

最初の 2 つのカウントからの出力は正しく、3 番目は最後の 20,000 の映画の評価を読み込んだ後のガベージ値です。各 MovieRating は 16 バイトです。

再度、感謝します

また、これが64ビットLinuxシステム上にあることをほとんど忘れていました。

4

1 に答える 1

2

あなたの問題は2つあり、この行ではwhile(baseF || i < sizeof(base)){:

まず、&&代わりに使用することを意味して||いるため、入力が使い果たされたら完了です。

2 つ目sizeof(base)は、要素の数ではなく、配列の合計サイズです。sizeof(base) / sizeof(base[0])

于 2013-06-10T15:11:46.387 に答える