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

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> Как перейти к началу функции по внешнему прерыванию?, подробнее внутри
rezident
сообщение Aug 15 2008, 19:42
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(zltigo @ Aug 15 2008, 23:49) *
грамотнее.....

О вкусах не спорят wink.gif
Код
for (i=0;i<360;i++)             for( int i=360; i; i-- )

Можно и так (так действительно короче проверка условия), но только если переменная i как-либо по другому не используется внутри цикла. Например, в качестве индекса.
Код
  if (flag!=0)                     if( flag )

Я предпочитаю явное сравнение с нулем, так нагляднее и понятнее.
Код
goto STOP;                break;

break прерывает выполнение цикла for, а не всей функции. Я применил goto потому, что нужно быстро выйти из функции, а не просто прервать цикл. Неизвестно нет ли еще какого-либо кода после цикла for.
Код
while (1==1)              for(;; )

Опять же о вкусах.. Я часто вообще while(1) пишу smile.gif
Код
goto RESTART;           continue;

Меня терзают смутные сомнения. А как это continue в функции main продолжит выполнение цикла for в другой функции? cranky.gif К тому же согласно последнему условию
Цитата
хотелось бы прервать функцию вообще и запустить ее заново уже в главном цикле.

вопрошающего нужно перезапустить всю функцию loop, а не только лишь продолжить цикл for внутри ее.

Цитата(Зверюга @ Aug 15 2008, 23:37) *
Это точно для CodeVision?
Это plain C за исключением #pragma vector и __interrupt. Насчет CodeVision не знаю, я им не пользуюсь laughing.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 15 2008, 20:53
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(rezident @ Aug 15 2008, 21:42) *
....но только если переменная i как-либо по другому не используется внутри цикла. Например, в качестве индекса.

Все мною написанное относится к совершенно конкретному коду.
Цитата
Опять же о вкусах.. Я часто вообще while(1) пишу smile.gif

Грубо, нормальный компилятор должен выдать предупреждение о том, что условие выполняется всегда.
Кроме того, это опять таки сравнение, которое, конечно, приличными оптимизаторами выбрасывается. А вот for( ; ; ) это как раз и есть четкое указанию компилятору циклится безусловно.
Цитата
Я предпочитаю явное сравнение с нулем, так нагляднее и понятнее.

Масло маслянное... Только лишний напряг для глаз и мозга, ну и оптимизатор,конечно заоптимизитует, но зачем? Кроме того магический "0" - тогда уже хоть FALSE/TRUE, если к этому делу наглядность приплетать.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
rezident
сообщение Aug 15 2008, 21:18
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(zltigo @ Aug 16 2008, 02:53) *
Масло маслянное... Только лишний напряг для глаз и мозга, ну и оптимизатор,конечно заоптимизитует, но зачем? Кроме того магический "0" - тогда уже хоть FALSE/TRUE, если к этому делу наглядность приплетать.
Отнюдь! Я не потомственный программист и программированию специально не учился, видимо поэтому для меня как раз "напряг для глаз и мозга" вычислять условие истинности, дополняя его мысленно !=0. smile.gif Компилятор конечно заоптимизирует и будет использовать какие-нибудь комплиментарные условию jnz/jz (ну или аналогичные команды) в этом случае.
false/true это только для семафора катит, а в общем случае явное сравнение с нулем всегда (особенно когда битовые маски в условиях вычисляются) и на всех компиляторах единообразно и правильно работает. К тому же в ANSI C нет булевых типов. Давайте в очередной раз не будем спорить о вкусах, вы меня в правильности моего вкуса все равно не переубедите biggrin.gif
Вы лучше по поводу continue из main-а поясните. Как оно работает и работает ли вообще такой возврат в цикл другой функции?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 15 2008, 22:05
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(rezident @ Aug 15 2008, 23:18) *
..меня в правильности моего вкуса все равно не переубедите biggrin.gif

Я не о Вашем переубеждении пекусь smile.gif, а о нераспространении дальше smile.gif
Цитата
Вы лучше по поводу continue из main-а поясните. Как оно работает и работает ли вообще такой возврат в цикл другой функции?

В приведенном куске continue предлагается использовать, как и положено, во while, причем тут main???


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Aesthete Animus
сообщение Aug 15 2008, 23:12
Сообщение #20


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 9-06-07
Пользователь №: 28 317



Цитата(rezident @ Aug 16 2008, 01:18) *
К тому же в ANSI C нет булевых типов.

Вообще-то в C99 есть булевы типы...

2zltigo
"Я не о Вашем переубеждении пекусь , а о нераспространении дальше"
Что у Вас за мания критиковать чужой код и проповедовать свой стиль ропграммирования? Чем к примеру Вам так не нравится проверка с нулем?
Go to the top of the page
 
+Quote Post
rezident
сообщение Aug 15 2008, 23:34
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Aesthete Animus @ Aug 16 2008, 05:12) *
Вообще-то в C99 есть булевы типы...
Угу. В стандарте ISO/IEC 9899:1999 aka C99 есть, а в более раннем стандарте C89 aka Standard C aka ANSI C не было.


