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

 
 
> Два входа в одну функцию на C, возможно ли такое?
ViKo
сообщение Dec 2 2010, 11:28
Сообщение #1


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

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



На ассемблере у меня были подпрограммы, в которых сначала идет управление, а потом индикация. И можно было при желании вызвать только индикацию, и вернуться обычным возвратом в конце подпрограммы. Можно ли так сделать на C? Иметь в середине функции метку, и вызвать функцию по указателю на эту метку?
Go to the top of the page
 
+Quote Post
4 страниц V  < 1 2 3 4 >  
Start new topic
Ответов (15 - 29)
kosyak©
сообщение Dec 2 2010, 13:39
Сообщение #16


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 1-10-07
Из: НЧ
Пользователь №: 30 966



Занятная статья.
do{}while(0) я видел в чужих исходниках пару раз - и никак не мог понять зачем? Спасибо, разъяснили..

Сам я тоже сторонник везде ставить фигурные скобки..потому ниразу на подобную ошибку и не натыкался.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Dec 2 2010, 14:05
Сообщение #17


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

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



Цитата(kosyak© @ Dec 2 2010, 15:39) *
Сам я тоже сторонник везде ставить фигурные скобки..потому ниразу на подобную ошибку и не натыкался.

А я, наоборот, сторонник минимализма. Не хочу писать ничего лишнего. Так мне красивее кажется.
А за ссылку на статью - спасибо, MrYuran!
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Dec 2 2010, 14:12
Сообщение #18


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Ну можно еще более универсальную штуку сочинить, типа:

Код
typedef void (*pVoidFun)(void);          

void Control_Indication(pVoidFun p)
{
   if(p)
      p();
  
   Indication();
}


Тогда можно вызывать Control_Indication(NULL) - будет вызываться только Indication(), а при вызове типа Control_Indication(Control) сначала вызовется функция, адрес которой вы передали вызывающей функции, затем Indication().
Go to the top of the page
 
+Quote Post
ViKo
сообщение Dec 2 2010, 14:18
Сообщение #19


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

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



Цитата(sergeeff @ Dec 2 2010, 16:12) *
...а при вызове типа Control_Indication(Control) сначала вызовется функция, адрес которой вы передали вызывающей функции...

Только Control() при этом должна быть отдельной функцией, иначе указатель на нее не создать. sad.gif
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Dec 2 2010, 15:21
Сообщение #20


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Вы боретесь за экономию одной команды вызова и одной команды возврата?
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Dec 2 2010, 15:46
Сообщение #21


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(MALLOY2 @ Dec 2 2010, 14:43) *
Без комментариев.
The Best smile.gif

Почему же без комментариев? их есть!
ТХЕ БЕСТ оно будет когда все указанные функции объявим static.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Dec 2 2010, 15:46
Сообщение #22


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(MALLOY2 @ Dec 2 2010, 14:43) *
Без комментариев.
The Best smile.gif

Почему же без комментариев? их есть!
ТХЕ БЕСТ оно будет когда все указанные функции объявим static.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Dec 2 2010, 15:50
Сообщение #23


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

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



Цитата(sergeeff @ Dec 2 2010, 17:21) *
Вы боретесь за экономию одной команды вызова и одной команды возврата?

Я не борюсь, а интересуюсь. Мне уже очевидно, что сделать нельзя.

Цитата(_Pasha @ Dec 2 2010, 17:46) *
ТХЕ БЕСТ оно будет когда все указанные функции объявим static.

А вот здесь желательны комментарии. smile.gif
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Dec 2 2010, 16:16
Сообщение #24


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(_Pasha @ Dec 2 2010, 19:46) *
Почему же без комментариев? их есть!
ТХЕ БЕСТ оно будет когда все указанные функции объявим static.


Если их все объявить как static, то они на фиг никому будут не нужны, так как доступа к ним не будет. Можно (и идеологически правильно) Control() и Indication() объявить как static, чтобы к ним никто не совался кроме как через посредство Control_Indication().
Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 2 2010, 16:59
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (kosyak© @ Dec 2 2010, 16:39) *
Занятная статья.
do{}while(0) я видел в чужих исходниках пару раз - и никак не мог понять зачем? Спасибо, разъяснили..

Трюк, конечно, хороший, только надо тоже с аккуратностью применять, ибо:
1) Хороший компилятор выдаст предупреждение о том, что условие никогда НЕ выполняется, хотя все сделает правильно,
но лишние вопли придется давить локальными прагамами - некузяво sad.gif.
2) Поганый компилятор (например, вот прямо сейчас работаю с рекордно поганым ImageCraft для M8C ) - такое НЕ соптимизирует -
вообще гнусно.



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
kosyak©
сообщение Dec 2 2010, 18:09
Сообщение #26


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 1-10-07
Из: НЧ
Пользователь №: 30 966



2zltigo:
Хм...логично. Тогда напрашивается вопрос - и как жить? crying.gif
Не использовать препроцессор прошу не предлагать smile.gif
Go to the top of the page
 
+Quote Post
ViKo
сообщение Dec 2 2010, 18:17
Сообщение #27


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

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



Цитата(_Pasha @ Dec 2 2010, 17:46) *
ТХЕ БЕСТ оно будет когда все указанные функции объявим static.

Прокомментирую сам. Квалификатор static будет иметь смысл, если я эти функции заброшу в отдельный файл. Таких функций у меня несколько десятков, что ж, мне, столько файлов создавать? Не вижу смысла.
P.S. Где-то здесь и зарыта собака "неполной структурированности" языка C.
P.P.S. По поводу do {...} while (0) - а чем плохо показанное в той же статье строчкой выше {...} ? Разве кто-то заставляет писать I2C_CLOCK(); с точкой с запятой в конце?
Или в дефайне можно было задать
#define I2C_CLOCK(); {NOP(); SCL = 1; NOP(); SCL = 0;}
Да, это не работает (кажется, в Hi-Tech PICC у меня получалось такое, а в Keil - нет)
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Dec 2 2010, 19:07
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(ViKo @ Dec 2 2010, 21:17) *
Или в дефайне можно было задать
#define I2C_CLOCK(); {NOP(); SCL = 1; NOP(); SCL = 0;}

Дык боролись за точку с запятой перед else - Где она?


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 2 2010, 22:44
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (kosyak© @ Dec 2 2010, 21:09) *
Хм...логично. Тогда напрашивается вопрос - и как жить? crying.gif

Думать по обстоятельствам.
QUOTE
Не использовать препроцессор прошу не предлагать smile.gif

Почему? В числе решений по обстоятельствам, если компилятор не совсем дебильный, как вышеупомяутый, использовать принудительный inline.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
kosyak©
сообщение Dec 3 2010, 05:51
Сообщение #30


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 1-10-07
Из: НЧ
Пользователь №: 30 966



Понятн...
Вот интересно - доживу я до момента когда в стандарт "С201x" включат шаблоны (template) на манер С++? И самое главное доживу ли я до появления компилятора, который будет это все поддерживать smile.gif
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 08:34
Рейтинг@Mail.ru


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