У меня есть задача:
Мне нужно поменять местами элементы в массиве с помощью функции обмена «на основе недействительных указателей» . Это простой алгоритм пузырьковой сортировки.
Но моя функция void SwapInt(void *x, void *y) не работает! То есть позвонил правильно, но ничего не сделал. Мой массив предварительной сортировки не меняется. Что здесь могло быть не так и как это исправить?

void SwapInt(void *x, void *y)
{
    void *buffer = x;
    x = y;
    y = buffer;
}

bool CmpInt(void *x, void *y)
{
    int *intPtrX = static_cast<int*>(x);
    int *intPtrY = static_cast<int*>(y);
    if(*intPtrX > *intPtrY)
        return true;
    else
        return false;
}

void Sort(int array[], int nTotal, size_t size, void (*ptrSwapInt)(void *x, void *y), bool (*ptrCmpInt)(void *x, void *y))
{
    for (int i = 0; i < nTotal; i++)
    {
        for (int j = 0; j < nTotal - 1; j++)
        {
          if (ptrCmpInt(&array[j] , &array[j + 1]))
          {
            ptrSwapInt(&array[j], &array[j + 1]);
          }
        }
    }
}

PS Я уже посетил StackOverflow_1 и StackOverflow_2 , и я до сих пор не понимаю, что не так.

c++
1
Nikita Albekov 22 Фев 2021 в 00:04

1 ответ

Лучший ответ

Вы не можете поменять местами целые числа, поменяв местами указатели, вы должны разыменовать указатели. И для этого вам нужно преобразовать их в указатели int, которыми они действительно являются.

void SwapInt(void *x, void *y)
{
    int temp = *static_cast<int*>(x);
    *static_cast<int*>(x) = *static_cast<int*>(y);
    *static_cast<int*>(y) = temp;
}

На самом деле вы сделали это совершенно правильно в своей функции CmpInt, поэтому я не уверен, в чем была проблема в SwapInt.

1
john 21 Фев 2021 в 21:10