ViKo 1 2 декабря, 2010 Опубликовано 2 декабря, 2010 · Жалоба На ассемблере у меня были подпрограммы, в которых сначала идет управление, а потом индикация. И можно было при желании вызвать только индикацию, и вернуться обычным возвратом в конце подпрограммы. Можно ли так сделать на C? Иметь в середине функции метку, и вызвать функцию по указателю на эту метку? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Гость MALLOY2 2 декабря, 2010 Опубликовано 2 декабря, 2010 · Жалоба void Indication(void) { ... } void Control(void) { ... } void Combo(void) { Control(); Indication(); } Без комментариев. The Best :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 17 2 декабря, 2010 Опубликовано 2 декабря, 2010 · Жалоба Можно ли так сделать на C? Иметь в середине функции метку, и вызвать функцию по указателю на эту метку? Можно, но не так. Сделать внутри switch(), а переключатель передавать снаружи. Если тупо перейти по метке, то при операции RET произойдёт возврат хз куда, но не туда, куда нужно. И вообще, пролог, эпилог - это всё нельзя пропускать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 2 декабря, 2010 Опубликовано 2 декабря, 2010 · Жалоба The Best :) Это - понятно. Так и делается, естественно. Вопрос, скорее, теоретический. Имеется некоторая избыточность в виде лишнего вызова, если принять во внимание, что Contol без Indication не бывает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Гость MALLOY2 2 декабря, 2010 Опубликовано 2 декабря, 2010 · Жалоба Имеется некоторая избыточность в виде лишнего вызова От лишнего вызова можно избавится поигравшись с компилятором (я не знаю какой он у вас, и какой проц, от этого многое зависит), попробовать функции объявить inlinе и .т.д. Но то что вы хотите сделать это гомнокод еще тот, даже и не думайте о таких подходах. В самом крайнем случае заменить функции дефайнами, и то прравельней будет. #define Indication() \ {\ ...\ }\ #define Control()\ {\ ...\ }\ void Combo(void) //и никакого оверхеда только можно таких багов нахвататься { Control(); Indication(); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 2 декабря, 2010 Опубликовано 2 декабря, 2010 · Жалоба я не знаю какой он у вас, и какой проц И проц крутой - STM32F103, и компилятор крутой - Keil RealView MDK-ARM 4.12 Но то что вы хотите сделать это гомнокод еще тот, даже и не думайте о таких подходах. И делать так не хочу. А подумать не помешает... :) В самом крайнем случае заменить функции дефайнами, и то правильней будет ... и никакого оверхеда только можно таких багов нахвататься Оверхед остается, если принять во внимание, что иногда мне нужно сразу Control-Indication(), а иногда только Indication(). Можно, но не так. Сделать внутри switch(), а переключатель передавать снаружи. Если с переключателем, так это еще более избыточно. Лучше уж 2 независимые функции. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 17 2 декабря, 2010 Опубликовано 2 декабря, 2010 · Жалоба В самом крайнем случае заменить функции дефайнами, и то прравельней будет. Но только не так, как у вас! Что, по-вашему, скажет компилер на конструкцию {}; Обычно макросы объявляют в скобках do{}while(0) А лучше всё-таки макросами не злоупотреблять, во избежание. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vvs157 0 2 декабря, 2010 Опубликовано 2 декабря, 2010 · Жалоба Иметь в середине функции метку, и вызвать функцию по указателю на эту метку?Метка в С имеет область видимость только внутри функции, поэтому переход в общем случае непосредственно по метке извне, вообще говоря, невозможен. В некоторых реализациях С есть нелокальный goto, но реализовано это как первоначальное запоминание контекста вызовом setjmp, с последующим переходом на запомненное состояние вызовом longjmp. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kosyak© 0 2 декабря, 2010 Опубликовано 2 декабря, 2010 · Жалоба 2MrYuran А чем компилятору могут не понравиться скобки? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Гость MALLOY2 2 декабря, 2010 Опубликовано 2 декабря, 2010 · Жалоба Но только не так, как у вас! Что, по-вашему, скажет компилер на конструкцию {}; Про все компиляторы не скажу, но те с которыми я работаю такую конструкцию хавают. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 17 2 декабря, 2010 Опубликовано 2 декабря, 2010 · Жалоба А чем компилятору могут не понравиться скобки? Есть нюансы. Например, в конструкциях с if() Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 2 декабря, 2010 Опубликовано 2 декабря, 2010 · Жалоба Есть вариант без switch void Control_Indication(bool ctrl) { if (ctrl) { ... // Control } ... // Indication } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kosyak© 0 2 декабря, 2010 Опубликовано 2 декабря, 2010 · Жалоба Есть нюансы. Например, в конструкциях с if() При do{}while(0) ньюансы с if пропадают? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 17 2 декабря, 2010 Опубликовано 2 декабря, 2010 · Жалоба При do{}while(0) ньюансы с if пропадают? Обратим внимание, что использована конструкция do {…} while (0). Если бы мы ее не использовали, то постановка else в нашем условии: if (...) I2C_CLOCK(); else return; привела бы к сообщению компилятора об ошибке "inappropriate else". Все дело в том, что мы перед else и после '}' ставим ';', которая воспринимается компилятором как конец оператора if. Поэтому и использованы скобки в виде do {…} while. отсюда Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Гость MALLOY2 2 декабря, 2010 Опубликовано 2 декабря, 2010 · Жалоба Так и есть это и есть всякие баги с макросами :), Лично я исторически так сложилось всегда записываю только так if(...) { //даже если только 1 оператор используется. } else { } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться