Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
alkagolik
Заблокирован
#1

конфликт типов - C++

09.10.2011, 23:00. Просмотров 1662. Ответов 27
Метки нет (Все метки)

пишу себе Си хедер. как реализовать универсальность одной функции для всех типов?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.10.2011, 23:00
Я подобрал для вас темы с готовыми решениями и ответами на вопрос конфликт типов (C++):

Конфликт типов (int, double, bool) - C++
Есть простейший класс class A { public: A( long ) {} A( double ){} A( bool ) {} } и при создании обьекта new...

Найти предельные значения для целочисленных типов. Не использовать заранее определенные константы границ типов. - C++
Буду благодарен! Найти предельные значения для целочисленных типов. Не использовать заранее определенные константы границ типов.

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

Конфликт имён - C++
Добрый день. При запуске программы возникает следующая ошибка: Сейчас изучаю книгу Страуструпа "Программирование. Принципы и...

Конфликт итераторов - C++
Доброго времени суток. Пишу Timsort с использованием шаблонов и итераторов. Написал класс CTimsort, в нем все необходимые методы и их...

Конфликт компиляторов - C++
Здравствуйте, я относительно недавно начал программировать, экспериментирую с созданием игр на движке HGE. У меня установлен Microsoft...

27
alkagolik
Заблокирован
10.10.2011, 03:30  [ТС] #16
alex_x_x, ну суть в том чтобы функция имела возможность принимать аргумент любого типа и с ним работать. Делать несколько дубликатов одной функции как-то неправильно, правильно? простите за тавтологию. вот я ищу способ как в Си написать функцию, которая обработает любой аргумент.

Добавлено через 27 минут
в том числе и собственный структурный тип
0
accept
4831 / 3252 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
10.10.2011, 04:03 #17
сделай void *, на него подаёшь char **, внутри функции уже приводишь к нужному
void * гарантирует правильное восстановление указателя, ранее сохранённого в него
1
alkagolik
Заблокирован
10.10.2011, 04:52  [ТС] #18
Цитата Сообщение от accept Посмотреть сообщение
внутри функции уже приводишь к нужному
это как вообще сделать? по ключу duplicate в стандарте С99 попадаю на enum и case

Добавлено через 14 минут
так ну с этим есть. передали, продублировали, но это когда заранее известен тип. или не так?
C
1
2
3
4
void func(void *arg)
{
    char **str = arg;
}
0
accept
4831 / 3252 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
10.10.2011, 05:14 #19
тип передаёшь вторым аргументом в виде кода (делаешь enum)
0
alkagolik
Заблокирован
10.10.2011, 05:37  [ТС] #20
не врубаюсь я как константой передать. пойду посплю немного, может просветлеет
0
accept
4831 / 3252 / 165
Регистрация: 10.12.2008
Сообщений: 10,569
10.10.2011, 05:59 #21
C
1
void func(void *p, enum type t);
0
easybudda
Модератор
Эксперт CЭксперт С++
10000 / 5923 / 997
Регистрация: 25.07.2009
Сообщений: 11,172
10.10.2011, 08:46 #22
Цитата Сообщение от alkagolik Посмотреть сообщение
а есть вообще где глянуть сорцы сишных функций?
Установить glibc-src из портов/пакетов/тарбола/etc...
Код
ls /usr/src/glibc/
далее по обстоятельствам.
Цитата Сообщение от alkagolik Посмотреть сообщение
суть в том чтобы функция имела возможность принимать аргумент любого типа и с ним работать
На всякий случай и printf/scanf посмотрите...
1
alkagolik
Заблокирован
10.10.2011, 17:32  [ТС] #23
у меня почему-то (я и раньше обращал внимание) не glibc, а gnulib и сорцы лежат в /usr/share/gulib/lib
0
easybudda
Модератор
Эксперт CЭксперт С++
10000 / 5923 / 997
Регистрация: 25.07.2009
Сообщений: 11,172
10.10.2011, 18:37 #24
Цитата Сообщение от alkagolik Посмотреть сообщение
у меня почему-то (я и раньше обращал внимание) не glibc, а gnulib и сорцы лежат в /usr/share/gulib/lib
Во FreeBSD оно в /usr/src/lib/libc лежит, в CygWin - /usr/src/cygwin-1.5.25-7/newlib/libc... Короче
Код
find /usr/src -name qsort.c
, ну или что_нибудь_ещё.c и будет Вам счастье...
1
alex_x_x
бжни
2454 / 1659 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
10.10.2011, 19:01 #25
в андроиде (бионике) такая реализация
bionic/libc/stdlib/qsort.c
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
void
qsort(void *aa, size_t n, size_t es, int (*cmp)(const void *, const void *))
{
        char *pa, *pb, *pc, *pd, *pl, *pm, *pn;
        int d, r, swaptype, swap_cnt;
        char *a = aa;
 
loop:   SWAPINIT(a, es);
        swap_cnt = 0;
        if (n < 7) {
                for (pm = (char *)a + es; pm < (char *) a + n * es; pm += es)
                        for (pl = pm; pl > (char *) a && cmp(pl - es, pl) > 0;
                             pl -= es)
                                swap(pl, pl - es);
                return;
        }
        pm = (char *)a + (n / 2) * es;
        if (n > 7) {
                pl = (char *)a;
                pn = (char *)a + (n - 1) * es;
                if (n > 40) {
                        d = (n / 8) * es;
                        pl = med3(pl, pl + d, pl + 2 * d, cmp);
                        pm = med3(pm - d, pm, pm + d, cmp);
                        pn = med3(pn - 2 * d, pn - d, pn, cmp);
                }
                pm = med3(pl, pm, pn, cmp);
        }
        swap(a, pm);
        pa = pb = (char *)a + es;
 
        pc = pd = (char *)a + (n - 1) * es;
        for (;;) {
                while (pb <= pc && (r = cmp(pb, a)) <= 0) {
                        if (r == 0) {
                                swap_cnt = 1;
                                swap(pa, pb);
                                pa += es;
                        }
                        pb += es;
                }
                while (pb <= pc && (r = cmp(pc, a)) >= 0) {
                        if (r == 0) {
                                swap_cnt = 1;
                                swap(pc, pd);
                                pd -= es;
                        }
                        pc -= es;
                }
                if (pb > pc)
                        break;
                swap(pb, pc);
                swap_cnt = 1;
                pb += es;
                pc -= es;
        }
        if (swap_cnt == 0) {  /* Switch to insertion sort */
                for (pm = (char *) a + es; pm < (char *) a + n * es; pm += es)
                        for (pl = pm; pl > (char *) a && cmp(pl - es, pl) > 0;
                             pl -= es)
                                swap(pl, pl - es);
                return;
        }
 
        pn = (char *)a + n * es;
        r = min(pa - (char *)a, pb - pa);
        vecswap(a, pb - r, r);
        r = min(pd - pc, pn - pd - (int)es);
        vecswap(pb, pn - r, r);
        if ((r = pb - pa) > (int)es)
                qsort(a, r / es, es, cmp);
        if ((r = pd - pc) > (int)es) {
                /* Iterate rather than recurse to save stack space */
                a = pn - r;
                n = r / es;
                goto loop;
        }
        /* qsort(pn - r, r / es, es, cmp); */
}
1
greeezz
274 / 167 / 4
Регистрация: 10.07.2011
Сообщений: 441
14.10.2011, 17:53 #26
alkagolik, Читаю книгу братьев Дейтел. Как раз сегодня наткнулся на то что вам может быть интересным с точки зрения написания вашего хедера и передачи разных типов данных.

