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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
Siarzhuk
Потрогал лапой паяльник
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

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

Сообщение Siarzhuk »

slavokhire5 писал(а):либо какой-то третий вариант?


В общем случае, как уже и посоветовали - "структура структурирует". Если потребуется унифицированная обработка набора параметров (операция for each) - можно попробовать представить их массивом:

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

// определяем индексы
enum {
  eGain = 0,
  eADC1,
  eADC2,
[...]
  eMagic,
  // count of params
  eCount
};

// массив настроек
uint8_t params[eCount] = { 0 };

[...]

// получаем настройки от ведущего в предопределённом порядке
  for (int i = 0; i < eCount; i++)
    params[i] = receiveParam();

[...]

// используем
  GAIN = params[eGain];

[...]

// выбрасываем в отладочную консоль
  for (int i = 0; i < eCount; i++)
    DEBUG_OUT(params[i]);
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

А с сочетанием union и struct можно вообще красивые вещи делать
Спойлер

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

typedef struct {
   uint8_t eGain;
   union {
      uint8_t eADC[4];
      struct {
         uint8_t eADC1,
         uint8_t eADC2,
         uint8_t eADC3,
         uint8_t eADC4,
      };
   };
   uint16_t eMagic,
   uint8_t eCount;
} myStruct;

int main()
{
   //....

   myStruct ms;

   for (i = 0; i < 4; i++)
      ms.eADC[i] = 0;

   ms.eADC3 = 4;

   //....
};
Т.е. к элементу структуры eADC1 можно обратиться и по имени, так и по индексу массива eADC, лежащего за счёт union в той же области памяти, что и четыре подряд идущих элемента eADCX.

Как минимум, gcc это поддерживает.
OKF
Это не хвост, это антенна
Сообщения: 1385
Зарегистрирован: Вт июн 07, 2011 08:03:18

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

Сообщение OKF »

Вопрос знатокам. Имеем такой фрагмент.

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

  if(SPEED == SPEED_250) {
    setup |= (1<<DR_LOW);
  } else {
    if (SPEED == SPEED_2) {
       setup |= (1<<DR_HIGH);
    } else if (SPEED == SPEED_2) {
    } else {
       //default
    }
  }
SPEEDxx - это константы.
Как я понимаю, оптимизатор выкинет неиспользуемые куски.
Тогда почему не возложить это на препроцессор? В чём фишка?
Логические ошибки обсуждать не будем.
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

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

Сообщение Jack_A »

Ничего он не выкинет. SPEEDxx - это константы, а SPEED - переменная ( я глубоко не вникал, но по логике так ) , и значение ее в процессе работы заранее не известно, поэтому все варианты ветвления должны быть сохранены.
Но если это - параметр конфигурации (типа if DevType == TINY13), то это безусловно макрос, и на этапе компиляции будет выбран только соответствующий вариант. Впрочем, скорее всго, синтаксис макроса совсем другой (На СИ для компа я не писал лет 10, а для МК - вообще никогда), но смысл приблизно такой.

----------
Да, похоже . Анализ Siarzhuk'а нашел слабое место в коде и работу для оптимизатора. Но и мое утверждение остается верным. Хотя, кажется, довольно банальным. :(
Последний раз редактировалось Jack_A Вс июл 05, 2015 09:47:48, всего редактировалось 2 раза.
Аватара пользователя
Siarzhuk
Потрогал лапой паяльник
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

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

Сообщение Siarzhuk »

OKF писал(а):Тогда почему не возложить это на препроцессор? В чём фишка?

Видимо потому, что препроцессор не имеет столько информации, чтобы принять квалифицированное решение о исключении кусков кода. Ему вообще всё равно что там между его директивами - даже язык на котором написан исходный текст ему безразличен - лишь бы #-директивы были синтаксически верными.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Аватара пользователя
Siarzhuk
Потрогал лапой паяльник
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

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

Сообщение Siarzhuk »

Jack_A писал(а):Ничего он не выкинет. SPEEDxx - это константы, а SPEED - переменная

Скорее всего коллега, подобно сибирским мужикам с бензопилой на рельсах, имел ввиду что дублированное сравнение со SPEED_2 будет исключено оптимизатором. Подозреваю, что даже если бы там и не было дублированной проверки - то при пустых телах if-ов, я бы, на месте оптимизатора, их (т.е. проверки на пустых телах) всенепременно выкинул-бы.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
OKF
Это не хвост, это антенна
Сообщения: 1385
Зарегистрирован: Вт июн 07, 2011 08:03:18

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

Сообщение OKF »

Jack_A писал(а):Ничего он не выкинет. SPEEDxx - это константы, а SPEED - переменная..:(
Ещё раз. Читаем внимательно.
OKF писал(а):SPEEDxx - это константы.
SPEED - константа!
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

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

Сообщение Jack_A »

Вам виднее. Не видя всего исходника, можно предположить и такое, что у автора if 2==4, но это уж настолько через опу, что обсуждение этого исходника на тему "почему он так сделал" теряет всякий смысл. Все-таки интуиция мне подсказывает, что это не так. И если исходник взят с работающего проекта, а не со студенческих экзерцисов, то автор клиническим идиотом не может быть никак, хотя код, конечно, не блещет.
Впрочем, из этой ветки я пас.
Аватара пользователя
hybroid
Друг Кота
Сообщения: 8007
Зарегистрирован: Вс ноя 14, 2010 19:24:26
Откуда: Лукалэнд

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

Сообщение hybroid »

Исходник может быть универсальным. И в зависимости от заданной константы SPEED заниматься разными вещами.
А дальше можно долго решать, на что лучше возложить работу: на компилятор или препроцессор. В данном случае (если SPEED - константа) - всё равно на что.

PS: хотя какой-то странный быдлокод, судя по двойной проверке на одно и то же :)
Аватара пользователя
Siarzhuk
Потрогал лапой паяльник
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

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

Сообщение Siarzhuk »

Jack_A писал(а):Вам виднее. Не видя всего исходника, можно предположить и такое, что у автора if 2==4, но это уж настолько через опу.

За что препроцессор и поругаем бывает, что скрывает такие детали от взгляда человеческого. Оно, конечно, правила хорошего тона рекомендуют строчными буквами только препроцессорный стафф обозначать - но в процессе рефакторинга, да если коллеги ленивые и привычки руки мыть не имеют - жизнь этот код несчастный всяко может отметаморфозить. Я вот, к примеру, самолично и воочию видел деятеля, который в WinAPI-шный BOOL запихивал числа типа 345634645.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

OKF писал(а): В чём фишка?


Быдлокод вульгарис .
OKF
Это не хвост, это антенна
Сообщения: 1385
Зарегистрирован: Вт июн 07, 2011 08:03:18

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

Сообщение OKF »

Может быть...
Решил посмотреть как делают ЛЮДИ. Некто Davide Gironi - библиотека nrf24l01. Куча проектов, народ повторяет, включают в свои проекты... Размещают на Гитхабе, печатают в прессе...
Работает и у меня. Работало. До поры, до времени. Убил с пол дня.
Т.к. ICSP параллельно nRf, последний менял содержимое регистров при программировании, а после рестарта, выяснилось что не все регистры инициализировались...
Вот и этот фрагмент, собственно, оттуда.
Ну ладно бы, какой-нибудь начинающий...
Эт что ж получается? "Никому нельзя верить"?))
Аватара пользователя
hybroid
Друг Кота
Сообщения: 8007
Зарегистрирован: Вс ноя 14, 2010 19:24:26
Откуда: Лукалэнд

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

Сообщение hybroid »

Мёртвым можно верить. А больше - никому, даже себе нельзя верить.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

OKF писал(а):Куча проектов, народ повторяет, включают в свои проекты... Размещают на Гитхабе, печатают в прессе...


Очередное доказательство что общество тупеет. Но ни как не о качестве кода...
kalobyte
Друг Кота
Сообщения: 13796
Зарегистрирован: Чт сен 20, 2007 14:08:00

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

Сообщение kalobyte »

вопрос с++ в виндовсе

