0

我有一个问题,我基本上对此感到困惑。首先,我有两个全局数组 - 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()an 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() 方法中调用这两个方法的顺序,问题就不再发生了。任何人都知道可能导致这种情况的原因是什么?

4

1 回答 1

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()second 会清除getTrust(). 你覆盖的记忆是你的,所以只要你不去理解它,没有人会抱怨。初始化fashionArray[0] = 0.0,运行,运行前getTrust()查看。您可能会看到随机浮动。fashionArray[0]getFashion()

于 2012-04-06T03:32:01.293 回答