0

基本的に困惑している問題があります。まず、trustArray[] と fashionArray[] という 2 つのグローバル配列があります。trustArray を埋める関数は次のとおりです。

void getTrust()
{
    string line;
    int reachedTrust=0;
    int numberOfTrustsRecorded=0;
    ifstream myfile ("BuyingJeans.Hw5 (1).csv");
    if (myfile.is_open())
    {
        while ( myfile.good() )
        {
            getline (myfile,line,',');
            //int found=line.find("Like-Purchase");
            if (line=="Trust-Like"){
                reachedTrust=1;
                getline (myfile,line,',');
            }
            if(reachedTrust==1){
                if(numberOfTrustsRecorded <6){
                    double testValue = atof(line.c_str());
                    trustArray[numberOfTrustsRecorded] = testValue;
                    numberOfTrustsRecorded++;
                }
            }
        }
        myfile.close();
    }
    else
        cout << "Unable to open file"; 
}

何らかの理由で、atof()この関数の が fashionArray[] の 2 つの値を変更しています。を に変更するatof()atoi()、問題は発生しなくなります。変更される配列を埋めるメソッド (fashionArray[]) は次のとおりです。

void getFashion(){
string line;
int reachedFashion=0;
int numberOfFashionsRecorded=0;
ifstream myfile ("BuyingJeans.Hw5 (1).csv");
if (myfile.is_open())
{
    while ( myfile.good() )
    {
        getline (myfile,line,',');
        if (line=="Like-Fash -->"){
            reachedFashion=1;
            getline (myfile,line,',');
            //cout<<line<<endl;
            //getchar();
        }
        if(reachedFashion==1){
            if(numberOfFashionsRecorded <6){
                fashionArray[numberOfFashionsRecorded] = atoi(line.c_str());
                numberOfFashionsRecorded++;
            }
        }

    }
    myfile.close();
}

else cout << "Unable to open file"; 

}

これら 2 つのメソッドを呼び出すメイン メソッドを次に示します。

int main () {

getFashion();
getTrust();

for(int x=0; x<6;x++)
    cout<<fashionArray[x]<<endl;
getchar();
return 0;
}

fashionArray の最初の 2 つの値は、途方もなく大きな負の整数と正の整数に変更されます。興味深い点の 1 つは、main() メソッドで 2 つのメソッドが呼び出される順序を逆にすると、問題が発生しなくなることです。誰がこれを引き起こしているのか考えていますか?

4

1 に答える 1

2

trustArrayあなたは を超えて に書いていると思いますfashionArray。初期化コードを提供していません (提供してください) が、次のようになっていると思います。

float trustArray[N];
float fashionArray[N];

N は正の整数に等しい。私の推測では、あなたの場合、N=5.

あなたのループでは、それをテストしnumberOfTrustsRecorded < 6ます。そのテストに合格する値はnumberOfTrustsRecorded、0、1、2、3、4、5 です。これは、5 の配列に収まる 6 つの float です。書き込みは、numberOfTrustRecorded[5]メモリを上書きします。テストを変更するか、バッファ サイズを 6 に増やしてください。

fashionArray[0] に有効な値が表示されないのはなぜですか? 知らない。おそらく、コンパイラが fashionArray メモリ バッファを調整したため、未使用のメモリで上書きが開始され、IEEE フロートを作成するために必要な半分のビットが残ります。メモリ内のビットが何であれ、ランダムフロートを構成します。メモリ ダンプが問題を示します。

メソッドを逆の順序で実行すると機能するのはなぜですか? おそらくバグはまだ残っていますが、getFashion()2 番目に実行すると、 によって残された混乱が解消されgetTrust()ます。上書きした記憶はあなたのものなので、理解しようとしない限り、誰も文句を言いません。初期化fashionArray[0] = 0.0して、実行して、実行する前にgetTrust()見てください。おそらくランダムフロートが表示されます。fashionArray[0]getFashion()

于 2012-04-06T03:32:01.293 に答える