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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

Mishany писал(а):как привильно будет?

В данном случае так:

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

if ((ADMUX & (1<<MUX0)) != 0)

Если короче:

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

if (ADMUX & (1<<MUX0))

так как внутри if всегда происходит проверка на ноль. Если 0, то if не сработает, в любом другом случае сработает.
Аватара пользователя
Mishany
Электрический кот
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

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

Сообщение Mishany »

спасибо
у меня такая запись еще заработала

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

if(!(ADMUX & (1<<MUX0)))

тут если ноль, то входит в if
а сдесь:

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

if(ADMUX & (1<<MUX0))

если в MUX0 еденица то входит в if
правильно я понял?
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

Да, разумеется. Обычная логика.
Если очень часто используется, можно задефайнить для удобочитаемости (на скорость и память не повлияет)

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

#define is_mux_set (ADMUX & (1<<MUX0))
#define is_mux_clear !(ADMUX & (1<<MUX0))

// где-то дальше

if (is_mux_set)
{
     ...
}

if (is_mux_clear)
{
     ...
}
Аватара пользователя
FeCat
Прорезались зубы
Сообщения: 211
Зарегистрирован: Пт окт 21, 2011 14:39:31

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

Сообщение FeCat »

Среди файлов, подключаемых директивой #include, встречаются файлы без расширения. К примеру

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

#include <QtSerialPort/QSerialPortInfo>

Открыл QSerialPortInfo в блокноте, а там:

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

 #include "qserialportinfo.h".

Свидетельствует ли отсутствие расширения, о чём либо?
Аватара пользователя
Мikа
Потрогал лапой паяльник
Сообщения: 343
Зарегистрирован: Пн апр 01, 2013 15:13:40
Откуда: Москва

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

Сообщение Мikа »

Привет всем, я вот наткнулся на такую штуку.

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

while (bit_is_set (PIND, 0))
      {
         if (i==1)
         {
            i=0;
            PORTC ^= (1 << PINC2);
         }
         asm("nop");
      }


Суть такова. i взводится в прерывании по таймеру.
Если строка asm("nop"); присутствует, то при каждом прерывании программа заходит в if и делает то, что написано. Если жена месте asm("nop"); ничего нет, то программа сидит в этом while, но в if не заходит. Если на место asm("nop"); добавить другой if, то оба будут работать. А почему так?
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

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

Сообщение BCluster »

i объявлена как volatile? Если нет, вполне понятно почему так
Аватара пользователя
Мikа
Потрогал лапой паяльник
Сообщения: 343
Зарегистрирован: Пн апр 01, 2013 15:13:40
Откуда: Москва

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

Сообщение Мikа »

i объявлена как unsigned char или unsigned int. Щас спать ложусь, всё закрыл точно не помню :)
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

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

Сообщение BCluster »

Если переменная используется в прерывании, ее надо объявлять как volatile
например

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

volatile char x;


Кстати, в этой теме, кажется с вами же, это недавно обсуждалось.
Если она не объявлена таким образом компилятор вполне может ее "соптимизировать"
Аватара пользователя
Мikа
Потрогал лапой паяльник
Сообщения: 343
Зарегистрирован: Пн апр 01, 2013 15:13:40
Откуда: Москва

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

Сообщение Мikа »

Я недавно в этой теме задавался вопросом о том, что "компилятор не выделяет больше 2 байт под переменную", но разобрались :) Потом что-то ещё. А вот про это совсем не припомню. В любом случае спасибо, теперь точно буду знать! :)
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Аватара пользователя
DruidCat
Встал на лапы
Сообщения: 116
Зарегистрирован: Чт май 03, 2012 06:27:23
Откуда: Челябинск

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

Сообщение DruidCat »

FeCat писал(а):Среди файлов, подключаемых директивой #include, встречаются файлы без расширения. К примеру

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

#include <QtSerialPort/QSerialPortInfo>

Открыл QSerialPortInfo в блокноте, а там:

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

 #include "qserialportinfo.h".

Свидетельствует ли отсутствие расширения, о чём либо?

В #include пиши как хочешь, QtSerialPort/QSerialPortInfo или qserialportinfo.h, разницы нет, но лучше писать:

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

#include <QtSerialPort/QSerialPortInfo>
Кот должен прожить жизнь без сожаления.
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

Здравствуйте, написал я вот такую функцию

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

inline void usart123(void);

inline void usart123(void){
#asm("nop")
#asm("nop")
#asm("nop")
}


