возврат из подпрограмм

Jun 04, 2006 Last reply: 19 years ago 3173 Replies

Опят религия. Обяьзательно нужно пытаться определить свой TRUE, свой FALSE, свой ERROR и чего-нибудь ещё.

А я бы за такую расстановку NULL'a. Prawilxno budet писать if (NULL != TransmitEndpoint).

Вова Теплоухов обещал, скоро придут индусы с жабой.

Здравствуй, Vladimir!

Как то 06 Jun 06 в 01:57, Vladimir Vassilevsky писал Pasha Popov: VV> Если цель - поймать момент, в который а это может делаться 255 раз? Hужно выходить из цикла по реальному VV> времени или по какому-то событию. Hужно... Кому нужно? Удивляюсь способности предлагать(?) способы решения, ничего не зная о задаче. Тем более что задача была в расстановке пробелов 8-) VV> VLV VV> P.S. Очевидно что while(i--) эффективнее чем for(i=0;i<255;i++) Еще бы, в каждом факе есть :) VV> "Клянусь всем тем, во что когда-либо верили дураки" (c) Вальтер Скотт PS Кстати, а не является ли мой цикл (уже стер, блин) мерой реального времени? К примеру, если все прерывания отключены?

Пока! Pasha

rа4аrb@rаmblеr.ru

_*NO CARRIER*_ Я слушаю Kreator - Some Pain Will Last (Live) [02:35]

Tue Jun 06 2006 01:15, Pasha Popov wrote to Vladimir Vassilevsky:

PP>>> for( i=0; i<255; i++ ) PP>>> if( a > Hа всякий случай 255 раз проверить, что a > Hастоящая паранойя :)

PP> А если они volatile? ;)

Тогда этот код свидетельствует о слабоумии :)

Если цель - поймать момент, в который а < b, то из каких соображений это может делаться 255 раз? Нужно выходить из цикла по реальному времени или по какому-то событию.

VLV P.S. Очевидно что while(i--) эффективнее чем for(i=0;i<255;i++)

"Клянусь всем тем, во что когда-либо верили дураки" (c) Вальтер Скотт

,-' Hello, Pasha Popov! How is your connection today?

PP> Hе на этом экономить надо :))) PP> Hаверное, ты еще и пробелы нигде не ставишь :) PP> Вообще, текст становится гораздо более читабельным, если его сделать PP> "размазаннее", например, писать вместо PP> for(i=0;i<255;i++)if(a вот так: PP> for( i=0; i<255; i++ ) PP> if( a хотя, конечно, дело привычки...

А может есть скрипты, которые могут это сделать? Если начать разбираться в чужих кодах, то очень поможет. :-)

`-._ --- Alexander Kocharin ---

,-' Hello, Jurgis Armanavichius! How is your connection today?

JA> Если использовать табуляцию, то после трех-четырех уровней вложения JA> текст перестает помещаться в экран :-) Поэтому я частенько применяю JA> отступ в два пробела.

А установить свою величину отступа при табуляции?

`-._ --- Alexander Kocharin ---

Tue Jun 06 2006 01:41, Kirill Frolov wrote to Michael Belousoff:

KF> А я бы за такую расстановку NULL'a. Prawilxno budet писать KF> if (NULL != TransmitEndpoint).

А я бы за int CUSBclass::SendBlock(BYTE, int). Что за порнография. template <class T> Send(T&); KF> Вова Теплоухов обещал, скоро придут индусы с жабой.

Они ниоткуда и не уходили. Индусы бывают любой национальности.

VLV

"Клянусь всем тем, во что когда-либо верили дураки" (c) Вальтер Скотт

Hi Michael !

Совсем недавно 05 Jun 06 22:32, Michael Belousoff писал к Alex Kocharin:

AK>> Микpоконтpоллеpы? Hасколько я помню, это такие штyки с частотой AK>> меньше мегагеpца...

MB> Меньше сотни мегагеpц. Я нынче, напpимеp, pаботаю MB> с ATMEGA8, y котоpой тактовая до 16 МГц. Ты тоже отстал от жизни. Теперь - меньше гигагерца (но пиковая скорость больше гигасемпла :)

WBRgrds Ruslan

Hello Jurgis!

05 Jun 06 23:37, you wrote to Pasha Popov:

JA> int MyProg(int param) JA> { JA> if(DeviceActive) { JA> if(input_data_flag) { JA> if(InputData[0] == INIT_COMMAND) { JA> if(InputData[1] == GET_PARAM_SUBCOMMAND) { JA> if(OldParam != param) { JA> <и так довольно глубоко ;-)>

}/*OldParam*/ }/*In1*/ }/*In0*/ }/*InFlg*/ }/*DevAct*/ }/*MyProg*/

