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

Указатели на функции + typedef - C++

Восстановить пароль Регистрация
 
CROSP
3 / 3 / 0
Регистрация: 13.06.2012
Сообщений: 114
24.05.2013, 19:15     Указатели на функции + typedef #1
Здравствуйте , я вот встретил такую конструкцию typedef int(*compare_func_t)(const void*val1, const void*val2);
Не понял что она означает , погуглив , я нашел что это указатель на функцию . Насколько я понял это означает что с помощью typedef мы создаем новый тип указатель на функцию. Эта функция возвращает значения типа инт , получает два параметра типа воид. Ну зачем это делать. И как это используется ?
Вот например, что я понял
C++
1
typedef intl(*myfunc)(int i,int j);
Можно сделать так
допустим есть функция
C++
1
2
3
4
5
6
7
8
9
int sum (int a,int b ) {
result a+b;
}
 
myfunc q;
q=∑
 
 
s=q(4,3); //7
Вопрос я правильно написал ?
Зачем это все нужно ? Как это еще используется ? Какие операции с памятью происходят при этом и так далее ?
Спасибо заранее за ответ .
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.05.2013, 19:15     Указатели на функции + typedef
Посмотрите здесь:

C++ Указатели и функции...
C++ Шаблонные функции и указатели на функции
C++ Указатели на функции
C++ Указатели и функции
C++ функции, указатели
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
24.05.2013, 19:25     Указатели на функции + typedef #2
Цитата Сообщение от CROSP Посмотреть сообщение
Насколько я понял это означает что с помощью typedef мы создаем новый тип указатель на функцию.
Это не новый тип, лишь псевдоним.
Цитата Сообщение от CROSP Посмотреть сообщение
Зачем это все нужно ?
Для удобства. Без typedef вот это
C++
1
myfunc q = ∑
придётся записать так
C++
1
int (*q)(int, int) = ∑
Цитата Сообщение от CROSP Посмотреть сообщение
Какие операции с памятью происходят при этом
Ни каких операций с памятью не происходит.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
24.05.2013, 19:28     Указатели на функции + typedef #3
Цитата Сообщение от CROSP Посмотреть сообщение
получает два параметра типа воид.
const void *

Цитата Сообщение от CROSP Посмотреть сообщение
Ну зачем это делать.
Конкретно typedef?
Чтобы не писать полностью все объявление.

Цитата Сообщение от CROSP Посмотреть сообщение
И как это используется ?
Цитата Сообщение от CROSP Посмотреть сообщение
Зачем это все нужно ? Как это еще используется ?
Например, можно передать указатель на одну функцию как параметр другой функции и вызвать функцию по указателю.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
24.05.2013, 19:31     Указатели на функции + typedef #4
Цитата Сообщение от gray_fox Посмотреть сообщение
Ни каких операций с памятью не происходит.
При typedef.
CROSP
3 / 3 / 0
Регистрация: 13.06.2012
Сообщений: 114
24.05.2013, 20:40  [ТС]     Указатели на функции + typedef #5
Спасибо за ответы, но ничего так и на понял . Можете привести пожалуйста примеры чтобы понятно было.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
24.05.2013, 20:58     Указатели на функции + typedef #6
Цитата Сообщение от CROSP Посмотреть сообщение
Можете привести пожалуйста примеры
Цитата Сообщение от Croessmah Посмотреть сообщение
Например, можно передать указатель на одну функцию как параметр другой функции и вызвать функцию по указателю.
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
#include <iostream>
#include <iomanip>
 
 
int plus5(int arg) {
   return arg + 5;
}
 
int multiply3(int arg) {
   return 3 *arg;
}
 
typedef int (*function_t)(int);
 
