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

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> Два входа в одну функцию на C, возможно ли такое?
XVR
сообщение Dec 3 2010, 07:03
Сообщение #31


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(MALLOY2 @ Dec 2 2010, 14:43) *
Код
void Combo(void)
{
   Control();
   Indication();
}


Без комментариев.
The Best smile.gif
Еще один коментарий - если компилятор достаточно умный, то он из функции Combo сделает именно то, что было нужно ТС. Ну, может быть, с оверхедом на один jmp
(И даже для не статических функций Control и Indication)

PS. Пишите на FORTRAN'е - там это можно средствами языка biggrin.gif
Go to the top of the page
 
+Quote Post
Tanya
сообщение Dec 3 2010, 07:26
Сообщение #32


Гуру
******

Группа: Модераторы
Сообщений: 8 752
Регистрация: 6-01-06
Пользователь №: 12 883



Цитата(XVR @ Dec 3 2010, 10:03) *
PS. Пишите на FORTRAN'е - там это можно средствами языка biggrin.gif

Или на Форте. Только там такая задача почти лишена смысла... Вот один раз только понадобилось для использования части (хвоста) ядреного слова.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Dec 3 2010, 08:29
Сообщение #33


;
******

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



Цитата(ViKo @ Dec 2 2010, 21:17) *
Прокомментирую сам. Квалификатор static будет иметь смысл, если я эти функции заброшу в отдельный файл. Таких функций у меня несколько десятков, что ж, мне, столько файлов создавать? Не вижу смысла.

Пардон, не было времени на развернутый ответ.
Код
void Combo(void);
void Control(void);
void Indication(void);
//...............................................
static void Control_prim(void);
static void Indication_prim(void);

Имеем заготовки для того чтобы контрол и индикация вызывались как извне так и максимально оптимизированно
Код
void Combo(void)
{
Control_prim();
Indication_prim();
}

void Control(void)
{
Control_prim();
}

void Indication(void);
{
Indication_prim();
}


Теперь великий смысел оберток, надеюсь понятен. smile.gif
Go to the top of the page
 
+Quote Post
ViKo
сообщение Dec 3 2010, 09:32
Сообщение #34


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

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



Цитата(_Pasha @ Dec 3 2010, 10:29) *
Теперь великий смысел оберток, надеюсь понятен. smile.gif

Увы... crying.gif Не могли бы вы словами описать, за счет чего будет оптимизация. Пока что вижу разрастание кода...
Как будет у меня:
Код
int main(void) { ... Control(); Indication(); ... Indication(); }
void Control(void) { ... }
void Indication(void) { ... }

Другой вариант:
Код
int main(void) {... Control(); ... Indication(); }
void Control(void) { ... Indication(); }
void Indication(void) { ... }
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Dec 3 2010, 09:37
Сообщение #35


;
******

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



Цитата(ViKo @ Dec 3 2010, 12:32) *
Пока что вижу разрастание кода...

За счет разворачивания статических функций. Запретите инлайнизацию.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Dec 3 2010, 09:41
Сообщение #36


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

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



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

Например, так, без точки с запятой после макрофункции, хватит и ПРОПИСНЫХ_БУКВ_СО_СКОБКАМИ()
Код
#define I2C_CLOCK() {NOP(); SCL = 1; NOP(); SCL = 0;}
if (...) I2C_CLOCK() else return;
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 3 2010, 12:53
Сообщение #37


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (ViKo @ Dec 3 2010, 11:41) *
Например, так, без точки с запятой после макрофункции,
Потом почесали за ухом и решили, что в процессе кования программы макрос разросся и лучше сделать из него обычную функцию. И помчались вставлять точку с запятой везде, где было использование этого макроса. И все ради чего? Ради того, чтобы по религиозным соображениям не использовать конструкцию do {} while(0) ? Да пожалуйста.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Dec 3 2010, 13:39
Сообщение #38


;
******

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



Собсна делов-то:
Код
#define Begin___Macro do{
#define End___Macro }while(0);