A pointer can be assigned to another pointer if both pointers are of the same type. Otherwise, a cast operator must be used to convert the value of the pointer on the right of the assignment to the pointer type on the left of the assignment. The exception to this rule is the pointer to void (i.e., void *), which is a generic pointer capable of representing any pointer type. All pointer types can be assigned to a pointer of type void * without casting. However, a pointer of type void * cannot be assigned directly to a pointer of another typethe pointer of type void * must first be cast to the proper pointer type.
A void * pointer cannot be dereferenced. For example, the compiler "knows" that a pointer to int refers to four bytes of memory on a machine with four-byte integers, but a pointer to void simply contains a memory address for an unknown data typethe precise number of bytes to which the pointer refers and the type of the data are not known by the compiler. The compiler must know the data type to determine the number of bytes to be dereferenced for a particular pointerfor a pointer to void, this number of bytes cannot be determined from the type.
1
silent_1991
14.10.2011, 22:27
  #27

Не по теме:

Цитата Сообщение от greeezz Посмотреть сообщение
братьев Дейтел
Они отец и сын

0
greeezz
274 / 167 / 4
Регистрация: 10.07.2011
Сообщений: 441
14.10.2011, 23:21 #28
Цитата Сообщение от silent_1991 Посмотреть сообщение

Не по теме:


Они отец и сын

Не по теме:

Вот так промашка вышла!

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.10.2011, 23:21
Привет! Вот еще темы с ответами:

Конфликт конструкторов. - C++
Здравствуйте! struct DateTime : tm { DateTime(int year_ = 1970, int month_ = 1, int day_ = 1,...

конфликт имен - C++
пытаюсь вызвать CButton* button= (CButton*)GetDlgItem(IDC_BUTTON); // пишет что определено в WinUser.h пишет error C2660:...

Конфликт пространств имён - C++
Есть у меня два разных класса, имеющими одно название. И есть другие две библиотеки, использующие эти классы (каждая свой). Я...

Конфликт имен в библиотеках - C++
Здравствуйте. Возникла проблема при одновременном подключении #include &lt;X11/extensions/xf86vmode.h&gt; и #include &quot;FreeImage.h&quot; Код...


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

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Опции темы

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