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

 
 
> странное поведение else if
Метценгерштейн
сообщение Jan 3 2015, 19:00
Сообщение #1


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

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



или торможу после праздников ))

не выполняется первое условие if

Код
        if (signal(Str_1))
    {
          return key_mass[0][0];
    }
        else if (signal(Str_2))
    {
          return key_mass[0][1];
    }

работаю с матричной клавиатурой.
в такой записи в упор не печатает цифру 1- это как раз строка 1- первое условие.

зато так:
Код
       if (signal(Str_0))
    {
          on (LED_Red);
    }
        else if (signal(Str_1))
    {
          return key_mass[0][0];
    }
        else if (signal(Str_2))
    {
          return key_mass[0][1];
    }

печатает и 1 и 4.
тут мы ему подсунули как if нечто ненужное.

Т.е. почему код начинает работать только со второй строки else if?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 4)
des333
сообщение Jan 3 2015, 19:21
Сообщение #2


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

Группа: Свой
Сообщений: 1 129
Регистрация: 19-07-08
Из: Санкт-Петербург
Пользователь №: 39 079



Side-эффект от вызова signal(Str_0)?


--------------------
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Jan 3 2015, 19:28
Сообщение #3


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

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



это макрос Аскольда- всегда так пины проверялись. Так что не должно быть.
Да и не объясняет, почему только первую if не выполняет.

PS комп перегрузил, различные оптимизации кода и без них- эффект тот же.

Разгадка в том, что надо было выставить небольшую задержку перед первым if. Вероятно, фронт не успевал упасть в ноль, а только ко второй проверке сигнал формировался.
Go to the top of the page
 
+Quote Post
psL
сообщение Jan 3 2015, 20:41
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 5-08-05
Пользователь №: 7 390



можно попробовать что-то типа:

Код
{
    int res=0;

    if (signal(Str_1))
    {
          res=key_mass[0][0];
    }
        else if (signal(Str_2))
    {
          res=key_mass[0][1];
    }

    return res;
}

или даже volatile res
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 3 2015, 21:50
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 08:16
Рейтинг@Mail.ru


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