У меня есть задача:
мне нужно поменять местами элементы в массиве с помощью функции обмена, основанной на пустых указателях. Это простой алгоритм пузырьковой сортировки.
Но моя функция 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
Вы не можете поменять местами целые числа, поменяв местами указатели, вам нужно разыменовать указатели. И для этого вы должны привести их к указателям int, которыми они действительно являются.
На самом деле вы сделали это совершенно правильно в своей функции
CmpInt
, поэтому я не уверен, в чем проблема вSwapInt
.Это помогло! Я думал об этом, но, по-моему, это был дурной стиль. Теперь я вижу, что был не прав. Большое спасибо! — person Nikita Albekov; 22.02.2021
Ну, все упражнение в плохом стиле. Это тип кодирования, который вы бы сделали на C, а не на C++ (но я понимаю, что это не ваш выбор). — person Nikita Albekov; 22.02.2021