Вопросы по С/С++ (СИ)
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Нельзя.
Инициализируйте в начале программы, в лоб.
Инициализируйте в начале программы, в лоб.
- Реклама
Re: Вопросы по С/С++ (СИ)
А почему в структуре так можно ?
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Не знаю. Это, скорее, вопрос к авторам языка, почему они разрешили
Они наверняка даже и не думали, что кто-нибудь спросит "почему можно ?"
Они наверняка даже и не думали, что кто-нибудь спросит "почему можно ?"
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Если компилятор - GCC, то есть разные интересные способы инициализации вроде
https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html
Код: Выделить всё
int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
в том числе и не по порядкуWiseLord писал(а):Если компилятор - GCC, то есть разные интересные способы инициализации
Код: Выделить всё
int widths[] = { [10 ... 99] = 2, [100] = 3, [1 ... 9] = 1, [0] = 123 };если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Реклама
-
spongebob
- Грызет канифоль
- Сообщения: 289
- Зарегистрирован: Пт мар 20, 2009 12:25:47
- Откуда: Ivanovo
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
A[0]={1,2,3...} ?
-
uk8amk
- Поставщик валерьянки для Кота
- Сообщения: 2222
- Зарегистрирован: Вт ноя 27, 2007 11:32:06
- Откуда: Tashkent
Re: Вопросы по С/С++ (СИ)
Посоветуйте С/С++ редактор с автозавершением
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 скачивания
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Уже на протяжении многих лет применяю и всем советую IDE Eclipse. Это, конечно, редактором назвать можно с определенной натяжкой, это 100% IDE, и не очень легковесная... Но по сравнению с MS Visual Studio просто перышко.uk8amk писал(а):Посоветуйте С/С++ редактор с автозавершением
Сам пользуюсь Eclipse Mars 2, более новые стали сильнее ориентироваться на Java-разработчиков и имеют всякие странные эффекты при работе с Си.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Zhuk72
- Сверлит текстолит когтями
- Сообщения: 1231
- Зарегистрирован: Ср янв 29, 2014 08:41:31
- Откуда: Баку
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Это только в Keil-ARM работает, судя по всему. Пытался то же сделать в Keil C51 - аналогично, никак. Об этом и в хелпе писано.ADCSRAs->[вот тут должен вывалиться список...]
Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Вопросы по С/С++ (СИ)
можно попробовать Микрософт VS Codeuk8amk писал(а):И вообще что сейчас годное есть?
https://code.visualstudio.com/
компиляцию можно организовать через маке и пр., GDB отладка простенько тоже работает.
Тут разбирался: http://mcu.goodboard.ru/viewtopic.php?id=7
-
uk8amk
- Поставщик валерьянки для Кота
- Сообщения: 2222
- Зарегистрирован: Вт ноя 27, 2007 11:32:06
- Откуда: Tashkent
Re: Вопросы по С/С++ (СИ)
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 было неплохое автозаполнение. Надо поставить и посмотреть.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
нажимайте Ctrl-Space после ввода первых символов константы. лично я для удобства всегда константам даю имена, начинающиеся со смыслового префикса, например:
тогда ввожу CMD_ и получаю ограниченный список имен. enum в Си не тип вообще, есличо (ну, может последние версии что-то поменяли... не в курсе)
Код: Выделить всё
enum{
CMD_STOP,
CMD_UP,
CMD_DN
};если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
-
uk8amk
- Поставщик валерьянки для Кота
- Сообщения: 2222
- Зарегистрирован: Вт ноя 27, 2007 11:32:06
- Откуда: Tashkent
Re: Вопросы по С/С++ (СИ)
Более менее вопрос прояснился. Спасибо за советы.
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Можете ещё Qt Creator попробовать, он достаточно легковесный, по сравнению с тем же Eclipse:

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

Не совсем то, что Вы заказывали, но автодополнение с учётом препроцессора (а ADCSRAs это всё же макрос) - это посложнее будет и, если и реализовано где-то, то вряд ли много где.
Мне ещё в Qt Creator нравится его способ работы с несколькими файлами исходного кода. Можно рядом открыть даже один и тот же файл в нескольких "окнах".
Re: Вопросы по С/С++ (СИ)
Почитал тут заголовок файла, что мне сгенерил мплаб и вычитал интересную фразу:С первыми двумя, вроде как проблем нет: Это биты соответствующие нажатым кнопкам. В принципе, еще в ту же группу можно добавить 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 не назначал.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Re: Вопросы по С/С++ (СИ)
А в чём некорректность? Неудобство обработки? Как вариант: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! 
Re: Вопросы по С/С++ (СИ)
Просто много писанины. Так функция обработки кнопок может вернуть значение
или Т.е. в 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;А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Re: Вопросы по С/С++ (СИ)
Всем привет. Друзья, помогите, пожалуйста. Учу 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;} ///через ету строку не работает все, то есть контроллер начинает переключать выводы на высокой частоте.
}
}- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
что ж у вас так сложно-то все и запутанно? массивы, флаги какие-то... проще быть надо... как-то так:
Код: Выделить всё
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;
}
}
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Вопросы по С/С++ (СИ)
Я еще только учусь
Спасибо большое, буду пробовать.


