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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
xtorne21st
интересующийся
303 / 274 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
#1

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

19.02.2013, 21:38. Просмотров 521. Ответов 5
Метки нет (Все метки)

Есть рабочий код 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
Посмотрите здесь:

Указатели на функцию. Задача 2: функция предикат с void указателем - C++
Сумму элементов массива, лежащих в пределах (a &lt;b)

Проблема с указателем на функцию - C++
Доброго времени суток, пишу приложение, которое реализует все функции АТД (двусвязный список). Есть стандартная библиотека, есть функция...

Работа с указателем на функцию - C++
Пытаюсь сделать указатель, принимающий строку и возвращающий вектор интов, не получается с присвоением результата из указателя в переменную...

Typedef перед указателем на функцию - C++
Есть функция int func(int, int). Указатель на функцию int (*pointer)(int, int). Что будет означать такая запись typedef int...

Двумерный массив с ключом и указателем на функцию - C++
Здравствуйте. Подскажите, пожалуйста, как реализовать двумерный массив с ключом и указателем на функцию. Задача: на вход поступает...

как написать функцию возвращающую объект с указателем на кучу - C++
уперся в следующее: есть класс содержащий в себе указатель на динамическую память (кучу). В общем-то это массив размерность которого...

В чем разница между указателем и указателем на указатель? - C++
int x, *p, *q; x=10; p=&amp;x; q=p; cout&lt;&lt;*q; int x, *p, **q; x=10; p=&amp;x; q=&amp;p;

Работа с указателем на void * - C++
Добрый всем день. Помогите пожалуйста вот по какому вопросу. Имеется некая функция: void* str_replace( const char str ) { ...

Заменить функцию void на функцию int - C++
#include &lt;iostream&gt; #include &lt;ctime&gt; using namespace std; void f(int *arr, const int N, int a) { int k = 0, v = 0; for (int...

Функция с указателем на void** не получается вернуть данные? - C++
Здорова! Есть код: #include &lt;iostream&gt; using std::cout; struct IMotion { virtual int&amp; get_val()=0; };

Переделать программы под функцию, void - C++
#include &quot;stdafx.h&quot; #include &lt;stdio.h&gt; #include &lt;clocale&gt; #include &lt;conio.h&gt; #include &lt;iostream&gt; #include &lt;fstream&gt; #include...

Что надо чтобы с void переделать в int - C++
void theBestStudent(Student *students, int n) { double max = students.srBall; string theBest = students.nameSt; for (int i = 1;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vua72
415 / 415 / 85
Регистрация: 28.11.2010
Сообщений: 1,183
Завершенные тесты: 1
19.02.2013, 21:47     Переделать функцию c указателем на int, на функцию с указателем на void #2
А что такое void вы понимаете? В С++ такое шаблонами решается?
xtorne21st
интересующийся
303 / 274 / 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
интересующийся
303 / 274 / 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
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru