Как правильно поменять местами пустые указатели?

У меня есть задача:
мне нужно поменять местами элементы в массиве с помощью функции обмена, основанной на пустых указателях. Это простой алгоритм пузырьковой сортировки.
Но моя функция 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, и я до сих пор не понимаю, что не так.

Вы знаете, что есть стандартная функция std::swap, которая работает очень хорошо, верно? Кстати, почему ваш SwapInt принимает два void*? Два int& кажутся более подходящими.   —  person Nikita Albekov    schedule 22.02.2021

Вам нужен указатель или ссылка на эти указатели, если вы хотите воздействовать на них вне функции.   —  person Nikita Albekov    schedule 22.02.2021

Вы меняете локальные переменные, чтобы изменить то, что передается, используйте void SwapInt(void **x, void **y) или void SwapInt(void *&x, void *&y)   —  person Nikita Albekov    schedule 22.02.2021

Вы хотите поменять местами сами указатели или вы хотите поменять местами то, на что они указывают? Если x указывает на 1, а y указывает на 2, хотите ли вы поменять местами 1 и 2 так, чтобы x по-прежнему указывало на одно и то же место, но теперь это место содержит 2? Или вы хотите поменять местами x и y, чтобы x теперь указывало на другое место, но это место по-прежнему содержало то же самое 2, что и раньше?   —  person Nikita Albekov    schedule 22.02.2021

См. также:  Загрузка фикстур Symfony с помощью консольных команд
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. Nikita Albekov

    Вы не можете поменять местами целые числа, поменяв местами указатели, вам нужно разыменовать указатели. И для этого вы должны привести их к указателям 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.

    Это помогло! Я думал об этом, но, по-моему, это был дурной стиль. Теперь я вижу, что был не прав. Большое спасибо! person Nikita Albekov; 22.02.2021

    Ну, все упражнение в плохом стиле. Это тип кодирования, который вы бы сделали на C, а не на C++ (но я понимаю, что это не ваш выбор). person Nikita Albekov; 22.02.2021

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: