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

C для начинающих

Войти
Регистрация
Восстановить пароль
 
Саша Перков
0 / 0 / 0
Регистрация: 07.08.2014
Сообщений: 72
#1

Массив указателей на функции - C (СИ)

10.01.2017, 23:44. Просмотров 154. Ответов 17
Метки нет (Все метки)

Мне необходимо создать массив, состоящий из 10 элементов, который хранил бы указатели на функции. Потом этот массив надо наполнить указателями на сами функции, причем по отдельности каждый (т.е. сначала первый, потом второй). Ну а потом с помощью этого массива вызвать эти функции дальше в программе. Подскажите пожалуйста как должен выглядеть синтаксис всех вышеупомянутых действий.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.01.2017, 23:44     Массив указателей на функции
Посмотрите здесь:

C (СИ) Вызов функции с передачей указателей на два массива
C (СИ) Массив указателей на элементы структуры
C (СИ) Массив указателей поместить в структуру
Создать массив из указателей которые указывают на функции C (СИ)
C (СИ) Вернуть указатель на массив указателей
Определить массив указателей на функции C (СИ)
Создать массив указателей на функции к функциям, которые имеют разное число и типы параметров? C (СИ)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nimazzzy
590 / 519 / 134
Регистрация: 29.03.2016
Сообщений: 1,647
Завершенные тесты: 1
10.01.2017, 23:57     Массив указателей на функции #2
Вот пример массива указателей на функции
C
1
void(*a[10])();
Цитата Сообщение от Саша Перков Посмотреть сообщение
Потом этот массив надо наполнить указателями на сами функции, причем по отдельности каждый (т.е. сначала первый, потом второй)
Ты не знаешь как присвоить значение эелементу массива? Через индекс в квадратных скобках.
Вызвать - обращение к конкретному указателю через индекс в квадратных скобках, потому круглые скобки для вызова.
Саша Перков
0 / 0 / 0
Регистрация: 07.08.2014
Сообщений: 72
11.01.2017, 00:00  [ТС]     Массив указателей на функции #3
Цитата Сообщение от nimazzzy Посмотреть сообщение
Ты не знаешь как присвоить значение эелементу массива? Через индекс в квадратных скобках.
Вызвать - обращение к конкретному указателю через индекс в квадратных скобках, потому круглые скобки для вызова.
Вот создать массив я смог сам, да. А как присвоить ему значение не знаю. Пробовал по всякому. Везде ошибку выдает. Напиши пожалуйста как надо.
pakanpak
47 / 47 / 24
Регистрация: 18.11.2016
Сообщений: 91
11.01.2017, 00:02     Массив указателей на функции #4
Саша Перков, сделал для 2х функций, но принцип думаю понятен
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
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <string.h>
 
void f1(), f2();
 
 
int main()
{
 
setlocale(LC_ALL,"rus");
void (*pn[2])(void); //тут объявляем массив указателей (2 элемента)
pn[0]=&f1;             //указываем на функции
pn[1]=&f2;
 
pn[0]();                 //выполняем с помощью указателей
pn[1]();
return 0;
 
}
 
void f1()
{
    printf("Это функция №1\n");
}
 
void f2()
{
    printf("Это функция №2\n");
}
nimazzzy
590 / 519 / 134
Регистрация: 29.03.2016
Сообщений: 1,647
Завершенные тесты: 1
11.01.2017, 00:02     Массив указателей на функции #5
C
1
2
3
4
5
6
void func()
{
    puts("func\n");
}
...
a[3] = func;
Саша Перков
0 / 0 / 0
Регистрация: 07.08.2014
Сообщений: 72
11.01.2017, 00:05  [ТС]     Массив указателей на функции #6
Цитата Сообщение от pakanpak Посмотреть сообщение
Саша Перков, сделал для 2х функций, но принцип думаю понятен
Сделал вот так, но выдает ошибку, что "Размер массива должен быть больше нуля". Что написал я не так?
C++
1
2
void(*p_Text[10])();
p_Text[0] = Text_Level1;
nimazzzy
590 / 519 / 134
Регистрация: 29.03.2016
Сообщений: 1,647
Завершенные тесты: 1
11.01.2017, 00:07     Массив указателей на функции #7
Цитата Сообщение от Саша Перков Посмотреть сообщение
Сделал вот так, но выдает ошибку, что "Размер массива должен быть больше нуля". Что написал я не так?
Пиши весь код.
Саша Перков
0 / 0 / 0
Регистрация: 07.08.2014
Сообщений: 72
11.01.2017, 00:11  [ТС]     Массив указателей на функции #8
Цитата Сообщение от nimazzzy Посмотреть сообщение
Пиши весь код.
Там очень много кода. Что может быть не так? Функция у меня без аргументов и не возвращает значений. Кроме функции и вот этих двух строчек в коде больше ничего относящегося к этому нет. Может заголовочный файл поставить какой-нибудь надо?
nimazzzy
590 / 519 / 134
Регистрация: 29.03.2016
Сообщений: 1,647
Завершенные тесты: 1
11.01.2017, 00:12     Массив указателей на функции #9
Цитата Сообщение от Саша Перков Посмотреть сообщение
Что может быть не так?
Что ошибка не в том куске, что ты написал. На какую конкретно строку жалуется компилятор?
Саша Перков
0 / 0 / 0
Регистрация: 07.08.2014
Сообщений: 72
11.01.2017, 00:14  [ТС]     Массив указателей на функции #10
Цитата Сообщение от nimazzzy Посмотреть сообщение
Что ошибка не в том куске, что ты написал. На какую конкретно строку жалуется компилятор?
Нолик подчеркивает во второй строчке, которую скинул
nimazzzy
590 / 519 / 134
Регистрация: 29.03.2016
Сообщений: 1,647
Завершенные тесты: 1
11.01.2017, 00:17     Массив указателей на функции #11
У меня все ок:
C
1
2
3
4
5
6
7
8
9
10
11
void Text_Level1()
{
    puts("func\n");
}
 
