Инициализируйте в начале программы, в лоб.
Вопросы по С/С++ (СИ)
Нельзя.
Инициализируйте в начале программы, в лоб.
Инициализируйте в начале программы, в лоб.
- Реклама
- Сообщения: 574
- Зарегистрирован: Вт ноя 02, 2010 17:46:37
Не знаю. Это, скорее, вопрос к авторам языка, почему они разрешили
Они наверняка даже и не думали, что кто-нибудь спросит "почему можно ?"
Они наверняка даже и не думали, что кто-нибудь спросит "почему можно ?"
Если компилятор - GCC, то есть разные интересные способы инициализации вроде
https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html
Код: Выделить всё
int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };в том числе и не по порядкуWiseLord писал(а):Если компилятор - GCC, то есть разные интересные способы инициализации
Код: Выделить всё
int widths[] = { [10 ... 99] = 2, [100] = 3, [1 ... 9] = 1, [0] = 123 };если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Реклама
A[0]={1,2,3...} ?
Посоветуйте С/С++ редактор с автозавершением
Codevision и AVRStudio4 как таковых плюшек не имеют, ну разве что примитивная подсветка синтаксиса.
Keil 4 уже лучше, но с перечислениями в битовых полях структур тоже что-то не так.
Например код в заголовочном файле:
Я в программе пишу
В идеале хотелось бы что-то легкое и простое типа Notepad++. И вообще что сейчас годное есть?
Codevision и AVRStudio4 как таковых плюшек не имеют, ну разве что примитивная подсветка синтаксиса.
Keil 4 уже лучше, но с перечислениями в битовых полях структур тоже что-то не так.
Например код в заголовочном файле:
Код: Выделить всё
typedef enum{
ADPS_DIV2=1,
ADPS_DIV4=2,
ADPS_DIV8=3,
ADPS_DIV16=4,
ADPS_DIV32=5,
ADPS_DIV64=6,
ADPS_DIV128=7
}ADPS_t;
typedef struct{
ADPS_t ADPS:3;
char ADIE:1;
char ADIF:1;
char ADATE:1;
char ADSC:1;
char ADEN:1;
}ADCSRA_t;
#define ADCSRAs ((__IO ADCSRA_t *) 0x26)Код: Выделить всё
void main(void)
{
ADCSRAs->[вот тут должен вывалиться список ADPS...ADEN]=[тут тоже должен появиться список значений ADPS_DIV];
}- Вложения
-
- autocompletion.PNG
- (12.54 КБ) 343 скачивания
Уже на протяжении многих лет применяю и всем советую IDE Eclipse. Это, конечно, редактором назвать можно с определенной натяжкой, это 100% IDE, и не очень легковесная... Но по сравнению с MS Visual Studio просто перышко.uk8amk писал(а):Посоветуйте С/С++ редактор с автозавершением
Сам пользуюсь Eclipse Mars 2, более новые стали сильнее ориентироваться на Java-разработчиков и имеют всякие странные эффекты при работе с Си.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Это только в Keil-ARM работает, судя по всему. Пытался то же сделать в Keil C51 - аналогично, никак. Об этом и в хелпе писано.ADCSRAs->[вот тут должен вывалиться список...]
Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
можно попробовать Микрософт VS Codeuk8amk писал(а):И вообще что сейчас годное есть?
https://code.visualstudio.com/
компиляцию можно организовать через маке и пр., GDB отладка простенько тоже работает.
Тут разбирался: http://mcu.goodboard.ru/viewtopic.php?id=7
Eclipse классный, но по enum автоподсказку вытащить не получилось.
Может делаю не так?
По Ctr+Space конечно вываливается всё подряд(сотни имён). Но так и в Keil оно работает.
Кажется в древней VisualC или Borland было неплохое автозаполнение. Надо поставить и посмотреть.
Может делаю не так?
Код: Выделить всё
typedef enum{
STOP=0,
UP=1,
DOWN=2
} DEV_STA_t;
void main(void)
{
DEV_STA_t s;
s = ?
}Кажется в древней VisualC или Borland было неплохое автозаполнение. Надо поставить и посмотреть.
нажимайте Ctrl-Space после ввода первых символов константы. лично я для удобства всегда константам даю имена, начинающиеся со смыслового префикса, например:
тогда ввожу CMD_ и получаю ограниченный список имен. enum в Си не тип вообще, есличо (ну, может последние версии что-то поменяли... не в курсе)
Код: Выделить всё
enum{
CMD_STOP,
CMD_UP,
CMD_DN
};если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Можете ещё Qt Creator попробовать, он достаточно легковесный, по сравнению с тем же Eclipse:

Не совсем то, что Вы заказывали, но автодополнение с учётом препроцессора (а ADCSRAs это всё же макрос) - это посложнее будет и, если и реализовано где-то, то вряд ли много где.
Мне ещё в Qt Creator нравится его способ работы с несколькими файлами исходного кода. Можно рядом открыть даже один и тот же файл в нескольких "окнах".

Не совсем то, что Вы заказывали, но автодополнение с учётом препроцессора (а ADCSRAs это всё же макрос) - это посложнее будет и, если и реализовано где-то, то вряд ли много где.
Мне ещё в Qt Creator нравится его способ работы с несколькими файлами исходного кода. Можно рядом открыть даже один и тот же файл в нескольких "окнах".
Почитал тут заголовок файла, что мне сгенерил мплаб и вычитал интересную фразу:С первыми двумя, вроде как проблем нет: Это биты соответствующие нажатым кнопкам. В принципе, еще в ту же группу можно добавить KEY_RELEASE - этот код функция выдаёт при отпущенной клавише. Так что можно бы написать:
Тогда я бы мог переменной, куда читаю кнопки присвоить тип keys_t, да вот беда в том, что у них может быть аттрибут "повторения". И чтобы это работало корректно, надо определить еще по одному варианту для каждой кнопки (и еще вариант возврата "пустоты" - 0x00).
Можно ли это как сделать корректно или ну его нафиг? Причем, просто сейчас сделав такое изменение (заменил так #define на enum) компилятор проглотил и не подавился. Правда еще не проверил в работе. Переменной тип keys_t не назначал.
.Погуглил. Показалось интересным. Правда для моего проекта это мало интересно - слишком прост, чтобы в дебаггере ковыряться. Но, решил попробовать. Нашел в исходнике кучу #define и решил их превратить в enum.Use project enums instead of #define for ON and OFF.
Код: Выделить всё
#define KEY_SET 0x40
#define KEY_MODE 0x10
#define KEYMASK (KEY_SET | KEY_MODE)
#define HOLDED (1<<0)
#define KEY_RELEASE (1<<1) Код: Выделить всё
typedef enum KEY_DEFINITION {
KEY_SET = 0x40,
KEY_MODE = 0x10,
KEY_RELEASE = 0x02
} keys_t; Можно ли это как сделать корректно или ну его нафиг? Причем, просто сейчас сделав такое изменение (заменил так #define на enum) компилятор проглотил и не подавился. Правда еще не проверил в работе. Переменной тип keys_t не назначал.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
- Сообщения: 353
- Зарегистрирован: Вс янв 19, 2014 22:41:55
А в чём некорректность? Неудобство обработки? Как вариант:uldemir писал(а):Тогда я бы мог переменной, куда читаю кнопки присвоить тип keys_t, да вот беда в том, что у них может быть аттрибут "повторения". И чтобы это работало корректно, надо определить еще по одному варианту для каждой кнопки (и еще вариант возврата "пустоты" - 0x00).
Можно ли это как сделать корректно или ну его нафиг?
Код: Выделить всё
[...]
case KEY_SET_REPEAT:
repeat = true;
// no break
case KEY_SET:
// обрабатываем с учётом флага
break;
[...]
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! 
Просто много писанины. Так функция обработки кнопок может вернуть значение
или Т.е. в enum придется отдельно вводить KEY_SET_HOLDED, KEY_MODE_HOLDED. И еще третий вариант возможен (и четвертый...) когда обе кнопки нажаты и/или удерживаются... что-то много становится сущностей для двух кнопок. А стоит добавить третью - число вариаций начнет расти как снежный ком. Кажется, что в данном случае эти enum для меня не рациональны.
Код: Выделить всё
return readkey; Код: Выделить всё
return readkey | HOLDED; Спойлер
Код: Выделить всё
// Функция опроса клавиатуры
// kbddelay = 448 - соответствует 1с. 1/488 = 2ms
#define DEBOUNCE_DELAY 6 // 6*2=12ms - подавление дребезга
#define REPEAT_DELAY (SCANPERSECOND/3*2) // 0.66c - задержка перед повтором
#define REPEAT_PERIOD (SCANPERSECOND/3) // 0.33c - период автоповтора
unsigned char kbdread(void) {
unsigned char readkey;
static unsigned char repeated, prevkey;
readkey = (PORTC ^ KEYMASK) & KEYMASK;
if (readkey == 0) { // not pressed
repeated = 0;
prevkey = 0;
kbddelay = 0;
return KEY_RELEASE;
} else {
if (prevkey != readkey){ // now pressed
prevkey = readkey;
repeated = 0;
kbddelay = DEBOUNCE_DELAY;
return 0;
}
else {
if (readkey == prevkey) {
if (kbddelay == 0) {
if (repeated) {
kbddelay = REPEAT_PERIOD;
return readkey | HOLDED;
}
else {
kbddelay = REPEAT_DELAY;
repeated = 1;
return readkey;
}
}
}
}
}
return 0;А люди посмотрят и скажут: "Собаки летят. Вот и осень."
- Сообщения: 20
- Зарегистрирован: Чт июн 26, 2014 15:27:55
Всем привет. Друзья, помогите, пожалуйста. Учу CVAVR, он основан на C++, пишу простенькую программку для переключения поворотов и включения аварийки. Применяю побитовый сдвиг, и собсно проблема - когда переключаю по одному порту, то все работает, если же задествую два порта одновременно, программа виснет. Код под спойлером. Не могу понять, в чем причина, по логике должно работать.
Спойлер
Код: Выделить всё
#include <mega8.h>
#include <io.h>
volatile unsigned char numl=0, nump=0, num_al=0, switch_arr[3]={1,2,3}, flag;
#define poworoty PORTB
#define left_sig 0
#define right_sig 1
#define left_butt PIND.0
#define right_butt PIND.1
#define alarm_butt PIND.2
#define left_on poworoty |= (1<<left_sig)
#define left_off poworoty &= ~ (1<<left_sig)
#define right_on poworoty |= (1<<right_sig)
#define right_off poworoty &= ~ (1<<right_sig)
#define alarm_on poworoty |= (1<<left_sig)|(1<<right_sig)
#define alarm_off poworoty &= ~ ((1<<right_sig)|(1<<left_sig))
// Timer1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
num_al++; //счетчик аварийки
nump++; //счетчик правого
numl++; //счетчик левого
TCNT1H=0;
TCNT1L=0;
}
void switcher () { //функция включения соответствующих портов
if (flag==1){
switch (numl){
case 0: left_off; break;
case 1: left_on; break;
case 2: numl=0; break;
}
}
else if (flag==2) {
switch (nump){
case 0: right_on; break;
case 1: right_off; break;
case 2: nump=0; break;
}
}
else if (flag==3) {
switch (num_al){
case 0: alarm_on; break;
case 1: alarm_off; break;
case 2: num_al=0; break;
}
}
}
void main(void)
{
// Declare your local variables here
DDRD = 0x00; // порт D на вход
PORTD = 0xFF; // подключаем внутренние подтяг. резисторы
DDRB = 0xFF; // порт B на выход
PORTB = 0x00; // устанавливаем нули на выходе
TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (1<<CS11) | (1<<CS10);
TCNT1H=0x0B;
TCNT1L=0xDC;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (1<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<TOIE0);
// Global enable interrupts
#asm("sei")
while (1)
{
if (!left_butt) {flag=switch_arr[0]; switcher ();} else if (left_butt) {left_off; numl=0;}
//Правый указатель
if (!right_butt) {flag=switch_arr[1]; switcher ();} else if (right_butt) {right_off; nump=0;}
//Аварийка.
if (!alarm_butt) {flag=switch_arr[2]; switcher ();} else if (alarm_butt) {alarm_off; num_al=0;} ///через ету строку не работает все, то есть контроллер начинает переключать выводы на высокой частоте.
}
}что ж у вас так сложно-то все и запутанно? массивы, флаги какие-то... проще быть надо... как-то так:
Код: Выделить всё
typedef enum{
STATE_OFF,
STATE_LEFT,
STATE_RIGHT,
STATE_ALARM
} states;
states state;
volatile int counter;
interrupt [TIM1_COMPA] void timer1_compa_isr(void){
counter++;
}
void main(void){
// тут добавить настройки таймера и портов
if(!alarm_butt) state = STATE_ALARM;
else if(!left_butt) state = STATE_LEFT;
else if(!right_butt) state = STATE_RIGHT;
else state = STATE_OFF;
switch(state){
case STATE_OFF:
left_off;
right_off;
break;
case STATE_LEFT:
if(counter & 1)
left_on;
else
left_off;
break;
case STATE_RIGHT:
if(counter & 1)
right_on;
else
right_off;
break;
case STATE_ALARM:
if(counter & 1){
right_on;
left_on;
} else {
right_off;
right_off;
}
break;
}
}
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 20
- Зарегистрирован: Чт июн 26, 2014 15:27:55


