我有一个基本困扰的问题。首先,我有两个全局数组-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()方法中调用这两种方法的顺序,该问题将不再发生。任何人都不知道是什么原因造成的吗?

最佳答案

我认为您正在写的内容超出了trustArray的范围。您尚未提供初始化代码(请提供),但我想它看起来像这样:

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


N等于某个正整数。我的猜测是您的情况是fashionArray

在循环中,测试该N=5。将通过该测试的numberOfTrustsRecorded < 6的值为0、1、2、3、4、5。这是六(6)个浮点数,可以容纳5个数组。写入numberOfTrustsRecorded将覆盖内存。更改测试或将缓冲区大小增加到6。

为什么在fashionArray [0]中看不到有效值?我不知道。也许您的编译器调整了fashionArray内存缓冲区,以便覆盖在未使用的内存中开始,从而使IEEE浮点运算所需的位剩下一半。存储器中的任何位都构成一个随机浮点数。内存转储将显示问题。

为什么以相反的顺序运行该方法有效?可能该错误仍然存​​在,但是每秒运行numberOfTrustRecorded[5]可以清除getFashion()留下的混乱情况。您覆盖的内存是您的,因此,只要您不试图理解它,就不会有人抱怨。初始化getTrust(),运行fashionArray[0] = 0.0,然后在运行getTrust()之前查看fashionArray[0]。您可能会看到随机浮动。

关于c++ - 更改全局数组的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10038182/

10-13 08:25