Завершение программы при попытке отсортировать массив объектов - PullRequest
0 голосов
/ 10 мая 2018

У меня есть class, называемый ContactInfo, и структурирована, как написано ниже:

class ContactInfo
{
    private:
        string contactName;
        string contactNumber;

        public:
            ContactInfo()
            {
                contactName = "";
                contactNumber = "";
            }
            //setter and getters
};

, и у меня есть функция, которая создает массив ContactInfo и заполняет его с помощью пользовательского ввода.После заполнения массива он будет передан другой функции, которая будет сортировать его, указанная функция записывается так, как показано ниже.

void sortListByName(ContactInfo contactList[], int listSize)
{
    for(int i = 0; i < listSize; i++)
    {
        for(int j = i+1; j < listSize+1; j++)
        {
            if(contactList[i].getContactName() > contactList[j].getContactName())
            {
                ContactInfo temp = contactList[j];
                contactList[i] = contactList[j];
                contactList[j] = temp;
            }

        }
    }
}

Основной метод

int main()
{
    ...

    int n;//array size
    ContactInfo *newList = contactList(n);//populates the array.
    sortListByName(newList, n);

    ...
}

Проблема заключается в том, чтопрограмма прекратит работу до того, как произойдет сортировка, и выдаст ошибку:

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
terminate called after throwing an instance of 'std::logic_error'
  what():  basic_string::_M_construct null not valid

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Ваша ошибка сделана в алгоритме сортировки на последней итерации. Дело в том, что в первой переменной цикла я переходит от 0 к listSize, а во-вторых, переменная цикла j переходит от i + 1 к listSize + 1. Когда переменная i достигает listSize-1, переменная j начинается с i + 1 во втором цикле for. Это означает, что j = listSize, а затем при попытке доступа к contactList [j] произойдет ошибка, так как элементы contactList начинаются с индекса 0 и заканчиваются индексом listSize-1.

void sortListByName(ContactInfo contactList[], int listSize)
 {
    for(int i = 0; i < listSize; i++)  //it should be for(int i=0;i<listSize-1;i++)
    {
       //here is your mistake. When i = listSize-1 then j=listSize and
      // that index is out of range.
       for(int j = i+1; j < listSize+1; j++) //it should be for(int j=i+1;j<listSize;j++)
       {
        if(contactList[i].getContactName() >     contactList[j].getContactName())
        {
            ContactInfo temp = contactList[j];
            contactList[i] = contactList[j];
            contactList[j] = temp;
        }

    }
}
}

Вот как должен выглядеть ваш код:

void sortListByName(ContactInfo contactList[], int listSize)
{
    for(int i = 0; i < listSize-1; i++)
    {
       for(int j = i+1; j < listSize; j++)
       {
            if(contactList[i].getContactName()>   contactList[j].getContactName())
            {
                ContactInfo temp = contactList[j];
                contactList[i] = contactList[j];
                contactList[j] = temp;
            }

     }
 }
0 голосов
/ 10 мая 2018

Посмотрите на верхнюю границу вашего внутреннего цикла. Обратите внимание, что мы можем иметь j, равный размеру массива для последней итерации.

В C ++ массив размером N имеет элементы, индексированные от 0 до N-1. В вашем случае вы пытаетесь получить доступ к элементу после конца массива и сталкиваетесь с неопределенным поведением . Убедитесь, что ваш индекс находится в пределах массива.

Во-вторых, вы должны использовать std :: vector над необработанными массивами, где это возможно.

В-третьих, стандартная библиотека предоставляет вам алгоритм std :: sort , который почти всегда будет быстрее, чем реализованная вами сортировка пузырьков.

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