struct a {
template <typename t> static void f () {}; //Шаблонная статическая функция
};
template <typename t> //Шаблон, который я позже хочу параметризовать структурой a.
struct b {
static void f () {
t::f <int> (); //Здесь ошибка. Даже до параметризации не доходит.
//Нет способа объяснить ему, что f -- шаблонная функция, хоть убейся.
}
};
Компилятор не в состоянии понять, что t::f -- шаблон, угловых скобок не ждёт и дико обламывается.
Последний раз редактировалось ellioh Вт апр 26, 2011 09:48:31, всего редактировалось 1 раз.
vitalik_1984 писал(а):Не понимаю почему даже когда _Gear =0 выполняются все операторы как написать правильно?
даже если _Gear=0 выполняется пункт при Cur_btn == Btn_Rear
У вас вперемешку логическое и побитовое И. Это нормально?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
vitalik_1984 писал(а):Не понимаю почему даже когда _Gear =0 выполняются все операторы как написать правильно?
даже если _Gear=0 выполняется пункт при Cur_btn == Btn_Rear
У вас вперемешку логическое и побитовое И. Это нормально?
Я, к сожалению, не знаю разницы.Подскажите, пожалуйста как правильно сделать.
нужно обычное сравнение с прараметрами, а в перемешку, это потому что я уже всяко попробовал не работает так как нужно.
нужно чтобы обрабатывалось нажатие клавиш -Cur_btn (от0до 4) и проверялось значение в _Gear и в соответствии с получ данными изменять состояние _Gear
Последний раз редактировалось vitalik_1984 Сб апр 23, 2011 18:11:18, всего редактировалось 1 раз.
if (Cur_btn==Btn_Neytral && ( _Gear==2 || _Gear==1 || _Gear==6)) _Gear=0;
А уж где надо И, где ИЛИ -- это потом по логике проекта смотреть.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
while(1){//Begin while
if (_Button== On){ read_key();
PORTD = Gears[_Gear];
}
}//end while
unsigned char read_key (void){
Pressed=0;
Cur_btn = 0;
Pressed =(PINB & 0b00011101);
if (~Pressed & 0b00010000) Cur_btn= Btn_Down;
if (~Pressed & 0b00001000) Cur_btn = Btn_Up;
if (~Pressed & 0b00000001) Cur_btn = Btn_Rear;
if (~Pressed & 0b00000100) Cur_btn = Btn_Neytral;
//--------------------------------------------------------
if (Cur_btn>0)
{
_Button= Off;
if ((Cur_btn == Btn_Down)&&((_Gear>0)&&(_Gear<6))) _Gear--;
if ((Cur_btn == Btn_Up) && (_Gear<5)) _Gear++;
if (Cur_btn == Btn_Neytral && ( _Gear==2 || _Gear==1 || _Gear==6)) _Gear=0;
if ((Cur_btn == Btn_Rear) && ( _Gear==0)) _Gear=6;
}
return 0;
}
Уже много вариантов перебрал,если горит, то выглядит так, как будто _Gear не сохраняется, хотя объявлена как глобальная.Пока нажата кнопка одно значение, а когда отпущена - обратно в ноль.
Ребята, подскажите, пожалуйста.Я пробовал в симуляторе работает вроде так как нужно, а в железе не работает, где просчет?
И еще вопрос как запустить таймер после нажатия кнопки, чтоб он просто так не тарабанил и чтоб некоторое время не срабатывали нажатия на кнопок.Что-то вроде программный антидребезг и защита от случайного нажатия.
vitalik_1984 писал(а):
{ _text= buff+_text;// Складываем строки из ячеек буфера
простите если с ошибками написано, но я думаю идея ясна.
И получим сумму значений buff, а не строку
Вам бы только поехидничать? Взяли бы да предложили свой вариант.
Может я и не так записал решение, но я из опыта дельфи и Бейсика знаю, что можно строковые переменные складывать.Только как это сделать в Си я не знаю.
vitalik_1984 писал(а):Может я и не так записал решение, но я из опыта дельфи и Бейсика знаю, что можно строковые переменные складывать.Только как это сделать в Си я не знаю.
Опыт бейсика иногда только мешает - это мое личное мнение, навязывать его я не буду, но и спорить на эту тему тоже.
В С строковых переменных нет. Есть только массивы каких либо типов. Это может быть массив символов char (точнее байт), а может и вообще "хитрой" структуры. О том, что это строка - знает только программист. В функцию массивы передаются по указателю - как и написал ARV. Для удобства есть библиотечные функции для работы со строками, но это именно библиотеки ДЛЯ УДОБСТВА, которые так-же оперируют массивами, только с учетом того, что 0x00 означает конец строки и соответственно длинна строки может быть любой в пределах выделенной ей памяти (статически или динамически)
Последний раз редактировалось md5sum Вс апр 24, 2011 22:08:21, всего редактировалось 1 раз.
— Не говорите мне что делать и я не скажу куда Вам идти...
vitalik_1984 писал(а):еще вопрос как запустить таймер после нажатия кнопки, чтоб он просто так не тарабанил и чтоб некоторое время не срабатывали нажатия на кнопок.Что-то вроде программный антидребезг и защита от случайного нажатия.
Таймер запускается при установке значения предделителя (точнее источника тактов) в отличное от 0 и останавливается при установке в 0.
Проверили нажата-ли кнопка, запустили таймер (выставив нужные CS биты пределителя).
В прерывании таймера по необходимому Вам условию (переполнение, совпадение) обнуляете CS биты.
А про программный антидребезг - лучше все таки в поиск, так как вариантов реализации очень много и только Вам выбирать наиболее удобный для данного случая.
Как вариант на первой странице гугла http://www.levap.ru/2010/05/podavlenie- ... kontaktov/
— Не говорите мне что делать и я не скажу куда Вам идти...
md5sum писал(а):
В С строковых переменных нет. Есть только массивы каких либо типов. Это может быть массив символов char (точнее байт), а может и вообще "хитрой" структуры. О том, что это строка знает только программист. В функцию массивы передаются по указателю - как и написал ARV. Для удобства есть библиотечные функции для работы со строками, но это именно библиотеки ДЛЯ УДОБСТВА, которые так-же оперируют массивами, только с учетом того, что 0x00 означает конец строки и соответственно длинна строки может быть любой в пределах выделенной ей памяти (статически или динамически)
Вот теперь понятно, спасибо за разъяснение.
А как насчет моего случая(см. выше на пару сообщений). Почему в симуляторе работает, переменной _Gear меняются значения, а в железе не так?Правда я не вижу что там реально происходит.
Еще вопрос, правильно ли мое обращение к массиву: Gears[_gear]?
Выглядит все правильно, при нажатии на кнопку зажигается именно тот байт, что в таблице.,правда он должен их перебирать, а зажигается только один.
ISR макрос описан в заголовочном файле avr/interrupts.h и не надо писать int. И asm ("sei"); то-же не надо. А для разрешения прерываний, в том-же interrupts.h есть функция sei()
правда он должен их перебирать, а зажигается только один
В Вашем последнем листинге есть _Button= Off;, но в основном цикле нету _Button= On;
В прерывании таймера то-же закомментирована эта строка.
Если планируете менять значение _Button в прерывании, то объявите переменную так