Скомпилировал в CodeVisionAVR v2.05 с оптимизацией по скорости и уровнем максимальным.

смотрю что мне он выдал в ассемблере

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

   OUT  0x1B,R30
; 0000 00A6
; 0000 00A7
; 0000 00A8 usart123(); // TEST
   CALL _usart123
; 0000 00A9
; 0000 00AA
; 0000 00AB test_eeprom[3]=0xAA;


Разве он не должен был вместо CALL _usart123 сразу вставить nop ?
Если перейти по метки они там дальше есть (я думал он их с оптимизирует)
Убрал inline всё тоже самое.
Как сделать что бы он тело функции вставлял ?
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

Не должен.
Мог бы, но не обязан. Компилятор может игнорировать это ключевое слово.
Если отсутствие вызова функции критично, объявите это как макрос (#define).
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

А заставить компилятор не игнорировать можно ?
Ну в макрос там на самом деле много запихивать.
И не совсем нужно она выполняется 1 раз.
Программа моя стоит примерно и вот таких кусков
типа функция отправки массива по usart

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

        if(send_usart==1){

             if(len!=0){  //  len  так же показывает готовность буффера.   
                    if(len>255){len=0;};
                    if (!(UCSR1A & (1<<UDRE1))==0){
                        //UDR1=buff_resuve[index_usart];
                        UDR1=usart_send_buffer[index_usart];
                        len--;
                        index_usart++;
                    }
             }
             else{
             index_usart=0;
             send_usart=0;
             Usart_resive=1;
             }
        }


из за таких функций главный цикл растянулся и хотелось бы всё ужать как-нибудь.
можно конечно в другой файл скинуть и приинклудить но тогда файлов много получается.

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

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

Сообщение ARV »

если вам нужно просто "ужать" код, то оформляйте куски кода static-функциями, нормальный компилятор сам проинлайнит все, что сможет.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

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

Сообщение HHIMERA »

pokk писал(а):из за таких функций главный цикл растянулся и хотелось бы всё ужать как-нибудь.
можно конечно в другой файл скинуть и приинклудить но тогда файлов много получается.

Это всё из-за каши в голове... Наинлайните чего попало... а потом "Памажите, не запихивается!"...
Все эти ужимки и кривляния с текстом даром не пройдут... Выделяйте функции... если нужно, выносите в другой файл... Излишнее упрощение текста может привести к обратному эффекту - ухудшению читаемости или к потере понимания происходящего... особенно при поиске ошибок или нарушении алгоритма...
"Я не даю готовых решений, я заставляю думать!"(С)
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

HHIMERA, скорее всего вы правы я изначально хотел выделить функции в отдельный файл
что бы потом в другом проекте можно было их использовать. Но сейчас пришёл к выводу что это сложно назвать функцией
она всё растёт и растёт так что в другом проекте без переделки уже неприменима.

На счёт инлайна в codevision он что-то не фурычит, а Winavr сразу сделал как надо.
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

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

Сообщение pokk »

Есть функция которая предаёт первый элемент массива.
Как сделать так что бы она принимала массивы которые не только расположены в SRAM но и те которые находятся в EEPROM ?

Думаю тип аргумента надо сделать void * но там дальше надо какое-то явное преобразование сделать а вот с этим не понятно.

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

eeprom  unsigned char  test_eeprom[10];
unsigned char ADC_BUFF[255];

void USART_SEND(unsigned char *c)
{
while ((UCSR1A & (1<<UDRE1))==0);
UDR1=c[0];
}

void main(void){

 while{
  USART_SEND23(test_eeprom);
  USART_SEND23(ADC_BUFF);
 }
}
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

pokk писал(а):Есть функция которая предаёт первый элемент массива.
Как сделать так что бы она принимала массивы которые не только расположены в SRAM но и те которые находятся в EEPROM ?

это можно сделать только передавая в функцию еще один параметр, по которому будет определяться тип указателя.

или сделать функцию, которая передает байт, и обращаться к ней с соответствующим элементом массива в качестве аргумента: в вашем варианте нет никакого смысла передавать УКАЗАТЕЛЬ
Последний раз редактировалось ARV Чт мар 27, 2014 13:24:10, всего редактировалось 1 раз.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

Сообщение Аlex »

Передавать ещё один параметр, для определения области.

ЗЫ: Опоздал :)
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

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

Сообщение BCluster »

А просто каст к (unsigned char*) не поможет?

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

USART_SEND23((unsigned char*)test_eeprom);
Ответить

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