Цитата(zltigo @ Aug 16 2008, 04:05) *
Я не о Вашем переубеждении пекусь smile.gif, а о нераспространении дальше smile.gif
ОК. Пекитесь дальше раз вам так хочется wink.gif
Цитата(zltigo @ Aug 16 2008, 04:05) *
В приведенном куске continue предлагается использовать, как и положено, во while, причем тут main???
Притом, что вы предложили использовать continue и break вместо двух goto в моем примере. Но break при этом попадал в одну функцию (loop), а continue в другую (main). Поэтому и возник вопрос: а как это работает? Вы бы скопипастили мой вариант примера и исправили его по своему разумению, чтобы стало понятно, что именно вы хотели там "нераспространить"?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 16 2008, 08:58
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(rezident @ Aug 16 2008, 01:34) *
ОК. Пекитесь дальше раз вам так хочется wink.gif

Спасибо заразрешение smile.gif
Цитата
Но break при этом попадал в одну функцию (loop), а continue в другую (main).

Э... Похоже Вам надо ознакомится с continue...
Цитата
Вы бы скопипастили мой вариант примера и исправили его по своему разумению, чтобы стало понятно, что именно вы хотели там "нераспространить"?

Как-бы я все строчки указал... Ладно, не претендуя на изменение общего подхода к делу....
Код
volatile bint flag;

void loop( void )
{     for( int i=360; i; i-- )
      {     if( flag )
              break;
// Ну вообще-то тут return( TRUE ) должен быть, а не break, дабы не
// заниматься лишними контролями в main() и не размазывать работу с flag по нескольким функциям
//        .......
//        ........
//        .......               
      }
}

void main( void )
{
    for(;; )
    {   loop();
          if( flag )
          {    flag--;
            afterINT();
            continue;
          }
//         .....
//        .....
//        .....
       }
}

#pragma vector=INT0_VECTOR
__interrupt void INT0_ISR(void)
{     ++flag;
//     ......
//    ......
//    ......
}


Теперь без break и дублироания проверки flag
Код
bint loop( void )
{     for( int i=360; i; i-- )
      {     if( flag )
        {    flag--;    
              return( TRUE );
        }
//        .......
//        ........
//        .......               
      }
    return( FALSE );
}


void main( void )
{
    for(;; )
    {   if( loop() )
          {      afterINT();
            continue;
          }
//         .....
//        .....
//        .....
       }
}


Цитата(rezident @ Aug 16 2008, 01:34) *
aka ANSI C не было.

Что совершенно не мешает использовать TRUE/FALSE для четкого указания читающему, что эта переменная принимает только два значения.

Цитата(Aesthete Animus @ Aug 16 2008, 01:12) *
Что у Вас за мания критиковать чужой код и проповедовать свой стиль ропграммирования?

Не мания. Когда есть время я стараюсь указывать на явную корявость использования языка. Особенно в ветках для начинающих. При этом я совершенно не проповедую некий "свой" стиль - просто совершенно обычное, я бы сказал - каноническое использование возможностей языка, дабы это не было похоже на "ропграммирование" sad.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
rezident
сообщение Aug 16 2008, 12:17
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(zltigo @ Aug 16 2008, 14:58) *
Э... Похоже Вам надо ознакомится с continue...
Вот я и хотел ваших пояснений по использованию этого оператора в данном случае. Я не понимаю как continue в одной функции (main) может вернутся к прерванному циклу в другой функции (loop)? Вот и компилятор мой (IAR) тоже не понимает, выполняя по continue возврат к началу for (;;) в main, а вовсе не к прерванному for в loop. Может поясните без обиняков. Я ведь не хочу вас уличить в каком-либо незнании, чтобы унизить, а понять суть явления и свои собственные заблужения. Ну не понимаю я как может осуществиться связь между этими операторами в разных функциях. laughing.gif Как я понимаю, область видимости у break ограничена лишь текущим контейнером, а у continue область видимости всего лишь одним уровнем контейнера выше, но в любом случае не дальше текущей функции. А вы считаете по-другому? cranky.gif
Кстати, во втором вашем примере вы изменили тип функции loop только для того, чтобы воспользоваться return для быстрого выхода из нее. В моем же примере использование goto вызывает тот же самый эффект, но без необходимости менять тип функции. Опять же повторюсь, что я не являюсь апологетом применения goto где-ни попадя. Мне вообще до сих пор не приходилось применять goto. Но в данном случае именно goto позволяет решить проблему без существенных коррекций исходных функций.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 16 2008, 12:35
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(rezident @ Aug 16 2008, 14:17) *
Я не понимаю как continue в одной функции (main) может вернутся к прерванному циклу в другой функции (loop)?

Так для начала прочитайте СВОЙ исходник и поведуйте миру, как Вам удалось узреть вышеизложенное в нем. Только, пожалуйста, читайте внимательно:
Код
  while (1==1)
    {
      .....
RESTART:
      loop();
      if (flag!=0)
      { flag=0;
        afterINT();
        goto RESTART;
      }
      .....
   }

