【问题标题】:Wrong array variable getting changed更改了错误的数组变量
【发布时间】:2019-02-23 15:54:49
【问题描述】:

在下面的函数中我通过语句明确地改变了变量rightArrayrightArray[i] = dataValues[i];

但是我从函数中得到的行为是变量 leftArray 正在改变而不是 rightArray

//Returns the interquartile range
float StatisticalAnalyser::getInterquartileRange()
{
    float interquartileRange = 0;

    int numberOfDatums = dataFile.findNumberOfDatums();
    float numberOfDatumsFloat = dataFile.findNumberOfDatums();
    float dataValues[dataFile.findNumberOfDatums()];

    dataFile.initialiseArrayToFileData(dataValues);

    //If even number of datums
    if (numberOfDatums % 2 == 0)
    {
        //Arrays for for each side of the median
        int arraySize = numberOfDatumsFloat/2;
        float leftArray[numberOfDatums/2];
        float rightArray[numberOfDatums/2];

        //Initialise arrays for each side of the median
        for (int i = 0; i < numberOfDatums; i++)
        {
            if (i < numberOfDatums/2)
            {
                leftArray[i] = dataValues[i];
            }
            if (i >= numberOfDatums/2)
            {
                //leftArray SOMEHOW GETS CHANGED INSTEAD OF RIGHT ARRAY
                rightArray[i] = dataValues[i];

此处更改了 leftArray 而不是 rightArrayrightArray[i] = dataValues[i];

            }
        }
    }

    if (numberOfDatums % 2 == 0.5)
    {
        //Not relevant, isn't triggered when problem occurs
    }

    return interquartileRange;
}

我正在运行 Xcode 10.1,并且想知道如何修复此错误,以便函数更改 rightArray 而不是 leftArray

【问题讨论】:

  • 为什么投反对票?我试图尽可能简洁明了,并在本网站和谷歌上研究过类似的问题,但没有找到令人满意的答案:/
  • 我不是反对者,但要求调试的问题是题外话。如有疑问,您可以阅读What topics can I ask about here?。一般来说,使用Tour 对该网站进行简短介绍不会有什么坏处。
  • @Scheff 感谢您的提醒,我会小心谨慎地浏览页面!
  • 我不确定您的代码有什么问题,但numberOfDatums % 2 == 0.5 肯定没有达到您的预期。 operator% 专门用于整数值(如果没有重载),这永远不会成为真的。
  • @AShinyBlueColour 你有一个简单的错误,看我的回答

标签: c++ arrays xcode for-loop output


【解决方案1】:

拥有

    float leftArray[numberOfDatums/2];
    float rightArray[numberOfDatums/2];

       if (i >= numberOfDatums/2)
        {
            //leftArray SOMEHOW GETS CHANGED INSTEAD OF RIGHT ARRAY
            rightArray[i] = dataValues[i];

你走出rightArray,随机写入leftArray(当然这是未定义的行为)

必须

       if (i >= numberOfDatums/2)
        {
            rightArray[i - numberOfDatums/2] = dataValues[i];

还有,有

       if (i < numberOfDatums/2)
        {
            ...
        }
        if (i >= numberOfDatums/2)

i不变也没用,第二个if可以是一个else,不过也最好做两个for 不必一直使用numberOfDatums/2 来决定使用哪个数组。

【讨论】:

  • 谢谢,我想我需要提高我的调试技能。
猜你喜欢
  • 2020-10-18
  • 1970-01-01
  • 2013-05-08
  • 1970-01-01
  • 1970-01-01
  • 2014-11-19
  • 1970-01-01
  • 2021-11-03
  • 1970-01-01
相关资源
最近更新 更多