Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
vladimersv
Встал на лапы
Сообщения: 82
Зарегистрирован: Пн апр 09, 2012 04:07:37
Откуда: Донецкая. обл.

Re: Вопросы по С/С++ (СИ)

Сообщение vladimersv »

спасибо ,всем кто откликнулся .
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение vitalik_1984 »

unalex писал(а):

Код: Выделить всё

void RUN_HOLD(void)
{
    static unsigned char Last = UP;
    unsigned char State;
    
    State 
= ButtonBits;
    
    switch
(State)
    {
        case(OK):
        State = (Last == DOWN) ? UP : DOWN;
        Last = State;
=========
}
 

как-то перекак-то так

похоже на правду, только как использовать переменную state после нажатия на ок? действия то не происходит.
нигде в первоначальном варианте она не используется по мне так проще в этом случае сделать через if - else
сразу и сравнить и сделать нужное действие(переключить состояние).
____
UPDATED
Во блин, не заметил что break отсутствует :) Тогда покатит, наверное.
vladimersv
Встал на лапы
Сообщения: 82
Зарегистрирован: Пн апр 09, 2012 04:07:37
Откуда: Донецкая. обл.

Re: Вопросы по С/С++ (СИ)

Сообщение vladimersv »

нажаль в первом варианте с 145стр при компелировании много затрагивает других меню и ошибки идут.
а вот во втором варианте ошибку постоянную - 12: error: 'ButtonBits' undeclared (first use in this function)
в строке State = ButtonBits;
я раньше пробывал так прописать
void RUN_HOLD(void)
{
if(ButtonsBits == UP){ pnt_gOSC_MODE->Condition = RUN; btn->Text = "RUN"; }
else if(ButtonsBits == DOWN){ pnt_gOSC_MODE->Condition = HOLD; btn->Text = "HOLD";}
else if(ButtonsBits == OK){ pnt_gOSC_MODE->Condition = HOLD; btn->Text = "HOLD"; }


}
так переключает на "HOLD" но в режим "RUN" приходится кнопкой UP тогда возвращать ,возможно както можно именно для ОК добавить возврат при повторном нажатии в режим "RUN" ?
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение vitalik_1984 »

Может полностью проект выложить, чтобы не гадать на кофейной гуще? На кусок программы можно выложить только аналогичный кусок. Вам его предложили, если не компилируется, значит это ваша задача сделать дальше правильно.
Только не нужно текстом тут вставлять есть вложения, вот во вложении ждем проекта.
vladimersv
Встал на лапы
Сообщения: 82
Зарегистрирован: Пн апр 09, 2012 04:07:37
Откуда: Донецкая. обл.

Re: Вопросы по С/С++ (СИ)

Сообщение vladimersv »

проэкт немой,он открытый .просто пытаюсь немного изменить под своё управление .

файл - gInterface_MENU.с
Вложения
111.rar
(905.36 КБ) 127 скачиваний
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Re: Вопросы по С/С++ (СИ)

Сообщение unalex »

vladimersv писал(а):'ButtonBits' undeclared (first use in this function)


код надо не только копировать, но и анализировать
я в своем коде вместо ButtonsBits написал ButtonBits
здесь важен сам принцип
1 используем дополнительную переменную - флаг на 2 состояния (чтоб она не сбрасывалась, указываем ей свойство static)
2 при проверке кнопок учитываем этот флаг и в зависимости от его состояния решаем что будет делать кнопка
3 при каждом нажатии кнопки OK меняем значение этого флага на противоположное



vitalik_1984 писал(а):Тогда покатит, наверное.

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

вариантов решения этого сомнения 3
1 протестировать(правда есть риск что это противоречит стандартам и возможны разночтения в разных компиляторах)
2 поизучать тонкости работы switch(на мой взгляд самый лучший вариант, но экзамены на носу, времени нет)
3 заменить на старый добрый if(думаю автор вопроса сам с этим справится, идея ведь понятна)
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
vladimersv
Встал на лапы
Сообщения: 82
Зарегистрирован: Пн апр 09, 2012 04:07:37
Откуда: Донецкая. обл.

Re: Вопросы по С/С++ (СИ)

Сообщение vladimersv »

да вобщемто я вообще первый раз открыл проэкт и компелировал его ,цвет кнопок и рабочего фона я и так то понял как сменить,тоесть внешний интерфейс немного переделал под себя.
но я вообще далёк от програмирования ,почему и спрашивал помощи.
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Re: Вопросы по С/С++ (СИ)

Сообщение unalex »

вобщем мой пример кода не сработает, и именно изза отсутствия break, так как независимо от результата обработки кнопки OK
управление передастся следующему case

переделал

Код: Выделить всё

void RUN_HOLD(void)
{
   static unsigned char last = UP;
   unsigned char current;
   current = ButtonsBits;
    if(current == OK) {current = last = (last == UP) ? DOWN : UP;}
   
   switch(current)
   {
      case UP: pnt_gOSC_MODE->Conditon = RUN; btn->Text = "RUN"; break;
      case DOWN: pnt_gOSC_MODE->Condition = HOLD; btn->Text = "HOLD"; break;
   }
}
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
vladimersv
Встал на лапы
Сообщения: 82
Зарегистрирован: Пн апр 09, 2012 04:07:37
Откуда: Донецкая. обл.

Re: Вопросы по С/С++ (СИ)

Сообщение vladimersv »

unalex огромное спасибо.
да так работает и немешает другим функциям меню.

правда незнаю ,просить ли еще о помощи (я нелюбитель халявы ,все что менял сам и с вашей помощью выкладую в ветке по прибору ,кто хотят те пользуются )


возможно добавить в этот кусок возможность кнопками UP-DOWN перелистывать покругу ?(щас переключает в одну сторону и потом назад только .хотя намного удобнее былоб просто по кругу ).

Код: Выделить всё

/*******************************************************************************
* Function Name  : ON_OFF_CHANNEL_A
* Description    : Функция вкл./отк. канала А
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void ON_OFF_CHANNEL_A(void)
{
   /* проверка нажатий кнопок и изменения индекса канала если были нажаты */
   if((ButtonsBits == UP) && (gChannel_A.INDX < 2)) gChannel_A.INDX++;
   else if((ButtonsBits == DOWN) && (gChannel_A.INDX > 0))gChannel_A.INDX--;
   //else return;
   
   if(gChannel_A.INDX == STOP)                 // если индекс равен 0
   {
       gChannel_A.EN = STOP;                   // останавливаем канал
       Clear_OLD_DataCH_ON_SCREEN(CHANNEL_A, leftLimit, rightLimit - 2);  // очищаем этот канал экране
   }
   else if(gChannel_A.INDX > 0)               // иначе запускаем
   {
       gChannel_A.EN = RUN;
   
       /* пишем в регистр ПЛИС открытый или закрытый вход в зависимости от pnt_Channel->INDX */      
       Set_Input(CHANNEL_A, gChannel_A.INDX);
                
   }
   /* обновляем текст на кнопке соответсвующего канала */   
   btn->Text = (char *)&ON_OFF_TEXT[gChannel_A.INDX];
}
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Re: Вопросы по С/С++ (СИ)

Сообщение unalex »

vladimersv писал(а): кнопками UP-DOWN перелистывать покругу ?


надо просто порассуждать немного логически
листаем в одну сторону: если индекс не дошел до конца - прибавляем, иначе в начало
листаем в другую сторону: если индекс не дошел до начала - уменьшаем, иначе в конец

Код: Выделить всё

void ON_OFF_CHANNEL_A(void)
{
   /* проверка нажатий кнопок и изменения индекса канала если были нажаты */
   if((ButtonsBits == UP) (gChannel_A.INDX < 2) ? gChannel_A.INDX++ : gChannel_A.INDX = 0;
   else if((ButtonsBits == DOWN) (gChannel_A.INDX > 0) ? gChannel_A.INDX-- : gChannel_A.INDX = 2;
   
   //else return;
   
   if(gChannel_A.INDX == STOP)                 // если индекс равен 0
   {
      gChannel_A.EN = STOP;                   // останавливаем канал
      Clear_OLD_DataCH_ON_SCREEN(CHANNEL_A, leftLimit, rightLimit - 2);  // очищаем этот канал экране
   }
   else if(gChannel_A.INDX > 0)               // иначе запускаем
   {
      gChannel_A.EN = RUN;
      
      /* пишем в регистр ПЛИС открытый или закрытый вход в зависимости от pnt_Channel->INDX */     
      Set_Input(CHANNEL_A, gChannel_A.INDX);
      
   }
   /* обновляем текст на кнопке соответсвующего канала */   
   btn->Text = (char *)&ON_OFF_TEXT[gChannel_A.INDX];
}


...............

Обожаю тернарные операторы, это признак шизофрении?
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
vladimersv
Встал на лапы
Сообщения: 82
Зарегистрирован: Пн апр 09, 2012 04:07:37
Откуда: Донецкая. обл.

Re: Вопросы по С/С++ (СИ)

Сообщение vladimersv »

спасибо.
теперь немного понял,я думал что надо общуюю команду в конце прописать типа на возврат в начало,перед else return; тяжело просто все схватить без практики и начальных знаний.
хотя понемногу и сам прописал на действие кнопки ОК на меню тригера .
просто знаний нехватает,немного не моя спецыализация ,мне проще собрать железо ,по старинке .
а с этим прибором просто как говорится -спасение утопающих-дело рук самих утопающих.

но пока непереключает ,пробывал изменять - синтаксическую убераю но по кругу неидёт .
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Re: Вопросы по С/С++ (СИ)

Сообщение unalex »

я переделал код, интуитивно предполагая что в меню 3 пункта, как там стоит на самом деле - понятия не имею

совет: не стоит с такими познаниями в С переделывать такой сложный проект, либо оставить так как есть, либо начать изучать С, сначала на чем нибудь попроще, а потом глядишь и свой собственный проект получится не хуже этого
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
vladimersv
Встал на лапы
Сообщения: 82
Зарегистрирован: Пн апр 09, 2012 04:07:37
Откуда: Донецкая. обл.

Re: Вопросы по С/С++ (СИ)

Сообщение vladimersv »

в принцепи изменить требуется только управление ,они незатронут работу . в данном варианте все работает как ранее (тоесть толькко в верх и потом только в низ )но по кругу нехочит .
некомпелируется именно в верхней части ,изменённой . (сначало на скобки лишние стопорится ,если убераю далее тогда на сами =0 ,=2 . ставлю ==0 и ==2 - компиляция проходит но прокрутки по кругу нет .
тоесть фактически изменения надо только управление .

Код: Выделить всё

void ON_OFF_CHANNEL_A(void)
{
   /* проверка нажатий кнопок и изменения индекса канала если были нажаты */
   if((ButtonsBits == UP) (gChannel_A.INDX < 2) ? gChannel_A.INDX++ : gChannel_A.INDX = 0;
   else if((ButtonsBits == DOWN) (gChannel_A.INDX > 0) ? gChannel_A.INDX-- : gChannel_A.INDX = 2;
   
   //else return;
Аватара пользователя
-Valerius-
Встал на лапы
Сообщения: 99
Зарегистрирован: Сб янв 12, 2013 22:43:10
Откуда: Москва

Re: Вопросы по С/С++ (СИ)

Сообщение -Valerius- »

Приветствую всех. Сильно не пинать - осилил только треть ветки, может где-то и было уже, но вот такая ситуация- в данный момент занимаюсь реализацией вывода на дисплей Nokia N76 (контроллер LS022) текста, победил вывод 8х8 и 8х16 пикселей. Подскажите, точнее раскажите сам алгоритм (желательно поподробней :) )вывода текста, допустим 16х32? Никак не пойму- если ширина символа больше 1 байта( 8 пикселей) может нужно символ выводить частями? Как это реализовать- пока не представляю, закипают мозги..)))
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Re: Вопросы по С/С++ (СИ)

Сообщение unalex »

сорри, это я в if вторую открывающуюся скобку не убрал

Код: Выделить всё

void ON_OFF_CHANNEL_A(void)
{
   /* проверка нажатий кнопок и изменения индекса канала если были нажаты */
   if(ButtonsBits == UP) (gChannel_A.INDX < 2) ? gChannel_A.INDX++ : gChannel_A.INDX = 0;
   //если нажата "вверх" (проверим индекс < 2) ? меньше - увеличить: иначе - присвоить 0
   
   else if(ButtonsBits == DOWN) (gChannel_A.INDX > 0) ? gChannel_A.INDX-- : gChannel_A.INDX = 2;
   //если нажата кнопка "вниз" (проверим индекс > 0) ? больше - уменьшить: иначе - присвоить 2
   
//else return;


так должно работать

пунков меню 3? если нет, то надо будет изменить числа

а насчет =2 и ==2 это разные вещи
=2 - присвоить значение 2
==2 - сравнить с 2

в данном случае надо именно присвоить, прочитай описание принципа работы(см мои сообщения выше)
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
vladimersv
Встал на лапы
Сообщения: 82
Зарегистрирован: Пн апр 09, 2012 04:07:37
Откуда: Донецкая. обл.

Re: Вопросы по С/С++ (СИ)

Сообщение vladimersv »

да пунктов меню 3 ,скобки я уберал сразу, нашол это .
но выдает все также ошибку - :5: error: lvalue required as left operand of assignment в обоих строках
Аватара пользователя
unalex
Мучитель микросхем
Сообщения: 424
Зарегистрирован: Сб авг 25, 2007 22:02:05
Откуда: Германия, Viernheim

Re: Вопросы по С/С++ (СИ)

Сообщение unalex »

а так?

Код: Выделить всё

void ON_OFF_CHANNEL_A(void)
{
   /* проверка нажатий кнопок и изменения индекса канала если были нажаты */
   if(ButtonsBits == UP) {g_Channel_A.INDX = (gChannel_A.INDX < 2) ? (gChannel_A.INDX + 1) : 0;}
   //если(нажимается UP) (g_Channel_A.INDX = (проверяя индекс < 2) ? (меньше - добавим  1) : (иначе - присвоим  0)
   
   else if(ButtonsBits == DOWN) {g_Channel_A.INDX = (gChannel_A.INDX > 0) ? (gChannel_A.INDX - 1) : 2;}
   //а если (нажимается "DOWN") (g_Channel_A.INDX = (проверяя индекс > 0) ? (больше - отнимем  1) : (иначе - присвоим  2)
   
//else return;
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
vladimersv
Встал на лапы
Сообщения: 82
Зарегистрирован: Пн апр 09, 2012 04:07:37
Откуда: Донецкая. обл.

Re: Вопросы по С/С++ (СИ)

Сообщение vladimersv »

класс .
вот теперь работает (правда пришлось убрать прочерк в g_Channel_A.INDX на gChannel_A.INDX )
огромнейшее спасибо .
Аватара пользователя
slavokhire5
Прорезались зубы
Сообщения: 202
Зарегистрирован: Пн сен 26, 2011 13:48:25
Откуда: Харьков

Re: Вопросы по С/С++ (СИ)

Сообщение slavokhire5 »

привет котам:)
появился вопрос дурацкий: нужно ли обзывать переменную-счетчик static (работает в теле main), если в программе всего одна функция main(), но есть обработчики прерываний? счетчик при выходе из прерывания сбиваться не должен)
Осилит дорогу идущий
--------------------------
Пишу на Си за еду
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: Вопросы по С/С++ (СИ)

Сообщение shads »

slavokhire5 писал(а):привет котам:)
появился вопрос дурацкий: нужно ли обзывать переменную-счетчик static (работает в теле main), если в программе всего одна функция main(), но есть обработчики прерываний? счетчик при выходе из прерывания сбиваться не должен)

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

Если это функция main, то из этой функции выхода никогда нет, там не обязательно обзывать static, а если это другая ыункция и надо хранить результат между вызовами, то надо обозвать static.....

Ваш случай:
переменная в main - значит можно без static.
НО она обрабатывается в прерывании, значит - должна быть volatile.
Последний раз редактировалось shads Вт мар 26, 2013 23:46:17, всего редактировалось 1 раз.
Ответить

Вернуться в «Разные вопросы по МК»