2011-12-04 10 views
2

私はこれを解決できませんが、私はこの時点で私のマシンでメモリ上の問題があるかもしれないという事実をほぼ受け入れています。イニシャライザが2番目の配列を上書きしています

私はこの初期化子を持っている:

Search::Search(ifstream& inFile) 
{ 

    int id = 0; 
    int i = 0; 

    inFile >> id; 

    while (inFile) { 

     if(i < SEARCH_DATA_SIZE) { 

      SearchDataFirst[i] = id; 
      SearchDataFirstSorted[i] = id; 

     } else if(i >= SEARCH_DATA_SIZE) { 

      SearchDataLast[i] = id; 
      SearchDataLastSorted[i] = id; 

     } 

     i++; 
     inFile >> id; 
    } 

} 

そして、私のヘッダに私はそうのようなプライベートなデータを持っている

のconst int型SEARCH_DATA_SIZE = 20;

int SearchDataFirst[SEARCH_DATA_SIZE]; 
int SearchDataLast[SEARCH_DATA_SIZE]; 
int SearchDataFirstSorted[SEARCH_DATA_SIZE]; 
int SearchDataLastSorted[SEARCH_DATA_SIZE]; 

私は配列の印刷を行うと初期化子は、

を、INFILEから最初の20のintを取得し、それらを保存し、次のレコードを行くと、別の配列のものを記憶しています、 SearchDataFastSortedにはSearchDataLastの値がありますが、これが起こる可能性はありません。 SearchDataLastSortedには変なファンキーな数字があります。

SearchedDataFirstは問題ありません。

これは決してプログラミング言語には不満はありませんでした。

お手伝いできますように。

他に何も起こっていません。この時点でイニシャライザだけが呼び出されています。

答えて

1

i >= SEARCH_DATA_SIZEの場合、SearchDataLast[i]SearchDataLastを指しています。あなたはSearchDataFirstを移入し、あなたがSearchDataLastを移入開始する前に終わった後、ゼロに戻りiをリセットする必要があり、ある

for(int i = 0; i < SEARCH_DATA_SIZE; ++i) 
    { 
     inFile >> id; 
     SearchDataFirst[i] = id; 
     SearchDataFirstSorted[i] = id; 
    } 
    for(int i = 0; i < SEARCH_DATA_SIZE; ++i) 
    { 
     inFile >> id; 
     SearchDataLast[i] = id; 
     SearchDataLastSorted[i] = id; 
    } 

:何が本当に必要なのはこのようなものです。

+0

。本当にありがとうございます。 – superesp

+0

あなたは大歓迎です! – ruakh

0

あなたのロジックは意味をなさない。確かにつながるん現在の形で

} else if(i >= SEARCH_DATA_SIZE) { 
    SearchDataLast[i - SEARCH_DATA_SIZE] = id; 
    SearchDataLastSorted[i - SEARCH_DATA_SIZE] = id; 
} 

あなたはSearchDataLastSearchDataLastSorted中に書き込みをしようと、すべての単一の要素が配列の境界を超えている(:私は理解することができます最高の、あなたはこのような何かをしようとしていますメモリ破損)。

0

あなたの問題はここにある:彼らはサイズSEARCH_DATA_SIZEのだとiはその量以上であることから

else if(i >= SEARCH_DATA_SIZE) { 

     SearchDataLast[i] = id; 
     SearchDataLastSorted[i] = id; 

    } 

あなたは、SearchDataLastSearchDataLastSortedの境界を越えていきます。あなたはおそらくインデックスとしてi - SEARCH_DATA_SIZEです。

このため、あなたのケースでは、コンパイラが各アレイのメモリを順番に割り当てている未定義の動作が発生しています。だから、基本的にはSEARCH_DATA_SIZEの要素をSearchDataLastにスキップして、そこに入れたい値をSearchDataFirstSortedに格納しています。

0

SearchDataLastSearchDataLastSortedアレイをオーバーランさせないように注意してください。

iSEARCH_DATA_SIZEを超えて取得すると、あなたは、配列を切り替える...しかし...あなたはSearchDataLast配列よりも大きいSEARCH_DATA_SIZEからインデックス作成を続けます。

はおそらく、あなたのような何かを書くためのもの:

else if (i >= SEARCH_DATA_SIZE) 
    { 
     SearchDataLast[i-SEARCH_DATA_SIZE] = id; 
     SearchDataLastSorted[i-SEARCH_DATA_SIZE] = id; 
    } 

あなたはまだあなたがi2 * SEARCH_DATA_SIZE以上でないことを確実にすることによって、これらの配列の末尾に(オーバーフローしていないことを確認する必要があるでしょう

関連する問題