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

 
 
4 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Два входа в одну функцию на 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
MALLOY2
сообщение Dec 2 2010, 11:43
Сообщение #2


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Код
void Indication(void)
{
   ...
}

void Control(void)
{
  ...
}

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


Без комментариев.
The Best smile.gif
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Dec 2 2010, 11:47
Сообщение #3


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

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



Цитата(ViKo @ Dec 2 2010, 14:28) *
Можно ли так сделать на C? Иметь в середине функции метку, и вызвать функцию по указателю на эту метку?

Можно, но не так.
Сделать внутри switch(), а переключатель передавать снаружи.
Если тупо перейти по метке, то при операции RET произойдёт возврат хз куда, но не туда, куда нужно.
И вообще, пролог, эпилог - это всё нельзя пропускать.


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


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

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



Цитата(MALLOY2 @ Dec 2 2010, 13:43) *
The Best smile.gif

Это - понятно. Так и делается, естественно. Вопрос, скорее, теоретический.
Имеется некоторая избыточность в виде лишнего вызова, если принять во внимание, что Contol без Indication не бывает.
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Dec 2 2010, 11:57
Сообщение #5


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Цитата
Имеется некоторая избыточность в виде лишнего вызова


От лишнего вызова можно избавится поигравшись с компилятором (я не знаю какой он у вас, и какой проц, от этого многое зависит), попробовать функции объявить inlinе и .т.д. Но то что вы хотите сделать это гомнокод еще тот, даже и не думайте о таких подходах.

В самом крайнем случае заменить функции дефайнами, и то прравельней будет.

Код
#define   Indication() \
{\
   ...\
}\

#define  Control()\
{\
  ...\
}\

void Combo(void) //и никакого оверхеда только можно таких багов нахвататься
{
   Control();
   Indication();
}

Go to the top of the page
 
+Quote Post
ViKo
сообщение Dec 2 2010, 12:15
Сообщение #6


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

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



Цитата(MALLOY2 @ Dec 2 2010, 13:57) *
я не знаю какой он у вас, и какой проц

И проц крутой - STM32F103, и компилятор крутой - Keil RealView MDK-ARM 4.12
Цитата
Но то что вы хотите сделать это гомнокод еще тот, даже и не думайте о таких подходах.

И делать так не хочу. А подумать не помешает... smile.gif
Цитата
В самом крайнем случае заменить функции дефайнами, и то правильней будет ... и никакого оверхеда только можно таких багов нахвататься

Оверхед остается, если принять во внимание, что иногда мне нужно сразу Control-Indication(), а иногда только Indication().

Цитата(MrYuran @ Dec 2 2010, 13:47) *
Можно, но не так.
Сделать внутри switch(), а переключатель передавать снаружи.

Если с переключателем, так это еще более избыточно. Лучше уж 2 независимые функции.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Dec 2 2010, 12:15
Сообщение #7


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

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



Цитата(MALLOY2 @ Dec 2 2010, 14:57) *
В самом крайнем случае заменить функции дефайнами, и то прравельней будет.

Но только не так, как у вас!
Что, по-вашему, скажет компилер на конструкцию {};

Обычно макросы объявляют в скобках do{}while(0)

А лучше всё-таки макросами не злоупотреблять, во избежание.


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


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

Группа: Свой
Сообщений: 1 526
Регистрация: 8-04-05
Пользователь №: 3 960



Цитата(ViKo @ Dec 2 2010, 14:28) *
Иметь в середине функции метку, и вызвать функцию по указателю на эту метку?
Метка в С имеет область видимость только внутри функции, поэтому переход в общем случае непосредственно по метке извне, вообще говоря, невозможен. В некоторых реализациях С есть нелокальный goto, но реализовано это как первоначальное запоминание контекста вызовом setjmp, с последующим переходом на запомненное состояние вызовом longjmp.
Go to the top of the page
 
+Quote Post
kosyak©
сообщение Dec 2 2010, 12:34
Сообщение #9


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

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



2MrYuran
А чем компилятору могут не понравиться скобки?
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Dec 2 2010, 12:38
Сообщение #10


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Цитата
Но только не так, как у вас!
Что, по-вашему, скажет компилер на конструкцию {};


Про все компиляторы не скажу, но те с которыми я работаю такую конструкцию хавают.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Dec 2 2010, 12:55
Сообщение #11


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

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



Цитата(kosyak© @ Dec 2 2010, 15:34) *
А чем компилятору могут не понравиться скобки?

Есть нюансы.
Например, в конструкциях с if()


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


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

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



Есть вариант без switch
Код
void Control_Indication(bool ctrl)
{
if (ctrl) {
... // Control
  }
... // Indication
}
Go to the top of the page
 
+Quote Post
kosyak©
сообщение Dec 2 2010, 13:16
Сообщение #13


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

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



Цитата(MrYuran @ Dec 2 2010, 15:55) *
Есть нюансы.
Например, в конструкциях с if()

При do{}while(0) ньюансы с if пропадают?
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Dec 2 2010, 13:27
Сообщение #14


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

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



Цитата(kosyak© @ Dec 2 2010, 16:16) *
При do{}while(0) ньюансы с if пропадают?

Цитата
Обратим внимание, что использована конструкция do {…} while (0). Если бы мы ее не использовали, то постановка else в нашем условии:

if (...) I2C_CLOCK(); else return;

привела бы к сообщению компилятора об ошибке "inappropriate else". Все дело в том, что мы перед else и после '}' ставим ';', которая воспринимается компилятором как конец оператора if. Поэтому и использованы скобки в виде do {…} while.

отсюда


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


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Так и есть это и есть всякие баги с макросами smile.gif,

Лично я исторически так сложилось всегда записываю только так

Код
if(...)
{
  //даже если только 1 оператор используется.
}
else
{

}
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 17:41
Рейтинг@Mail.ru


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