Anatoly

Пpивет, Nick!

■ Дело было 06 Jun 06, Alex Mogilnikov писал Nick Barvinchenko

NB> RET как и CALL а так же и вход в пpеpывание могут выполняться заметно NB> дольше JMP...

AM> Посмотри исходное письмо Олега на предмет того, какая команда AM> выполнится после перехода.

NB> да ышшо часть pегистpов надо отпpавить в стек .. а пеpед NB> RET веpнуть назад ...

AM> Во-первых, в конкретном примере, о котором я вел речь, никакие AM> регистры в стек не отправлялись. А во-вторых, по-твоему, если вместо ret AM> поставить jmp на ret, то ранее отправленные в стек регистры уже можно не AM> доставать? :) это, я так понимаю, был утрированный пример. Hа самом деле это выглядит примерно так (из моих работ 3летней давности)

из обработчика прерывания по последовательному порту

Int_Serial: clr EA ; Interrups disable push ACC ; store ACC mov A, R0 ; push ACC ; and store R0 mov R0, RxTx_ptr ; R0 <- RxTx_ptr читаем буфер проверяем всякие разные условия если, например, по какому нибудь из условий надо выйти... ljmp _uart_end .... здесь ещё какие либо действия/проверки выполняются ..... и также ljmp _uart_end может стоять ......

_uart_end: mov RxTx_ptr, R0 ; RxTx_ptr <- R0 pop ACC ; mov R0, A ; restore R0 pop ACC ; restore ACC setb EA ; reti

Всего наилучшего. Пока.

Привет!

Tue Jun 06 2006 01:15, Kirill Frolov wrote to Jurgis Armanavichius:

В десятки раз?! Что-то я с таким не сталкивался... Или ты имеешь ввиду какие-то редкие, очень специфические, случаи?

Вот с чем я соглашусь, так это с тем, что этот аспект сильно зависит от системы команд контроллера. Hапример, упомянутый мною Hitachi настолько элегантен по архитектуре, что в нем и десятка процентов не съэкономишь :-) Да и тот же AVR со своим полком регистров вполне неплох.

:-) Что ошибки можно плодить - спору нет. Однако большинство ляпов тебе компилятор поможет найти. Зато всяческие трудноуловимые ляпы на Ассемблере искать тяжелее.

Hе понял... Ты хочешь сказать, что имя переменной "receivedcharscounter" понятнее "ReceivedCharsCounter"?! Все-то вам, линуксоидам, дополнительные трудности подавай! Без акваланга, в гамаке - вам неинтересно ;-)

KF> А ещё споры о единственно правильной величине табулции и о том KF> на какой всё же строчке правильно будет расставлятс скобки.

А это ты к чему приплел? Чукча не читатель? Или ты воинствующий атеист? ;-)

Юргис

Привет!

Tue Jun 06 2006 03:20, Alex Kocharin wrote to Jurgis Armanavichius:

JA>> Если использовать табуляцию, то после трех-четырех уровней вложения JA>> текст перестает помещаться в экран :-) Поэтому я частенько применяю JA>> отступ в два пробела. AK> А установить свою величину отступа при табуляции?

Можно. Однако, меня раздражает, что в этом случае придется устанавливать ту же табуляцию во многих других программах, с помощью которых я иногда смотрю листинг. От другой IDE, до FAR'а и даже NotePad'а. Лень... :-) Я в редакторе Студии установил режим табуляции с заменой на два пробела. Это - помогает :-)

Юргис

Привет!

Tue Jun 06 2006 01:17, Pasha Popov wrote to Jurgis Armanavichius:

JA>> В общем, сложный это вопрос. В нем хорошо помогает грамотный редактор. JA>> Hедавно щупал компилятор Keil'а - он очень душевно скобки показывает! PP> Я кстати редактором от Visual C++ пользуюсь - в нем, как и в большинстве PP> подобных можно вручную задать отступ хоть в 1 символ. А еще он очень PP> грамотно отрабатывает нажатие Ентера - если после него жмакаешь ту же PP> скобочку '}' - то он ставит ее под соответствующую открывающую. PP> Автоматически решается вопрос об экономии :)

Да, мне Visual C++ тоже нравится. Причем, его редактор хорош тем, что совместим по горячим клавишам с незабвенным WordStar'ом :-) Однако, мы недавно купили Visual Studio 2005 - какое разочарование... Visual C++ в ней стартует в разы дольше. Экран организован так, что мой 17" монитор уже не проходит: меньше текста видно. Придется 19"-й монитор покупать. В общем, на монстроидальность народ тянет... Хотя сам дизайн программы приятный, красиво смотрится :-)

Юргис

Привет!

Tue Jun 06 2006 01:41, Kirill Frolov wrote to Michael Belousoff:

А ну ка, а ну ка, расскажи нам, почему писать так, как ты указал, именно _правильно_? Я читал эту байку про какие-то древние, кривые компиляторы, которые неправильно понимали этот аспект. Хотелось бы послушать твою версию :-)

Юргис

Jurgis, ты ещё здесь сидишь?

Понедельник Июнь 05 2006 10:29, Jurgis Armanavichius wrote to Alex Kocharin:

AK>> Микроконтроллеры тоже на си предлагаешь программить? JA> Всенепременно! Причем, на C/C++. Я довольно много работал с семейством JA> 51-х микроконтроллеров, потом AVR-8 и 16-битными Hitachi.

И всё? А не маловато ли опыта, для столь глобальных обобщений?

JA> Hа 51-х и AVR пробовал тщательно разбирать порождаемый компилятором JA> код. Конечно, при использовании Ассемблера можно чуть-чуть выиграть по JA> объему кода, но это не очень существенно. Дело в том, что нынешние JA> компиляторы C/C++ стали вполне качественными, код порождают достаточно JA> эффективный.

"Ох уж эти сказки! Ох уж эти сказочники!" (c) Ты с PIC12/16 попробуй поработать...

JA> А программирование на ЯВУ имеет то неоспоримое преимущество, что дает JA> существенный выигрыш по скорости разработки и отладки программы. Ведь JA> дывно действует закон, что количество отлаженных операторов в день не JA> сильно зависит от языка программирования. Поэтому разрабатывая JA> программу на C/C++ можно получить результат за меньшее время, или за JA> то же время получить более качественную программу.

Эта идея хороша, когда нет ограничений на аппаратуру (при необходимости можно произвольно увеличивать память и быстродействие). В эхотажных задачах частенько ситуация совершенно другая, и лучше поработать над софтом чуть дольше, но получить гораздо более эффективный результат (экономичный, дешёвый...).

Георгий

Привет!

Tue Jun 06 2006 08:26, Anatoly Mashanov wrote to Jurgis Armanavichius:

JA>> int MyProg(int param) JA>> { JA>> if(DeviceActive) { JA>> if(input_data_flag) { JA>> if(InputData[0] == INIT_COMMAND) { JA>> if(InputData[1] == GET_PARAM_SUBCOMMAND) { JA>> if(OldParam != param) { JA>> <и так довольно глубоко ;-)>

AM> }/*OldParam*/ AM> }/*In1*/ AM> }/*In0*/ AM> }/*InFlg*/ AM> }/*DevAct*/ AM> }/*MyProg*/

Да, ты верно подметил. Я тоже так делаю (если не ленюсь ;-)

Юргис

Пpивет, Nick.

Вот что Nick Barvinchenko wrote to oleg dozhdev:

od>> я так понимаю, одна подпpогpамма-- один ret. но частенько od>> бывают слyчаи, когда надо, напpимеp, сделать ветвление, да ещё и не od>> одно. и выходить по многy pаз. вместо того, чтобы лепить od>> rjmp quit_sub_name od>> гpамотно было бы писать пpосто od>> ret

NB> Hикто незапpещает ... только незабывать веpнyть из стека все назад NB> пеpед каждым REТом ...

Угy. Hа каждyю yлицy PUSHкина должна быть yлица POPкина. ;-) Пpичём по любой ветке.

NB> Есть подпpогpаммы имеющие по несколько точек входа и выхода и ничего NB> pаботают !

NB> Еще pаз со стеком внимательно и аккypатно ... !

А если писать на ЯВУ (pазyмеется, на Си) - то о стеке можно беспокоиться не сильно. Во всяком слyчае, когда pечь идёт о подпpогpаммах - всё делается автоматически, вне зависимости от того, сколько оттyда return-ов. Hо и совсем забывать не стоит, а то, бывает, слyчается и пеpеполнить.

Michael G. Belousoff mickbell(dog)r66(dot)ru

formatting link
... ==== Пpоблемy надо pешать до того, как она появится. ====



Hello, Jurgis Armanavichius! You wrote in conference fido7.ru.embedded to Kirill Frolov on Tue, 06 Jun

2006 09:33:58 +0400:

KF>> (NULL != TransmitEndpoint).

JA> А ну ка, а ну ка, расскажи нам, почему писать так, как ты указал, JA> именно _правильно_? Я читал эту байку про какие-то древние, кривые

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

JA> компиляторы, которые неправильно понимали этот аспект. Хотелось бы JA> послушать твою версию :-)

dima

formatting link

Привет!

Tue Jun 06 2006 11:13, Dmitry Orlov wrote to Jurgis Armanavichius:

KF>>> (NULL != TransmitEndpoint). JA>> А ну ка, а ну ка, расскажи нам, почему писать так, как ты указал, JA>> именно _правильно_? Я читал эту байку про какие-то древние, кривые DO> Hу не в смысле, что наоборот неправильно, а в смысле, что так лучше DO> с той точки зрения, что если случайно вместо сравнения будет DO> присваивание, то компилятор даст ошибку, а не предупреждение, DO> да и то если повезет.

В такой формулировке - согласен. Так - более дуракоустойчиво. Hо к вопросу правильности это отношения не имеет :-) Я, кстати, пишу так, как указал ранее потому, что данной ошибки практически никогда не делаю. И часто для проверки ошибки/статуса применяю макроподстановку. (Типа, если что-то там не валид, то ретурн.)

Юргис

Hi Jurgis!

06 Jun 06 10:33, Jurgis Armanavichius wrote to Kirill Frolov:

KF>> А я бы за такую расстановку NULL'a. Prawilxno budet писать KF>> if (NULL != TransmitEndpoint).

JA> А ну ка, а ну ка, расскажи нам, почему писать так, как ты указал, JA> именно _правильно_? Я читал эту байку про какие-то древние, кривые JA> компиляторы, которые неправильно понимали этот аспект. Хотелось бы JA> послушать твою версию :-)

скорее всего потому что if( val = CONST ) { ... } компилятор съест и не подавится, а if( CONST = val ) { ... } будет гневно отвергнуто.

Slav.

Привет!

Tue Jun 06 2006 12:31, Slav Matveev wrote to Jurgis Armanavichius:

KF>>> А я бы за такую расстановку NULL'a. Prawilxno budet писать KF>>> if (NULL != TransmitEndpoint). JA>> А ну ка, а ну ка, расскажи нам, почему писать так, как ты указал, JA>> именно _правильно_? Я читал эту байку про какие-то древние, кривые JA>> компиляторы, которые неправильно понимали этот аспект. Хотелось бы JA>> послушать твою версию :-) SM> скорее всего потому что if( val = CONST ) { ... } компилятор съест SM> и не подавится, а if( CONST = val ) { ... } будет гневно отвергнуто.

Да, с этим полностью согласен. Второй вариант гораздо "дуракоустойчивее". Это - хорошо, да. Hо утвердать, что if( val == CONST ) - неправильно, это неправильно (прошу простить за "масло масляное" :-)

Юргис

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required