我有一个问题,我基本上感到困惑。首先,我有两个全局数组 - trustArray []和fashionArray []。这是填充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 []中的两个值。如果我将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";
}
以下是调用这两种方法的主要方法:
int main () {
getFashion();
getTrust();
for(int x=0; x<6;x++)
cout<<fashionArray[x]<<endl;
getchar();
return 0;
}
fashionArray的前两个值最终被改为一些可笑的大的负面和正面整数。有趣的是,如果我颠倒main()方法中调用这两个方法的顺序,则问题不再发生。任何人都知道可能导致这种情况的原因是什么?
答案 0 :(得分:2)
我认为你的写作超出trustArray
并进入fashionArray
。你没有提供初始化代码(请做),但我想它看起来像这样:
float trustArray[N];
float fashionArray[N];
N等于某个正整数。我猜你的情况是N=5
。
在循环中,您测试numberOfTrustsRecorded < 6
。将通过该测试的numberOfTrustsRecorded
的值为0,1,2,3,4,5。这是六(6)个浮点数以适合5的数组。写numberOfTrustRecorded[5]
将覆盖内存。更改测试或将缓冲区大小增加到6。
为什么你没有在fashionArray [0]中看到有效值?我不知道。也许您的编译器与fashionArray内存缓冲区对齐,因此覆盖在未使用的内存中启动,从而使您只需要一半的位来使IEEE浮动。内存中的任何位构成随机浮点数。内存转储会显示问题。
为什么以相反的顺序运行方法有效?可能该错误仍然存在,但运行getFashion()
秒可以清除getTrust()
留下的混乱。你覆盖的记忆是你的,所以只要你不想弄清楚,没有人会抱怨。初始化fashionArray[0] = 0.0
,运行getTrust()
并在运行fashionArray[0]
之前查看getFashion()
。您可能会看到随机浮动。