Где, Вы узрели "возврат к ... прерванному for в loop. " A?????
Написанное мной (в первом, буквально повторяющем варианте) полностью повторяет вышенаписанное, без абсолютно ненужного в этом случае goto и меток.
Код
    for(;; )
    {   loop();
          if( flag )
          {    flag--;
            afterINT();
            continue;
          }
         .....
        .....
       }


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 16 2008, 12:36
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(rezident @ Aug 16 2008, 16:17) *
Я не понимаю как continue в одной функции (main) может вернутся к прерванному циклу в другой функции (loop)?


Так задача-то была прервать и перезапустить loop, насколько я могу понять:
Цитата
Как сделать чтобы по внешнему прерыванию от пина AVR функция loop завершала свою работу? выполнялась функция afterINT(), после чего вновь запускалась функция loop().
Go to the top of the page
 
+Quote Post
rezident
сообщение Aug 16 2008, 12:40
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(aaarrr @ Aug 16 2008, 18:36) *
Так задача-то была прервать и перезапустить loop, насколько я могу понять:
Добавьте внутри "вечного цикла" перед вызовом loop() несколько операторов и/или вызовов других функций и попробуйте перезапустить с помощью continue только loop(). Для пояснения цитирую кусок исходного текста автора.
Код
void main ()
{
  while (1==1)
    {
      ......
       loop();
      .....
   }
}
Многоточие, как я понимаю, обозначает один или несколько операторов до и после вызова loop().
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 16 2008, 12:52
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(rezident @ Aug 16 2008, 14:40) *
Добавьте.....

Для начала ответьте, что за пургу тут несли с goto в черт-те-знает-куда sad.gif
потом ответьте на вопрос чем код:
Код
while (1==1)
    {
      blabla1();
       loop();
      blabla2();
   }

принципиально отличается от:
Код
for(;; )
    {
       loop();
      blabla2();
      blabla1();
   }

После первого прохода. Если захотите ИЗМЕНИТЬ условия задачи, то тогда как минимум стоит их публично огласить а не тихонько высасывать из пальца дополнительные условия. Повторяю, я НЕ собираюсь возражать против способа решения задачи (мне сама постановка представляется совершенно уродливой) все мной написаное относится только к корявому коду.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
rezident
сообщение Aug 16 2008, 13:23
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(zltigo @ Aug 16 2008, 18:52) *
Для начала ответьте, что за пургу тут несли с goto в черт-те-знает-куда sad.gif
Не уходите от ответа. Я первый задал вопрос.
Цитата(zltigo @ Aug 16 2008, 18:52) *
потом ответьте на вопрос чем код:
Поскольку нам неизвестно какие операции выполняют функции blabla и не влияют ли они на какие-либо общие глобальные переменные, то отвечаю - да, в общем случае порядок вызова функций имеет значение.
Цитата(zltigo @ Aug 16 2008, 18:52) *
Если захотите ИЗМЕНИТЬ условия задачи, то тогда как минимум стоит их публично огласить а не тихонько высасывать из пальца дополнительные условия.
Вы это .... не гоните...лошадей. wink.gif Я не менял условий задачи и в сообщении #13 привел пример, модифицировав исходный текст вопрошающего, под его условия. Вы же, вырвав из контекста задачи, привели исправления отдельных операторов, при подстановке которых в мой исходник работа программы меняется. Если внимательно приглядитесь, то у меня (в сообщении #13) как и у вопрошающего, имеются многоточия, обозначающие какие-либо операции до и после вызова loop в "вечном цикле" main. Тупая подстановка ваших замен изменяет функционирование программы. Поэтому я и пытаюсь от вас добиться пояснений, почему вы считаете эти замены полностью эквивалентными для функционирования программы? А вы же почему-то упираетесь в стилистику написания. laughing.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 16 2008, 13:43
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(rezident @ Aug 16 2008, 17:23) *
Поскольку нам неизвестно какие операции выполняют функции blabla и не влияют ли они на какие-либо общие глобальные переменные, то отвечаю - да, в общем случае порядок вызова функций имеет значение.

ИМХО, здесь Вы не правы: во-первых, порядок вызова функций не изменился, изменилась лишь точка входа; во-вторых, в кооперативной системе с вечным циклом в main'е порядок вызова не имеет не должен иметь принципиального значения.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 16 2008, 13:52
Сообщение #30


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(rezident @ Aug 16 2008, 15:23) *
А вы же почему-то упираетесь в стилистику написания. laughing.gif

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

Уже писал. Повторяю. За единственным, как смею предположить скорее всего совершенно не существенным исключением ввиде первого прохода СУПЕР цикла (который становится совершенно недетерминированным после прерывания) - да. Кроме того эта "проблема" решается, например, правильной начальной инициализацией глобальной переменной счетчика таймаута.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

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

 


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


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