int main()
{
    void(*p_Text[10])();
    p_Text[0] = Text_Level1;
    p_Text[0]();
}
Саша Перков
0 / 0 / 0
Регистрация: 07.08.2014
Сообщений: 72
11.01.2017, 00:23  [ТС]     Массив указателей на функции #12
Понял в чем дело. Надо все это делать внутри функции. У меня же это находилось прямо так. Не внутри какой-либо функции. Не знал, что обязательно надо это делать внутри какой-либо функции.
nimazzzy
590 / 519 / 134
Регистрация: 29.03.2016
Сообщений: 1,647
Завершенные тесты: 1
11.01.2017, 00:27     Массив указателей на функции #13
Цитата Сообщение от Саша Перков Посмотреть сообщение
Не знал, что обязательно надо это делать внутри какой-либо функции.
Не обязательно.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void Text_Level1()
{
    puts("func1");
}
 
void Text_Level2()
{
    puts("func2");
}
 
void(*p_Text[2])() = { Text_Level1, Text_Level2 };
 
int main()
{
    p_Text[0]();
    p_Text[1]();
    getchar();
}
Саша Перков
0 / 0 / 0
Регистрация: 07.08.2014
Сообщений: 72
11.01.2017, 00:34  [ТС]     Массив указателей на функции #14
Цитата Сообщение от nimazzzy Посмотреть сообщение
Не обязательно
А без фигурных скобок можешь? Ну, точно также как показывал мне. Фигурными скобками, да, и у меня получается вне функций.
nimazzzy
590 / 519 / 134
Регистрация: 29.03.2016
Сообщений: 1,647
Завершенные тесты: 1
11.01.2017, 00:40     Массив указателей на функции #15
Цитата Сообщение от Саша Перков Посмотреть сообщение
А без фигурных скобок можешь?
Этот вопрос "можешь" ты языку должен задать, а не мне. Информация у тебя есть - разбирайся.
Саша Перков
0 / 0 / 0
Регистрация: 07.08.2014
Сообщений: 72
11.01.2017, 00:48  [ТС]     Массив указателей на функции #16
Цитата Сообщение от nimazzzy Посмотреть сообщение
Этот вопрос "можешь" ты языку должен задать, а не мне. Информация у тебя есть - разбирайся.
Нет, я спрашиваю тебя, потому что вдруг у тебя получится так сделать, а у меня нет. Значит проблема с моей стороны. Я почему и создал эту тему, потому что не могу сам справиться с ошибками. И даже не знаю от чего они. Может так вообще нельзя делать или я в синтаксисе что-то напутал или может еще чего-нибудь.
Если и у тебя так не выходит, значит так нельзя делать в принципе. Вот чего я и хотел узнать. Спасибо за помощь.
nimazzzy
590 / 519 / 134
Регистрация: 29.03.2016
Сообщений: 1,647
Завершенные тесты: 1
11.01.2017, 00:52     Массив указателей на функции #17
Цитата Сообщение от Саша Перков Посмотреть сообщение
Может так вообще нельзя делать
Да.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.01.2017, 02:03     Массив указателей на функции
Еще ссылки по теме:

Функция, формирующая массив указателей C (СИ)
Массив указателей меняет сам массив C (СИ)
C (СИ) Использование массива указателей на функции
C (СИ) Запись указателей в массив указателей
C (СИ) Массив указателей на функции

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт CЭксперт С++
12698 / 7172 / 800
Регистрация: 27.09.2012
Сообщений: 17,683
Записей в блоге: 2
Завершенные тесты: 1
11.01.2017, 02:03     Массив указателей на функции #18
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
//main.c
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
 
#include "fr.h"
 
 
void foo(void)
{
    printf("function: %s\n", "foo");
}
 
 
void bar(void)
{
    printf("function: %s\n", "bar");
}
 
 
void zoo(void)
{
    printf("function: %s\n", "zoo");
}
 
 
 
 
int main(void)
{
    srand(time(0));
    FunctionPtr arr[3] = {foo, bar, zoo};
    while (!reg(arr[rand()%3])) {
    }
    callAll();
}
C
1
2
3
4
5
6
7
8
9
10
11
//fr.h
#ifndef PROJECT_FR_H
#define PROJECT_FR_H
 
typedef void (*FunctionPtr)(void);
 
int reg(FunctionPtr);
void callAll(void);
 
 
#endif //PROJECT_FR_H
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
//fr.c
#include <stdlib.h>
#include "fr.h"
 
#define FUNC_MAX (100u)
 
static unsigned counter;
static FunctionPtr arr[FUNC_MAX] = {0};
 
 
int reg(FunctionPtr func)
{
    if (func == NULL) {
        return -1;
    }
    if (counter == FUNC_MAX) {
        counter = 0;
    }
    arr[counter++] = func;
    return (counter == FUNC_MAX);
}
 
 
void callAll(void)
{
    for(unsigned i = 0; i < counter; ++i) {
        arr[i]();
    }
}
Yandex
Объявления
11.01.2017, 02:03     Массив указателей на функции
Ответ Создать тему
Опции темы

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