Попытка использовать сортировку выбора на массиве структур - PullRequest
0 голосов
/ 27 января 2012

У меня есть массив структур, и я пытаюсь отсортировать его по цене, используя сортировку выбора.Я постоянно получаю сигнал ECX_BAD_ACCESS.

Вот что у меня есть:

#include <iostream>
#include <string>
using namespace std;

Так что это просто структура с именем и ценой.Цена - это то, что я хочу отсортировать по

struct Thing
{
    std::string name;
    double price;
};

. Прямо сейчас основной метод просто проверяет, работает ли функция sortThing.

Thing *sortThing(Thing input[], int size);

int main ()
{
    Thing *stuff = new Thing[3];

    stuff[0].name = "middle";
    stuff[0].price = 2.00;
    stuff[1].name = "last";
    stuff[1].price = 3.00;
    stuff[2].name = "first";
    stuff[2].price = 1.00;

    stuff = sortThing(stuff, 3);

    cout << stuff[0].name + " " + stuff[1].name + " " + stuff[2].name;

    return 0;
}

Здесьпроблема в.Он жалуется на строку, в которой я назначаю input [maxIndex] .name для output [i] .name, говоря: «Программа получила 'EXC_BAD_ACCESS'»

Thing *sortThing(Thing input[], int size)
{
    Thing *output = new Thing[size];
    Thing nullThing;
    nullThing.name = "&nullThing";
    int min = 0;
    int minIndex;

    for (int i = 0; i < size; i++)
    {

        for (int j = 0; j < size; j++)
        {
            if (input[j].name.compare("&nullThing") != 0 && input[j].price <= min) minIndex = j;
        }
        output[i].name = input[minIndex].name;
        output[i].price = input[minIndex].price;
        input[minIndex] = nullThing;
        minIndex = 0;
        min = 0;
    }

    return output;
}

Любая помощь приветствуется

Ответы [ 2 ]

2 голосов
/ 27 января 2012

Я думаю, что ваш цикл определения minIndex неверен ... Поскольку все цены>> 0, вы никогда не установите minIndex, и, поскольку вы никогда не инициализировали его, его значением может быть что угодно.Скорее всего, в вашем случае значение выходит за пределы диапазона массива и фактически приводит к ошибке массива вне границ.

Возможно, стоит рассмотреть некоторые алгоритмы сортировки.

0 голосов
/ 27 января 2012

Отладка 101: вот первое, что нужно сделать. Изменения:

int minIndex;

до:

int minIndex = -42;

(временно), затем выведите значение minIndex сразу после внутреннего цикла.

Это покажет вам, что значение не изменяется.

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

Быстрое исправление, сначала установите min в INT_MAX (а также в том месте, где вы сбросили его в конце внешнего цикла).

...