И даже самый страшный и больной компилер пойдет туда, куда нада. ЗЫ: если дописать break;}while(0); например

По сабжу: вообще-то логика организации программ на сях отличается от асмового. Например, если завести нечто типа машины Даффа и расположить жизненно важные части по раз и навсегда определенному приоритету, типа
Код
void system(char prio)
{
  switch(prio)
{
   case 0: remote_command();
   case 1: indication();
   case 2: control();
   case 3: critical();
}
}

можно вызывать такое отовсюду и отрубать не актуальные функции входным параметром - приоритетом.
Хотя я приверженец protothreads...
Go to the top of the page
 
+Quote Post
ViKo
сообщение Dec 3 2010, 14:58
Сообщение #39


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

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



Цитата(Сергей Борщ @ Dec 3 2010, 14:53) *
Потом почесали за ухом и решили, что в процессе кования программы макрос разросся и лучше сделать из него обычную функцию. И помчались вставлять точку с запятой везде, где было использование этого макроса.

Когда я захочу вместо макроса применить функцию, я даже имени такого не оставлю, а изменю, согласно своим "религиозным" убеждениям. Заменить не трудно, при желании, можно даже автоматом. Я стараюсь не плодить лишних сущностей.

Цитата(_Pasha @ Dec 3 2010, 15:39) *
можно вызывать такое отовсюду и отрубать не актуальные функции входным параметром - приоритетом.

Об этом написал MrYuran в посте №3
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Dec 3 2010, 15:07
Сообщение #40


;
******

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



Цитата(ViKo @ Dec 3 2010, 18:58) *
Об этом написал MrYuran в посте №3

Переключатель - это еще не все. Вопрос, где break ставить, и ставить ли вообще.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Dec 3 2010, 15:20
Сообщение #41


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

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



Цитата(_Pasha @ Dec 3 2010, 17:07) *
Переключатель - это еще не все. Вопрос, где break ставить, и ставить ли вообще.

Да, вы правы. В вашем методе есть смысл (именно так я писал на ассемблере, но без параметра - приоритета). Только все равно перед вызовом такой функции нужно готовить параметр. И внутри его проверять.
Я лучше буду вызывать функции независимо.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Dec 3 2010, 15:47
Сообщение #42


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(ViKo @ Dec 3 2010, 18:20) *
Да, вы правы. В вашем методе есть смысл (именно так я писал на ассемблере, но без параметра - приоритета). Только все равно перед вызовом такой функции нужно готовить параметр. И внутри его проверять.

Если функции инлайновые, а параметр константный, то компилятор сразу подставит по месту, без всяких лишних проверок.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Dec 3 2010, 16:04
Сообщение #43


;
******

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



Цитата(MrYuran @ Dec 3 2010, 18:47) *
то компилятор сразу подставит по месту, без всяких лишних проверок.

нормальный компилятор smile.gif
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Dec 3 2010, 23:11
Сообщение #44


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Цитата
Если функции инлайновые, а параметр константный,
константный, это const? У меня есть некоторые сомнения по поводу const. Тут наверно правильнее сказать как-то так: определен на этапе компиляции. Но смысл Вашего поста понятен...Это я так, придираюсь ))

Хотя, действительно продвинутый компилятор наверное и с const сработается...но это только догадки..


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Dec 4 2010, 06:19
Сообщение #45


;
******

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



Цитата(sigmaN @ Dec 4 2010, 02:11) *
константный, это const? У меня есть некоторые сомнения по поводу const. Тут наверно правильнее сказать как-то так: определен на этапе компиляции. Но смысл Вашего поста понятен...Это я так, придираюсь ))

Код
void dispatch(const char prio)
{
switch(prio)
{
// doobeedoo
}
}

void otherfunc(char param)
{
  dispatch(0); // тут оптимизирует
dispatch(param);// тут нет
char pp=1;
dispatch(pp);// тут опять(снова) да!
}

где-то так.
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 Текстовая версия Сейчас: 18th July 2025 - 20:21
Рейтинг@Mail.ru


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