Перейти к содержанию
    

Два входа в одну функцию на C

void Combo(void)
{
   Control();
   Indication();
}

 

Без комментариев.

The Best :)

Еще один коментарий - если компилятор достаточно умный, то он из функции Combo сделает именно то, что было нужно ТС. Ну, может быть, с оверхедом на один jmp

(И даже для не статических функций Control и Indication)

 

PS. Пишите на FORTRAN'е - там это можно средствами языка :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

PS. Пишите на FORTRAN'е - там это можно средствами языка :biggrin:

Или на Форте. Только там такая задача почти лишена смысла... Вот один раз только понадобилось для использования части (хвоста) ядреного слова.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прокомментирую сам. Квалификатор 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();
}

 

Теперь великий смысел оберток, надеюсь понятен. :)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Теперь великий смысел оберток, надеюсь понятен. :)

Увы... :crying: Не могли бы вы словами описать, за счет чего будет оптимизация. Пока что вижу разрастание кода...

Как будет у меня:

int main(void) { ... Control(); Indication(); ... Indication(); }
void Control(void) { ... }
void Indication(void) { ... }

Другой вариант:

int main(void) {... Control(); ... Indication(); }
void Control(void) { ... Indication(); }
void Indication(void) { ... }

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пока что вижу разрастание кода...

За счет разворачивания статических функций. Запретите инлайнизацию.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хм...логично. Тогда напрашивается вопрос - и как жить? :crying:

Например, так, без точки с запятой после макрофункции, хватит и ПРОПИСНЫХ_БУКВ_СО_СКОБКАМИ()

#define I2C_CLOCK() {NOP(); SCL = 1; NOP(); SCL = 0;}
if (...) I2C_CLOCK() else return;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Собсна делов-то:

#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...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Потом почесали за ухом и решили, что в процессе кования программы макрос разросся и лучше сделать из него обычную функцию. И помчались вставлять точку с запятой везде, где было использование этого макроса.

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

 

можно вызывать такое отовсюду и отрубать не актуальные функции входным параметром - приоритетом.

Об этом написал MrYuran в посте №3

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Об этом написал MrYuran в посте №3

Переключатель - это еще не все. Вопрос, где break ставить, и ставить ли вообще.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Переключатель - это еще не все. Вопрос, где break ставить, и ставить ли вообще.

Да, вы правы. В вашем методе есть смысл (именно так я писал на ассемблере, но без параметра - приоритета). Только все равно перед вызовом такой функции нужно готовить параметр. И внутри его проверять.

Я лучше буду вызывать функции независимо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, вы правы. В вашем методе есть смысл (именно так я писал на ассемблере, но без параметра - приоритета). Только все равно перед вызовом такой функции нужно готовить параметр. И внутри его проверять.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

нормальный компилятор :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

где-то так.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...