2011-12-04 27 views
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个整数,保存它们,然后进入下一个记录和存储那些在单独的阵列,

当我做的阵列的打印, SearchDataFirstSorted具有SearchDataLast的值,即使这种情况不可能发生。 SearchDataLastSorted有奇怪的时髦数字。

SearchedDataFirst很好。

我从来没有对编程语言感到沮丧。

希望你能帮上忙。

没有什么事了,只有初始化器在这个时候被调用。

回答

1

问题是,如果i >= SEARCH_DATA_SIZE,那么SearchDataLast[i]指向外部SearchDataLast!你真正需要的是这样的:

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; 
    } 

也就是说,你需要重置i回零大功告成填充SearchDataFirst之后,你开始填充SearchDataLast之前。

+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

你的问题是在这里:

else if(i >= SEARCH_DATA_SIZE) { 

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

    } 

你路过的SearchDataLastSearchDataLastSorted界限,因为他们是大小SEARCH_DATA_SIZEi大于或等于量。你可能想要的是i - SEARCH_DATA_SIZE作为索引。

正因为如此,你导致了未定义的行为,在你的情况下,编译器已经按顺序为每个数组分配了内存。所以你基本上跳过SearchDataLast中的SEARCH_DATA_SIZE元素,并在SearchDataFirstSorted中存储你想要的值。

0

您不确保您不会超出SearchDataLastSearchDataLastSorted阵列。

i获得超越SEARCH_DATA_SIZE,你开关阵列,...但是...你继续从SEARCH_DATA_SIZE这比SearchDataLast阵列更大的索引。

想必,你打算写类似:

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

你仍然需要确保你不会溢出这些阵列的结束(通过确保i不是2 * SEARCH_DATA_SIZE或更大