есть длл, которая генерит сообщение формата wm_xxx
и есть lparam wparam, где лежат нужные данные
я так понимаю, что эти сообщения - аналог прерываний

а как все это обработать? к длл нет примеров
lparam wparam это вообще какие-то непонятные переменные

есть где что почитать на русском? я так погуглил, но не нашел простого примера, как написать этот обработчик прерывания

2.5.2 MSG_PSKCHARRDY
Numeric Value is WM_USER+1001 or 0x400+0x3E9 or 0x7E9 or 2025.
This message is sent from the DLL to the Window whose handle is passed when the fnStartSoundCard is called. It is
sent whenever there is an ASCII character available from the receiver or if in the Transmit mode, when a character has
been sent out the soundcard.
The following parameters are sent along with this message:
 wParam = The ASCII character(0 to 255)
 lParam = -1 if is a transmitted character, or the Receive channel number(0-49) that is sending the message.
тематические ответы только в форуме, в приват не пишите
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

в любой виндовой программе есть главный цикл обработки сообщений - там при помощи функции getmessage берется очередное сообщение WM_xxx из очереди и при помощи обычного switch-а и обрабатывается. Параметры - это обычные числа, для стандартных сообщений винды их структура предопределена, например, для сообщения WM_MOUSEMOVE в lparam в старшем и младшем слове хранятся соответственно координаты X и Y курсора мышки, а wparam содержит битовые флаги состояния кнопок мыши. Для некоторых сообщений структура более сложная - смотреть в документации.

для нестандартных (пользовательских сообщений типа WM_USER) параметр lparam может кастоваться как указатель на структуру в глобальной куче, а уже в этой структуре хоть поэму Лермонтова размещать можно.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Siarzhuk
Потрогал лапой паяльник
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

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

Сообщение Siarzhuk »

kalobyte писал(а):есть длл, которая генерит сообщение формата wm_xxx
и есть lparam wparam, где лежат нужные данные

... и должно быть либо окно либо поток, либо функция-callback в которые это сообщение посылается. По идее перед этим длл-ке указывается либо HWND окна, id потока либо указатель на функцию-callback в которую всё это будет отсылаться.
kalobyte писал(а):а как все это обработать? к длл нет примеров

Пришлите линк на длл в личку либо саму длл-ку - гляну что там есть у неё в экспорте. И вообще откуда она у вас?
kalobyte писал(а): lparam wparam это вообще какие-то непонятные переменные

Это параметры API-шных функций SendMessage/PostMessage - основных рабочих лошадок системы. Сразу после того, как Билл посчитал что 640 килобайт хватит на всё про всё - он же решил что двух параметров - один размером 2 байта (в девичестве), другой аж целых 4 хватит на все времена и случаи жизни. В общем та самая задница древней лошади, ограничивающая, согласно легенде, размер ускорителей запускаемого с мыса Канаверал космического барахла.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Аватара пользователя
slavokhire5
Прорезались зубы
Сообщения: 202
Зарегистрирован: Пн сен 26, 2011 13:48:25
Откуда: Харьков

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

Сообщение slavokhire5 »

Привет котам:)
у меня вопрос. наверное по препроцессору:)

файл uipopt.h - есть такая конструкция:

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

#include "uip-conf.h"
...
#ifdef UIP_CONF_UDP
#define UIP_UDP UIP_CONF_UDP
#else /* UIP_CONF_UDP */
#define UIP_UDP           0
#endif /* UIP_CONF_UDP */

файл uip-conf.h:

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

...
#define UIP_CONF_UDP            1
.....

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

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

#if UIP_UDP
....
#endif
Осилит дорогу идущий
--------------------------
Пишу на Си за еду
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

#if UIP_UDP - так неправильно. Надо либо #ifdef UIP_UDP или #if defined(UIP_UDP).
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

WiseLord писал(а):#if UIP_UDP - так неправильно. Надо либо #ifdef UIP_UDP или #if defined(UIP_UDP).

почему не правильно? по-моему, нормально. UIP_UDP задан нулевым, поэтому #if не срабатывает
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Ответить

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