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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
ellioh
Встал на лапы
Сообщения: 100
Зарегистрирован: Сб янв 22, 2011 16:57:45

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

Сообщение 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 -- шаблон, угловых скобок не ждёт и дико обламывается.
Последний раз редактировалось ellioh Вт апр 26, 2011 09:48:31, всего редактировалось 1 раз.
Клоподавер упрыгхт
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение 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
В поисках истины человек развивается.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

vitalik_1984 писал(а):Не понимаю почему даже когда _Gear =0 выполняются все операторы как написать правильно?
даже если _Gear=0 выполняется пункт при Cur_btn == Btn_Rear

У вас вперемешку логическое и побитовое И. Это нормально?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

Gudd-Head писал(а):
vitalik_1984 писал(а):Не понимаю почему даже когда _Gear =0 выполняются все операторы как написать правильно?
даже если _Gear=0 выполняется пункт при Cur_btn == Btn_Rear

У вас вперемешку логическое и побитовое И. Это нормально?


Я, к сожалению, не знаю разницы.Подскажите, пожалуйста как правильно сделать.

нужно обычное сравнение с прараметрами, а в перемешку, это потому что я уже всяко попробовал не работает так как нужно.
нужно чтобы обрабатывалось нажатие клавиш -Cur_btn (от0до 4) и проверялось значение в _Gear и в соответствии с получ данными изменять состояние _Gear
Последний раз редактировалось vitalik_1984 Сб апр 23, 2011 18:11:18, всего редактировалось 1 раз.
В поисках истины человек развивается.
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

2 vitalik_1984

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

....((_Gear>0)|(_Gear<6)))
должно быть не |, а &
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

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

Сообщение 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;

А уж где надо И, где ИЛИ -- это потом по логике проекта смотреть.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение 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 не сохраняется, хотя объявлена как глобальная.Пока нажата кнопка одно значение, а когда отпущена - обратно в ноль.
Вложения
AVRGCC1.c
Полный текст
(1.98 КБ) 305 скачиваний
В поисках истины человек развивается.
Аватара пользователя
boobonick
Встал на лапы
Сообщения: 123
Зарегистрирован: Сб ноя 18, 2006 17:14:15

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

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

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

Сообщение vitalik_1984 »

Ребята, подскажите, пожалуйста.Я пробовал в симуляторе работает вроде так как нужно, а в железе не работает, где просчет?
И еще вопрос как запустить таймер после нажатия кнопки, чтоб он просто так не тарабанил и чтоб некоторое время не срабатывали нажатия на кнопок.Что-то вроде программный антидребезг и защита от случайного нажатия.
В поисках истины человек развивается.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение 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);
вот как-то так...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

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

Сообщение 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){}//Передаем строку функции :)


простите если с ошибками написано, но я думаю идея ясна.
В поисках истины человек развивается.
Аватара пользователя
md5sum
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

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

Сообщение md5sum »

vitalik_1984 писал(а): { _text= buff[i]+_text;// Складываем строки из ячеек буфера
простите если с ошибками написано, но я думаю идея ясна.

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

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

Сообщение vitalik_1984 »

ARV, может и мне идейку подкинете? :roll:
Может есть ссылки где всё разжевано?
В поисках истины человек развивается.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

md5sum писал(а):
vitalik_1984 писал(а): { _text= buff[i]+_text;// Складываем строки из ячеек буфера
простите если с ошибками написано, но я думаю идея ясна.

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

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

Может я и не так записал решение, но я из опыта дельфи и Бейсика знаю, что можно строковые переменные складывать.Только как это сделать в Си я не знаю.
В поисках истины человек развивается.
Аватара пользователя
md5sum
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

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

Сообщение md5sum »

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

Опыт бейсика иногда только мешает - это мое личное мнение, навязывать его я не буду, но и спорить на эту тему тоже.
В С строковых переменных нет. Есть только массивы каких либо типов. Это может быть массив символов char (точнее байт), а может и вообще "хитрой" структуры. О том, что это строка - знает только программист. В функцию массивы передаются по указателю - как и написал ARV. Для удобства есть библиотечные функции для работы со строками, но это именно библиотеки ДЛЯ УДОБСТВА, которые так-же оперируют массивами, только с учетом того, что 0x00 означает конец строки и соответственно длинна строки может быть любой в пределах выделенной ей памяти (статически или динамически)
Последний раз редактировалось md5sum Вс апр 24, 2011 22:08:21, всего редактировалось 1 раз.
— Не говорите мне что делать и я не скажу куда Вам идти...
Аватара пользователя
md5sum
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

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

Сообщение md5sum »

vitalik_1984 писал(а):еще вопрос как запустить таймер после нажатия кнопки, чтоб он просто так не тарабанил и чтоб некоторое время не срабатывали нажатия на кнопок.Что-то вроде программный антидребезг и защита от случайного нажатия.

Таймер запускается при установке значения предделителя (точнее источника тактов) в отличное от 0 и останавливается при установке в 0.
Проверили нажата-ли кнопка, запустили таймер (выставив нужные CS биты пределителя).
В прерывании таймера по необходимому Вам условию (переполнение, совпадение) обнуляете CS биты.
А про программный антидребезг - лучше все таки в поиск, так как вариантов реализации очень много и только Вам выбирать наиболее удобный для данного случая.
Как вариант на первой странице гугла http://www.levap.ru/2010/05/podavlenie-drebezga-kontaktov/
— Не говорите мне что делать и я не скажу куда Вам идти...
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

md5sum писал(а):В С строковых переменных нет. Есть только массивы каких либо типов. Это может быть массив символов char (точнее байт), а может и вообще "хитрой" структуры. О том, что это строка знает только программист. В функцию массивы передаются по указателю - как и написал ARV. Для удобства есть библиотечные функции для работы со строками, но это именно библиотеки ДЛЯ УДОБСТВА, которые так-же оперируют массивами, только с учетом того, что 0x00 означает конец строки и соответственно длинна строки может быть любой в пределах выделенной ей памяти (статически или динамически)


Вот теперь понятно, спасибо за разъяснение.
А как насчет моего случая(см. выше на пару сообщений). Почему в симуляторе работает, переменной _Gear меняются значения, а в железе не так?Правда я не вижу что там реально происходит.
В поисках истины человек развивается.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

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

Сообщение vitalik_1984 »

Еще вопрос, правильно ли мое обращение к массиву: Gears[_gear]?
Выглядит все правильно, при нажатии на кнопку зажигается именно тот байт, что в таблице.,правда он должен их перебирать, а зажигается только один.
В поисках истины человек развивается.
Аватара пользователя
md5sum
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

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

Сообщение 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;
— Не говорите мне что делать и я не скажу куда Вам идти...
Аватара пользователя
boobonick
Встал на лапы
Сообщения: 123
Зарегистрирован: Сб ноя 18, 2006 17:14:15

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

Сообщение boobonick »

Спасибо за ответы :))
Ответить

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