void for_each(int * begin, int * end, function_t func) {
   for ( ; begin != end; ++begin) {
      *begin = func(*begin);
   }
}
 
 
int main() {
   std::size_t const size = 5;
   int array[] = {1, 2, 3, 4, 5};
 
   std::cout << "add 5 to each element:     ";
   for_each(array, array + size, plus5);
   for (std::size_t i = 0; i != size; ++i) {
      std::cout << std::setw(4) << array[i];
   }
   std::cout << std::endl;
 
   std::cout << "multiply each element by 3: ";
   for_each(array, array + size, multiply3);
   for (std::size_t i = 0; i != size; ++i) {
      std::cout << std::setw(4) << array[i];
   }
   std::cout << std::endl;
}
http://ideone.com/NYkeVf
CROSP
3 / 3 / 0
Регистрация: 13.06.2012
Сообщений: 114
24.05.2013, 21:44  [ТС]     Указатели на функции + typedef #7
Спасибо большое , я кажется все понял !!!!
Вот еще вопрос по памяти . Смотрите вот пример


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
int cmp_student_by_name(const void *val1, const void *val2){
  if (val1==NULL || val2==NULL){
        return -1;
    }
 
    /* Приведение типов указателей const void
     * к типу student.
     */
    student *s1 = (student*)val1;
    student *s2 = (student*)val2;
 
    // Вызов strcmp() для сравнения строк
    return strcmp(s1->name, s2->name);
}
 
есть функция поиска в в списке .
 
void *list_find(list_head *list, const void *val){
    if (list==NULL || val==NULL || list->func_cmp==NULL){
        return NULL;
    }
 
    list_node *current = list->head;
 
    /* Проход по списку с вызовом функции сравнения func_cmp */
    while (current!=NULL){
        int res = list->func_cmp(val, current->data);
        
        if (res==0){ // Элементы списка равны
            return current->data;
        }
        current = current->next;
    }
    return NULL;
}
 
 
вот вызываем допустим ее 
в меине .
 
 if (strcmp(cmd, "find")==0){
            printf("\nEnter student name:");
            scanf("%s", x.name);
 
            student *s;
 
            // Установка функции сравнения элементов
            // списка cmp_student_by_name()
            // Вызов функции поиска.
            list.func_cmp = &cmp_student_by_name;
            s = (student*)list_find(&list, &x);
 
            if (s!=NULL){
                printf("\nFound: ");
                printf("%s\t", s->name);
                printf("%d\t", s->order);
                printf("%f\n", s->average_point);
            } else {
                printf("Student does not found\n\n");
            }
        }
Функция сравнения объявлена перед меином .
То есть выходит при запуске программы данная функция уже находится в памяти ??
Так как мы берем ее адрес . А затем вызываем саму функцию поиска , но в ней есть проверка на нул , то есть все таки данная функция уже весит в памяти(cmp_student_by_name) ? Так же ?
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
24.05.2013, 22:13     Указатели на функции + typedef #8
Цитата Сообщение от CROSP Посмотреть сообщение
То есть выходит при запуске программы данная функция уже находится в памяти ??
Да, это просто исполняемый код.
Цитата Сообщение от CROSP Посмотреть сообщение
. А затем вызываем саму функцию поиска , но в ней есть проверка на нул
Указатель на функцию, как и любой другой указатель, может никуда не указывать.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.05.2013, 23:06     Указатели на функции + typedef
Еще ссылки по теме:

C++ Распечатать таблицы значений функций cox (x) и на отрезке [a; b] с шагом h, развив функции в ряд Тейлора и используя указатели на функции
C++ Указатели Функции
Указатели на функции C++

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

Или воспользуйтесь поиском по форуму:
CROSP
3 / 3 / 0
Регистрация: 13.06.2012
Сообщений: 114
24.05.2013, 23:06  [ТС]     Указатели на функции + typedef #9
Все спасибо большое , я понял. Просто Вы говорили что никаких действий с памятью не происходит.
Спасибо большое еще раз.
Yandex
Объявления
24.05.2013, 23:06     Указатели на функции + typedef
Ответ Создать тему
Опции темы

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