Страница 21 из 386
Re: Вопросы по С/С++ (СИ)
Добавлено: Пт апр 22, 2011 21:26:45
ellioh
UPD: Внизу подсказали, что всё-таки так можно, но надо писать не t::f <int> (), а t::template f <int> ()
Только что наступил на очаровательные C++ные грабли.

Прямо поделиться хочется.
Оказывается, вот ТАК нельзя:
Код: Выделить всё
struct a {
template <typename t> static void f () {}; //Шаблонная статическая функция
};
template <typename t> //Шаблон, который я позже хочу параметризовать структурой a.
struct b {
static void f () {
t::f <int> (); //Здесь ошибка. Даже до параметризации не доходит.
//Нет способа объяснить ему, что f -- шаблонная функция, хоть убейся.
}
};
Компилятор не в состоянии понять, что t::f -- шаблон, угловых скобок не ждёт и дико обламывается.
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб апр 23, 2011 00:59:30
vitalik_1984
Код: Выделить всё
if (Cur_btn>0)
{
_Button= Off;
//при Cur_btn == Btn_Down и 0<_Gear<6 убавить _Gear
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|1|6))) _Gear=0;
if ((Cur_btn == Btn_Rear) && ( _Gear==0)) _Gear=6;
}
return 0;
Не понимаю почему даже когда _Gear =0 выполняются все операторы как написать правильно?
даже если _Gear=0 выполняется пункт при Cur_btn == Btn_Rear
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб апр 23, 2011 08:34:36
Gudd-Head
vitalik_1984 писал(а):Не понимаю почему даже когда _Gear =0 выполняются все операторы как написать правильно?
даже если _Gear=0 выполняется пункт при Cur_btn == Btn_Rear
У вас вперемешку логическое и побитовое И. Это нормально?
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб апр 23, 2011 17:21:16
vitalik_1984
Gudd-Head писал(а):vitalik_1984 писал(а):Не понимаю почему даже когда _Gear =0 выполняются все операторы как написать правильно?
даже если _Gear=0 выполняется пункт при Cur_btn == Btn_Rear
У вас вперемешку логическое и побитовое И. Это нормально?
Я, к сожалению, не знаю разницы.Подскажите, пожалуйста как правильно сделать.
нужно обычное сравнение с прараметрами, а в перемешку, это потому что я уже всяко попробовал не работает так как нужно.
нужно чтобы обрабатывалось нажатие клавиш -Cur_btn (от0до 4) и проверялось значение в _Gear и в соответствии с получ данными изменять состояние _Gear
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб апр 23, 2011 17:43:15
ChipKiller
2 vitalik_1984
должно быть не
|, а
&
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб апр 23, 2011 19:32:31
avreal
Да тут, думаю, важнее понимане того, что это
Код: Выделить всё
if ((Cur_btn ==Btn_Neytral) && ( _Gear==(2|1|6))) _Gear=0;
так не записать, надо писать
Код: Выделить всё
if (Cur_btn==Btn_Neytral && ( _Gear==2 || _Gear==1 || _Gear==6)) _Gear=0;
А уж где надо И, где ИЛИ -- это потом по логике проекта смотреть.
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб апр 23, 2011 21:36:42
vitalik_1984
Почему погасают индикаторы после отпускания кнопок?
Код: Выделить всё
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 не сохраняется, хотя объявлена как глобальная.Пока нажата кнопка одно значение, а когда отпущена - обратно в ноль.
Re: Вопросы по С/С++ (СИ)
Добавлено: Вс апр 24, 2011 21:07:23
boobonick
Подскажите, пожалуйста, есть массив:
buff[0]=min%10;
buff[1]=min/10;
buff[2]=hour%10;
buff[3]=hour/10;
А как его передать в функцию целиком clock_out (unsigned char tstr){} ? buff не получается, с указателем pbuff=buff тоже, не понимаююю

Re: Вопросы по С/С++ (СИ)
Добавлено: Вс апр 24, 2011 21:12:33
vitalik_1984
Ребята, подскажите, пожалуйста.Я пробовал в симуляторе работает вроде так как нужно, а в железе не работает, где просчет?
И еще вопрос как запустить таймер после нажатия кнопки, чтоб он просто так не тарабанил и чтоб некоторое время не срабатывали нажатия на кнопок.Что-то вроде программный антидребезг и защита от случайного нажатия.
Re: Вопросы по С/С++ (СИ)
Добавлено: Вс апр 24, 2011 21:26:26
ARV
boobonick писал(а):Подскажите, пожалуйста, есть массив:
buff[0]=min%10;
buff[1]=min/10;
buff[2]=hour%10;
buff[3]=hour/10;
А как его передать в функцию целиком clock_out (unsigned char tstr){} ? buff не получается, с указателем pbuff=buff тоже, не понимаююю

Код: Выделить всё
void clock_out (unsigned char *tstr){
// тут работаете с массивом tstr[]
}
// а вот так передаете свой массив в эту функцию
clock_out (buff);
вот как-то так...
Re: Вопросы по С/С++ (СИ)
Добавлено: Вс апр 24, 2011 21:29:33
vitalik_1984
boobonick писал(а):Подскажите, пожалуйста, есть массив:
buff[0]=min%10;
buff[1]=min/10;
buff[2]=hour%10;
buff[3]=hour/10;
А как его передать в функцию целиком clock_out (unsigned char tstr){} ? buff не получается, с указателем pbuff=buff тоже, не понимаююю

Нужно счетчик типа
Код: Выделить всё
unsigned char _text;
for (i = 0; i < 4; i++)
{ _text= buff[i]+_text;// Складываем строки из ячеек буфера
}
clock_out (unsigned char _text){}//Передаем строку функции :)
простите если с ошибками написано, но я думаю идея ясна.
Re: Вопросы по С/С++ (СИ)
Добавлено: Вс апр 24, 2011 21:31:54
md5sum
vitalik_1984 писал(а):
{ _text= buff+_text;// Складываем строки из ячеек буфера
простите если с ошибками написано, но я думаю идея ясна.
И получим сумму значений buff, а не строку

Re: Вопросы по С/С++ (СИ)
Добавлено: Вс апр 24, 2011 21:33:32
vitalik_1984
ARV, может и мне идейку подкинете?
Может есть ссылки где всё разжевано?
Re: Вопросы по С/С++ (СИ)
Добавлено: Вс апр 24, 2011 21:37:55
vitalik_1984
md5sum писал(а):vitalik_1984 писал(а):
{ _text= buff+_text;// Складываем строки из ячеек буфера
простите если с ошибками написано, но я думаю идея ясна.
И получим сумму значений buff, а не строку

Вам бы только поехидничать? Взяли бы да предложили свой вариант.
Может я и не так записал решение, но я из опыта дельфи и Бейсика знаю, что можно строковые переменные складывать.Только как это сделать в Си я не знаю.
Re: Вопросы по С/С++ (СИ)
Добавлено: Вс апр 24, 2011 21:51:38
md5sum
vitalik_1984 писал(а):Может я и не так записал решение, но я из опыта дельфи и Бейсика знаю, что можно строковые переменные складывать.Только как это сделать в Си я не знаю.
Опыт бейсика иногда только мешает - это мое личное мнение, навязывать его я не буду, но и спорить на эту тему тоже.
В
С строковых переменных нет. Есть только массивы каких либо типов. Это может быть массив символов char (точнее байт), а может и вообще "хитрой" структуры. О том, что это строка - знает только программист. В функцию массивы передаются по указателю - как и написал ARV. Для удобства есть библиотечные функции для работы со строками, но это именно библиотеки ДЛЯ УДОБСТВА, которые так-же оперируют массивами, только с учетом того, что 0x00 означает конец строки и соответственно длинна строки может быть любой в пределах выделенной ей памяти (статически или динамически)
Re: Вопросы по С/С++ (СИ)
Добавлено: Вс апр 24, 2011 22:07:43
md5sum
vitalik_1984 писал(а):еще вопрос как запустить таймер после нажатия кнопки, чтоб он просто так не тарабанил и чтоб некоторое время не срабатывали нажатия на кнопок.Что-то вроде программный антидребезг и защита от случайного нажатия.
Таймер запускается при установке значения предделителя (точнее источника тактов) в отличное от 0 и останавливается при установке в 0.
Проверили нажата-ли кнопка, запустили таймер (выставив нужные CS биты пределителя).
В прерывании таймера по необходимому Вам условию (переполнение, совпадение) обнуляете CS биты.
А про программный антидребезг - лучше все таки в поиск, так как вариантов реализации очень много и только Вам выбирать наиболее удобный для данного случая.
Как вариант на первой странице гугла
http://www.levap.ru/2010/05/podavlenie- ... kontaktov/
Re: Вопросы по С/С++ (СИ)
Добавлено: Вс апр 24, 2011 22:11:17
vitalik_1984
md5sum писал(а):
В С строковых переменных нет. Есть только массивы каких либо типов. Это может быть массив символов char (точнее байт), а может и вообще "хитрой" структуры. О том, что это строка знает только программист. В функцию массивы передаются по указателю - как и написал ARV. Для удобства есть библиотечные функции для работы со строками, но это именно библиотеки ДЛЯ УДОБСТВА, которые так-же оперируют массивами, только с учетом того, что 0x00 означает конец строки и соответственно длинна строки может быть любой в пределах выделенной ей памяти (статически или динамически)
Вот теперь понятно, спасибо за разъяснение.
А как насчет моего случая(см. выше на пару сообщений). Почему в симуляторе работает, переменной _Gear меняются значения, а в железе не так?Правда я не вижу что там реально происходит.
Re: Вопросы по С/С++ (СИ)
Добавлено: Вс апр 24, 2011 22:20:41
vitalik_1984
Еще вопрос, правильно ли мое обращение к массиву: Gears[_gear]?
Выглядит все правильно, при нажатии на кнопку зажигается именно тот байт, что в таблице.,правда он должен их перебирать, а зажигается только один.
Re: Вопросы по С/С++ (СИ)
Добавлено: Вс апр 24, 2011 22:39:34
md5sum
vitalik_1984 Судя по
Код: Выделить всё
#include <avr/io.h>
#define F_CPU 12000000UL
#include <util/delay.h>
Вы используете winavr (avr-gcc), но тогда почему компилятор не ругается на
?
ISR макрос описан в заголовочном файле avr/interrupts.h и не надо писать int. И
asm ("sei"); то-же не надо. А для разрешения прерываний, в том-же interrupts.h есть функция sei()
правда он должен их перебирать, а зажигается только один
В Вашем последнем листинге есть _Button= Off;, но в основном цикле нету _Button= On;
В прерывании таймера то-же закомментирована эта строка.
Если планируете менять значение _Button в прерывании, то объявите переменную так
Re: Вопросы по С/С++ (СИ)
Добавлено: Пн апр 25, 2011 11:39:01
boobonick
Спасибо за ответы
