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

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

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

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

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

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

Объявить массив из N указателей на функции, возвращающих указатели на функции, возвращающие указатель на char - C (СИ)
Задание: Объявить массив из N указателей на функции, возвращающих указатели на функции, возвращающие указатель на char. Можно...

Массив указателей на функции - C (СИ)
Здравствуйте! Подскажите пожалуйста, где ошибка в программе. Не могу разобраться с массивом указателей на функции. В строчках " ...

Определить массив указателей на функции - C (СИ)
Прощу помощи:) Написать программу, в которой необходимо определить массив указателей на функции. Вводить цифру, определяющую какую...

Создать массив из указателей которые указывают на функции - C (СИ)
Как можно создать массив из указателей которые указывают на функции?

Создать массив указателей на функции к функциям, которые имеют разное число и типы параметров? - C (СИ)
Можно ли создать массив указателей на функции к функциям, которые имеют разное число и типы параметров?

Запись указателей в массив указателей - C (СИ)
Ребята, подскажите, пожалуйста, что не так сделано? Задача: без использования библиотек распарсить строку в массив строк. В tokenList не...

Массив указателей меняет сам массив - C (СИ)
Здравствуйте! есть программа с массивом указателей, этот массив форматируется по алфавиту и выводится в конце программы, а так же в конце...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nimazzzy
Заблокирован
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
Сообщений: 92
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
Заблокирован
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
Заблокирован
11.01.2017, 00:07     Массив указателей на функции #7
Цитата Сообщение от Саша Перков Посмотреть сообщение
Сделал вот так, но выдает ошибку, что "Размер массива должен быть больше нуля". Что написал я не так?
Пиши весь код.
Саша Перков
0 / 0 / 0
Регистрация: 07.08.2014
Сообщений: 72
11.01.2017, 00:11  [ТС]     Массив указателей на функции #8
Цитата Сообщение от nimazzzy Посмотреть сообщение
Пиши весь код.
Там очень много кода. Что может быть не так? Функция у меня без аргументов и не возвращает значений. Кроме функции и вот этих двух строчек в коде больше ничего относящегося к этому нет. Может заголовочный файл поставить какой-нибудь надо?
nimazzzy
Заблокирован
11.01.2017, 00:12     Массив указателей на функции #9
Цитата Сообщение от Саша Перков Посмотреть сообщение
Что может быть не так?
Что ошибка не в том куске, что ты написал. На какую конкретно строку жалуется компилятор?
Саша Перков
0 / 0 / 0
Регистрация: 07.08.2014
Сообщений: 72
11.01.2017, 00:14  [ТС]     Массив указателей на функции #10
Цитата Сообщение от nimazzzy Посмотреть сообщение
Что ошибка не в том куске, что ты написал. На какую конкретно строку жалуется компилятор?
Нолик подчеркивает во второй строчке, которую скинул
nimazzzy
Заблокирован
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
Заблокирован
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
Заблокирован
11.01.2017, 00:40     Массив указателей на функции #15
Цитата Сообщение от Саша Перков Посмотреть сообщение
А без фигурных скобок можешь?
Этот вопрос "можешь" ты языку должен задать, а не мне. Информация у тебя есть - разбирайся.
Саша Перков
0 / 0 / 0
Регистрация: 07.08.2014
Сообщений: 72
11.01.2017, 00:48  [ТС]     Массив указателей на функции #16
Цитата Сообщение от nimazzzy Посмотреть сообщение
Этот вопрос "можешь" ты языку должен задать, а не мне. Информация у тебя есть - разбирайся.
Нет, я спрашиваю тебя, потому что вдруг у тебя получится так сделать, а у меня нет. Значит проблема с моей стороны. Я почему и создал эту тему, потому что не могу сам справиться с ошибками. И даже не знаю от чего они. Может так вообще нельзя делать или я в синтаксисе что-то напутал или может еще чего-нибудь.
Если и у тебя так не выходит, значит так нельзя делать в принципе. Вот чего я и хотел узнать. Спасибо за помощь.
nimazzzy
Заблокирован
11.01.2017, 00:52     Массив указателей на функции #17
Цитата Сообщение от Саша Перков Посмотреть сообщение
Может так вообще нельзя делать
Да.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.01.2017, 02:03     Массив указателей на функции
Еще ссылки по теме:

Использование массива указателей на функции - C (СИ)
Подскажите, пожалуйста, что я делаю не так. Это компилируется, но не выводит функцию func1. void func1(void); void func2(void); ...

Ошибка в инициализации массива указателей на функции - C (СИ)
Как правильно инициализировать массив указателей на функции? Компилятор указывает ошибку в этой строчке после знака равно void...

Функция, формирующая массив указателей - C (СИ)
Написать функцию, формирующую для вещественного массива A размера N массив указателей на элементы массива A в следующем порядке: первый...

Вернуть указатель на массив указателей - C (СИ)
Мне надо вернуть указатель на массив указателей, как это сделать? void **matrix(FILE *f) // Копируем матрицу из файла { char x; ...

Массив указателей на элементы структуры - C (СИ)
Здравствуйте. Сабж таков: есть структура struct Struct1, в ней есть элемент, допустим указатель на строковой литерал, обзовём его char...


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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 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     Массив указателей на функции
Ответ Создать тему
Опции темы

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