Страница 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

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

....((_Gear>0)|(_Gear<6)))
должно быть не |, а &

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 тоже, не понимаююю :dont_know:

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 тоже, не понимаююю :dont_know:

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

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 тоже, не понимаююю :dont_know:
Нужно счетчик типа

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

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, а не строку :)) :kill:

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

Добавлено: Вс апр 24, 2011 21:33:32
vitalik_1984
ARV, может и мне идейку подкинете? :roll:
Может есть ссылки где всё разжевано?

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

Добавлено: Вс апр 24, 2011 21:37:55
vitalik_1984
md5sum писал(а):
vitalik_1984 писал(а): { _text= buff+_text;// Складываем строки из ячеек буфера
простите если с ошибками написано, но я думаю идея ясна.

И получим сумму значений buff, а не строку :)) :kill:

Вам бы только поехидничать? Взяли бы да предложили свой вариант.

Может я и не так записал решение, но я из опыта дельфи и Бейсика знаю, что можно строковые переменные складывать.Только как это сделать в Си я не знаю.

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), но тогда почему компилятор не ругается на

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

int ISR(TIMER0_OVF_vect){
?

ISR макрос описан в заголовочном файле avr/interrupts.h и не надо писать int. И asm ("sei"); то-же не надо. А для разрешения прерываний, в том-же interrupts.h есть функция sei()
правда он должен их перебирать, а зажигается только один
В Вашем последнем листинге есть _Button= Off;, но в основном цикле нету _Button= On;
В прерывании таймера то-же закомментирована эта строка.
Если планируете менять значение _Button в прерывании, то объявите переменную так

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

volatile uint8_t _Button;

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

Добавлено: Пн апр 25, 2011 11:39:01
boobonick
Спасибо за ответы :))