Форум программистов, компьютерный форум CyberForum.ru

Переделать функцию c указателем на int, на функцию с указателем на void - C++

Восстановить пароль Регистрация
 
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
19.02.2013, 21:38     Переделать функцию c указателем на int, на функцию с указателем на void #1
Есть рабочий код qsort для int:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
void qsort(int *base, int n)
{
    // Прекратить если количество элементов меньше либо равно единице.
    if (n <= 1)
        return;
 
    int mid_val = base[n/2]; // Запомним цетральное значение
    int left = 0;
    int right = n-1;
 
    while (left < right)
    {
        while (base[left] < mid_val)
            ++left;
        while (base[right] > mid_val)
            --right;
 
        if (left < right)
        {
            int tmp = base[left];
            base[left] = base[right];
            base[right] = tmp;
            ++left;
            --right;
        } 
        else if (left == right) // пропустим одинаковые элементы
        {
            ++left;
            --right;
        }
    }
 
    qsort(base, right + 1);
    qsort(base + left, n - left);
}
Пытаюсь переделать его на void но знаний не хватает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
typedef int (*PTF)(const void*, const void*);
 
void qsort(void *base, size_t n, size_t sz, PTF cmp)
{
    // Прекратить если количество элементов меньше либо равно единице.
    if (n <= 1)
        return;
 
    char* bm = static_cast<char*>(base) + (n/2)*sz;
    char* bl = static_cast<char*>(base);
    char* br = static_cast<char*>(base) + (n-1)*sz;
 
    while (bl < br)
    {
        while (cmp(bm, bl) > 0)
            bl += sz;
        while (cmp(bm, br) < 0)
            br -= sz;
 
        if (bl < br)
        {
            for (int i = 0; i < int(sz); ++i)
            {
                char temp = bl[i];
                bl[i] = br[i];
                br[i] = temp;
            }
            bl += sz;
            br -= sz;
        } 
        else if (bl == br) // пропустим одинаковые элементы.
        {
            bl += sz;
            br -= sz;
        }
    }
 
    qsort(base, (size_t)br/sz + 1, sz, cmp); // ЧУВСТВУЮ ЧТО ПРОБЛЕМА ЗДЕСЬ
    qsort(base + (size_t)bl/sz, n - (size_t)bl/sz, sz, cmp); // И ЗДЕСЬ
}
 
int comp(const void* i, const void* j)
{
    return *static_cast<const int*>(i) - 
        *static_cast<const int*>(j);
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.02.2013, 21:38     Переделать функцию c указателем на int, на функцию с указателем на void
Посмотрите здесь:

C++ Работа с указателем на void *
как написать функцию возвращающую объект с указателем на кучу C++
Переделать программы под функцию, void C++
В чем разница между указателем и указателем на указатель? C++
C++ Проблема с указателем на функцию
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vua72
410 / 410 / 83
Регистрация: 28.11.2010
Сообщений: 1,158
19.02.2013, 21:47     Переделать функцию c указателем на int, на функцию с указателем на void #2
А что такое void вы понимаете? В С++ такое шаблонами решается?
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
20.02.2013, 22:33  [ТС]     Переделать функцию c указателем на int, на функцию с указателем на void #3
Да решается, но вопрос не в этом

Добавлено через 13 минут
Вот ктати есть рабочий пример с Пузырьковой сортировкой:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
 
typedef int (*PTF)(const void*, const void*);
 
// base указатель на массив, n - количество элементов,
// sz - размер типа, cmp - компаранда.
void bsort(void* base, size_t n, size_t sz, PTF cmp)
{
    for (int i = 1; i < int(n); ++i)
        for (int j = n-1; j >= i; --j) {
            char* b = static_cast<char*>(base); // приведение к char 
            char* jl = b + (j*sz);
            char* jr = b + (j-1)*sz;
            if (cmp(jr, jl) > 0)
            {
                // побайтовое перемещение
                for (int k = 0; k < int(sz); ++k)
                {
                    char temp = jl[k];
                    jl[k] = jr[k];
                    jr[k] = temp;
                }
            }
        }
}
 
int int_cmp(const void* i, const void* j)
{
    return *static_cast<const int*>(i) - 
        *static_cast<const int*>(j);
}
int double_cmp(const void* i, const void* j)
{
    return *static_cast<const double*>(i) -
        *static_cast<const double*>(j);
}
 
int main()
{
    const int SIZE = 10;
    int int_arr[SIZE] = {4, 6,-3, 17, 22, 45, -476, 8, 3, -46};
    double double_arr[SIZE] = {56.34, -4565.236, 45454.666, -56.9, 77.01, 0.1, 12.4, 45.8, -11.6, 104.3};
 
    bsort(int_arr, SIZE, sizeof(int), int_cmp);
    bsort(double_arr, SIZE, sizeof(double), double_cmp);
 
    for (int i = 0; i < SIZE; ++i)
        std::cout << int_arr[i] << "  ";
    std::cout << '\n';
    
    for (int i = 0; i < SIZE; ++i)
        std::cout << double_arr[i] << "  ";
    std::cout << '\n';
 
    return 0;
}
Добавлено через 17 часов 37 минут
Ребята, помогите, ведь осталось совсем не много

Добавлено через 6 часов 44 минуты
Добрые люди, я запутался в адресной арифметике, нужна ваша помощь!
Denis.
0 / 0 / 0
Регистрация: 02.09.2012
Сообщений: 20
20.02.2013, 22:46     Переделать функцию c указателем на int, на функцию с указателем на void #4
Объектов типа void не сушествует.
Если функция не возвращает значения - указывают void. Т.е. переделать функцию на использование void в качестве аргуметов - нереально. Однако, void может использоватся для указателей на объекты неизвестного типа. Можно переделать функцию только на использование указаталей void*, а не тип void.
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
20.02.2013, 23:06  [ТС]     Переделать функцию c указателем на int, на функцию с указателем на void #5
Цитата Сообщение от Denis. Посмотреть сообщение
Объектов типа void не сушествует.
Если функция не возвращает значения - указывают void. Т.е. переделать функцию на использование void в качестве аргуметов - нереально. Однако, void может использоватся для указателей на объекты неизвестного типа. Можно переделать функцию только на использование указаталей void*, а не тип void.
Внимательно ещё раз прочитайте название темы.
Denis.
0 / 0 / 0
Регистрация: 02.09.2012
Сообщений: 20
20.02.2013, 23:20     Переделать функцию c указателем на int, на функцию с указателем на void #6
Извиняюсь, бегло прочитал в начале.

void* нужно преобразовать в указатель определённого типа, перед использованием, потому что компилятор не знает, на что ссылается указатель.

У Вас в 39 строчке
C++
1
qsort(base + (size_t)bl/sz, n - (size_t)bl/sz, sz, cmp); // И ЗДЕСЬ
указатель void* используется в вычислениях.
Yandex
Объявления
20.02.2013, 23:20     Переделать функцию c указателем на int, на функцию с указателем на void
Ответ Создать тему
Опции темы

Текущее время: 08:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru