Изменена неверная переменная массива - PullRequest
0 голосов
/ 23 февраля 2019

В следующей функции я четко изменяю переменную rightArray с помощью оператора: rightArray[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 изменяется здесь вместо rightArray : rightArray[i] = dataValues[i];

            }
        }
    }

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

    return interquartileRange;
}

Я использую Xcode 10.1 и хочу знать, какисправьте эту ошибку, чтобы функция rightArray изменялась вместо leftArray.

1 Ответ

0 голосов
/ 23 февраля 2019

Имея

    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 без изменений бесполезно,секунда , если может быть , иначе , но также лучше сделать два для , чтобы не делать numberOfDatums/2 все время, только чтобы решить, какой массивиспользовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...