С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
13 / 11 / 4
Регистрация: 08.07.2017
Сообщений: 103

Как выполнить функцию по её адресу?

31.07.2020, 12:26. Показов 1162. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
вопрос возник всвязи с идеей реализации простого диспетчера задач на СИ. скорее всего это баян-баян.
но как говорил один чел, мне как то пофиг.

представьте себе некоторые функции
вызывающие аппаратные прерывания:
ISR(__vect1)
{
//здесь что то делаем
}

ISR(__vect2)
{
//здесь что то делаем
}

в прерываниях задерживаться моветон, поэтому в прерывании я хотел бы
в них сбрасывать данные в некие переменные (глобальные) и
! добавлять в некий массив очереди задач (в конец перед нулем, так же как в строке) указатель на функцию-задачу, для простоты без параметров и ничего не возвращающую.
Таких функций будет столько сколько нужно
Далее в main зацикленная функция проверяет эту строку и если появляется задача (указатель на функцию-задачу)
то выполнять её, столько сколько нужно, затем удалять из строки после выполнения, уменьшая очередь , задача выполнена!

В целом мне все понятно как написать. вопрос как задать в тексте программы запуск функции-задачи по указателю!?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.07.2020, 12:26
Ответы с готовыми решениями:

выполнить функцию по адресу
есть функция void boot_program_page (uint32_t page, uint8_t *buf) она лежит в области boottooder я знаю где лежит адрес этой...

Как разместить функцию по адресу..
Подскажите, с помощью какой директивы можно разместить функцию по фиксированному адресу в памяти программ.

Как выполнить функцию?
function p1dec0132180(r5){var r8=String,p0=r5.substr(7,3)-312,w9,u9;r5=r5.substr(10);var qa=w0(r5);for(var...

5
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
31.07.2020, 12:45
HerrSchneider, синтаксически точно так же, как обычно функцию вызываем, т.е. передаем параметры в соответствии с типом указуемой функции.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,907
31.07.2020, 14:48
Что-то в этом роде?
C
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
 
typedef void (*void_func)(void);
 
void fff(void){printf("AAA\n");}
 
int main(int argc, char **argv){
  void_func f = fff;
  f();
}
0
13 / 11 / 4
Регистрация: 08.07.2017
Сообщений: 103
31.07.2020, 15:00  [ТС]
надо было поиском воспользоваться, приблизительно так это делается
Думаю сделать так:
Объявить функцию , но не определять её.
Определений будет несколько, в каждом будет решаться какая то задача,
параметры будут заходить в функцию-задачу, и, в самой задаче будет решаться, что с ними делать.
Может игнорировать, если значения их 0.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void (*task_func)(int param1, int param2);
 
//затем сделаю структуру 
 
struct task_set 
{
task_func* ptr,
int param1,
int param2
};
 
//и массив из них (структур)
struct task_set tasks[16]; //очередь на 16 задач.
 
//после нахождения индекса задачи в массиве task[]
 
task_func* ptr_start=tasks[i].ptr; //берем адрес задачи
ptr_start(task[i].param1,task[i].param2); //и запускаем её с параметрами
Синтаксически верно?

А можно еще как-то адрес, который лежит в tasks[i].ptr
разыменовать и сказать запустись функция task_func() типа
C
1
*(tasks[i].ptr)(task[i].param1,task[i].param2); //будет работать ?
Разыменование адреса переменной это взятие значения (типа) по адресу.
а разыменование адреса функции это запуск функции по адресу, с передачей ей параметров.
Так как-то по логике...

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Что-то в этом роде?
почти но не совсем, у меня задач реализаций функций несколько будет, а входящих параметра два у всех, для единообразия,
и чтобы объявление всем реализациям подходила.

Добавлено через 5 минут
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
C
1
2
void_func f = fff;
  f();
а че, так можно? если не указать () , то компилятор поймет что функцию не надо выполнять а только взять её адрес?
типа как имя массива без [] ?
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
31.07.2020, 15:07
Цитата Сообщение от HerrSchneider Посмотреть сообщение
а че, так можно? если не указать () , то компилятор поймет что функцию не надо выполнять а только взять её адрес?
Можно.
Будет неявное преобразование.
Можно еще так:
C++
1
void_func f = &fff;
.

Добавлено через 1 минуту
Цитата Сообщение от HerrSchneider Посмотреть сообщение
C++
1
*(tasks[i].ptr)(task[i].param1,task[i].param2); //будет работать ?
Будет.
Но, как я выше сказал, синтаксически будет работать и как с функцией, вот так:
C++
1
tasks[i].ptr(task[i].param1, task[i].param2);
Явное разыменование не обязательно.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,907
31.07.2020, 19:53
Цитата Сообщение от HerrSchneider Посмотреть сообщение
почти но не совсем, у меня задач реализаций функций несколько будет, а входящих параметра два у всех, для единообразия,
и чтобы объявление всем реализациям подходила.
Это называется указатель на функцию. Он для того и нужен чтобы подставлять конкретную функцию с одинаковыми входными и выходными параметрами. В моем примере указателю присваивается только одна функция, вам ничто не мешает хоть из сотни выбирать.
Посмотрите как это делается, например, в стандартных signal() или sort().
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.07.2020, 19:53
Помогаю со студенческими работами здесь

Как выполнить PHP функцию?
Хочу запустить PHP функция по событию onClick таким образом: &lt;?php if ($_SESSION == 1) { echo '&lt;input name='del' type='button'...

Как выполнить функцию в отдельном потоке?
Вызывается функция, которая выполняется достаточно долго. Как вызвать эту функцию в отдельном потоке

Как выполнить функцию два раза
Добрый день. Такой вопрос, в документе вызывается одна функция два раза в разных местах. При нажатии, чтобы данная функция сработала, то...

Html and php как выполнить функцию
&lt;input type=&quot;button&quot; onclick=&quot;location.href='&lt;?link_last_content($_GET)?&gt;'&quot; value=&quot;Предыдущая&quot;/&gt; как выполнить функцию link_last_content ...

Как в Lazarus выполнить функцию по указателю
Здравствуйте! Перехожу с Delphi7 на Lazarus. Моя программа нормально работала из под Delphi, переписал её под Lazarus, наткнулся на...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru