реклама на сайте
подробности

 
 
> Массив меток на C, возможно ли сделать?
ViKo
сообщение Jun 3 2012, 16:31
Сообщение #1


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Можно сделать массив указателей на низкоуровневые функции. А в функции верхнего уровня по индексу вызывать один уз указателей. Но отъедаются ресурсы на вызов низкоуровневой функции и возврат из нее. Как бы сделать это в виде массива из меток на низкоуровневые части, которыми набита одна функция верхнего уровня?
Можно, конечно, в виде switch - case... Наверное, зря я голову ломаю.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
alexeyv
сообщение Jun 4 2012, 03:50
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940



1. Определитесь с терминологией: массив указателей на метки или массив указателей на функции ?!
2. В случае массива с указателями на функции:
CODE

// количество обработчиков
#define N_FUNC 16
// тип функции-обработчика
typedef void(TypFunc)(void);
// прототипы обработчиков для массива
TypFunc f1;
TypFunc f2;
...
TypFunc f16;
// сам массив указателей
TypFunc * mas_func[N_FUNC] = {f1,f2,.....,f16};

unsigned int nfunc; // индекс функции-обработчика
void main (void)
{
...
// необходимым вам образом вычисляете nfunc
...
if(nfunc < N_FUNC)
mas_func[nfunc](); // вызов необходимого обработчика
...
}

TypFunc f1
{...}
...
TypFunc f16
{...}


Код ДОЛЖЕН работать на любом Си, в том числе и стандартном, т.к. здесь нет никагого противоречия со стандартом.
Проверял на нескольких разных компиляторах/платформах

3. Реализацию с метками описал maksimp. Хотя с
Цитата
На стандартном Си нельзя.

я все же не совсем согласен

4. На чем и как написаны эти низкоуровневые обработчики? На асме или на Си?
Если на Си или асме в виде отдельных функций, то "goto" использовать нельзя, т.к. будет использоваться пролог одной функции, а эпилог другой, и они скорее всего будут не симетричные.
Если обработчики - это куски кода, то проще использовать "switch-case". Некоторые компиляторы сами оптимизируют такой программый код под вызод функций (при этом создается секция .switch, хранящая переходы оператора).


Сообщение отредактировал alexeyv - Jun 4 2012, 04:06
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jun 4 2012, 04:43
Сообщение #3


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(alexeyv @ Jun 4 2012, 06:50) *
1. Определитесь с терминологией: массив указателей на метки или массив указателей на функции ?!

Именно так вопрос и ставил: "Массив указателей на метки" или "Массив указателей на функции".
Массив указателей на функции, кстати, можно сделать не глобальным, а внутри функции верхнего уровня.

Цитата(MrYuran @ Jun 4 2012, 07:19) *
Проблема только в том, что при реализации на си быстродействия не добавит.
А и действительно, чем switch не устраивает?

Устроил бы и switch. Но выбор сделал в пользу массива указателей на функции. Классическое решение.

Вопрос приобрел чисто теоретический смысл. sm.gif
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd June 2025 - 09:49
Рейтинг@Mail.ru


Страница сгенерированна за 0.01394 секунд с 7
ELECTRONIX ©2004-2016