2012-04-06 3 views
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つのメソッドを呼び出すmainメソッドである:

int main() { 

getFashion(); 
getTrust(); 

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

最初fashionArrayの2つの値は、ちょっとばかりに大きな負の整数と正の整数に変わります。興味深いことに、main()メソッドで2つのメソッドが呼び出される順序を逆にすると、問題は発生しなくなります。誰でもこれを引き起こしている可能性がある何か考えている?

+5

trustArrayはどこで宣言され割り当てられていますか? – DRVic

+0

Cの文字列を変換するのに失敗した 'atof()'のように、負の値と負の値が大きく変わる(値が範囲外であるため、+/- HUGE_VALが返されます)... – user268396

+0

trustArrayは配列として宣言され、それは変更されています。私は範囲の説明からの値に同意しますが、なぜそれが異なる配列の値を変更させるのかについてはまだ混乱しています。 –

答えて

2

trustArrayを超えてfashionArrayに書いていると思います。あなたは(実行してください)初期化コードを提供していないが、私はそれがこのようなものになりますと仮定します。いくつかの正の整数に等しいNで

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

を。私の推測はあなたの場合、N=5です。

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

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

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

+0

ニースの男。ルーキーミス私の部分で - 私は6のサイズではなく、5の配列を持っていた。 –

関連する問題