Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

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

Вт янв 18, 2022 20:05:33

Наверняка, не заинлайнилось и вызывается как обычная функия. Поэтому код медленнее (за счёт вызова функций MIN/MAX), но меньше по размеру.

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

Вт янв 18, 2022 20:23:28

А ничего что это вооооообще разные действия? Функция зачем возвращает bool ?

Зацени разницу Compiler Exploer

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

Вт янв 18, 2022 20:37:44

Да уж, слона-то и не приметили...

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

Вт янв 18, 2022 20:56:22

Зато программа сильно меньше стала :)

ЗЫ: Кстати, а кто заметил тут шаблоны?

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

Вт янв 18, 2022 21:04:21

а, извиняюсь, auto - это ведь на самом деле int? то есть макрос и функция вообще принципиально разное поведение будут иметь!

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

Вт янв 18, 2022 21:09:23

Нет, не int. С auto делать будет то же самое что и макрос.
Последний раз редактировалось VladislavS Вт янв 18, 2022 21:56:42, всего редактировалось 1 раз.

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

Вт янв 18, 2022 21:43:33

Ну да, это ж не си... Как обманчива природа!

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

Вт янв 18, 2022 21:49:56

Дело в том, что там не просто функция, а шаблон. Полная запись как-то так выглядит
Код:
template<typename T, typename U>
auto min(T a, U b) { return a<b?a:b; }
В обычном применении это будет эквивалентно макросу.

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

Вт янв 18, 2022 23:20:17

Всем привет. В этой теме уже была похожая проблема, но не такая как у меня..
Вообщем создаю меню. Создал структуру, засунул ее в прогмем, потом создал массив структур и туда же положил. Следом создаю указатель на структуру и хочу ему присваивать разные структуры (из массива) которые соответствуют текущему пункту меню. Но во время присвоения получаю какой то левый адрес. Почему так происходит?
И еще, если я присваиваю не через макросы прогмема то адрес получаю правильный, но дальше программа отказывается работать...
Изображение

Последний раз редактировалось Аlex Ср янв 19, 2022 04:51:57, всего редактировалось 1 раз.
Причина: [code] [/code]

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

Ср янв 19, 2022 05:01:38

Я с AVR не работал никогда, но, сдаётся мне, что добавление PROGMEM в typedef, ничего не даёт.
Уберите этот квалификатор оттуда и вставляйте его туда, где непосредственно нужно разместить объект во флеши (массив MenuItems и в указателе parent).

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

Ср янв 19, 2022 06:51:22

Если вы работаете с современным тулчейном, прочитайте, наконец, о новых возможностях компилятора и пользуйтесь ими! Я сейчас о квалификаторе __flash и __memx
Эти квалификаторы позволяют абсолютно прозрачно работать с памятью программ через типизованные указатели, как с ОЗУ. Я в другой теме не раз об этом писал.

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

Ср янв 19, 2022 09:10:19

Вообщем создаю меню

можно для подсказки подсмотреть микроменю исходник:
https://github.com/abcminiuser/micromenu-v2
там действительно
Код:
typedef const struct Menu_Item {
      const struct Menu_Item *Next; /**< Pointer to the next menu item of this menu item */
      const struct Menu_Item *Previous; /**< Pointer to the previous menu item of this menu item */
      const struct Menu_Item *Parent; /**< Pointer to the parent menu item of this menu item */
      const struct Menu_Item *Child; /**< Pointer to the child menu item of this menu item */
      void (*SelectCallback)(void); /**< Pointer to the optional menu-specific select callback of this menu item */
      void (*EnterCallback)(void); /**< Pointer to the optional menu-specific enter callback of this menu item */
      const char Text[]; /**< Menu item text to pass to the menu display callback function */
   } Menu_Item_t;

и в конфиге настраивается в какой памяти
#define MENU_ITEM_STORAGE PROGMEM

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

Ср янв 19, 2022 19:22:28

ARV, наверное из за того что дя PROGMEM есть куча примеров. а для __flash не особо.
oleg110592, да основная идея взята от туда, но дело в том что я многое там не понимаю, и по этому решил написать так как мне будет понятно.. и вот такой результат.
пробовал уже и другой тип данных в место указателя на структуру делать. тогда вообще нули получаю.
Может я как то неправильно беру адрес структуры?
Код:
parent = ((MenuItem*)pgm_read_ptr(&MenuItems[1]));
даже если я изменяю в квадратных скобках структуру первую или вторую все равно получаю один и тот же адрес

кажется разобрался тут нужно считывать адрес во флеш где хранятся данные znak = pgm_read_byte(&parent->key_state);
Но теперь вопрос, почему же вот таким способом я получаю правильный адрес? parent = ((MenuItem*)&MenuItems[1]);
Ведь я считываю из памяти программ без каких либо макросов..

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

Ср янв 19, 2022 19:57:01

Roman Solovey писал(а):а для __flash не особо
я здесь на форуме выкладывал свой проект с активным использованием __flash, и как раз для меню :))) FlexMenu
но, если вы с указателями на ты, всю суть можно объяснить несколькими строками:
Код:
// вот так строка помещается в память программ
const __flash char str[] = "string";

// вот так создается тип-структра, которую затем будем помещать в памяти программ
typedef const __flash struct{
  int data;
  const __flash char *fstr; // а это указатель на строку во flash
} flash_data;

// вот массив в памяти программ, наполненный теми структурами:
const __flash flash_data array[] = {
  {.data=1, .fstr = str},
  {/* и так далее*/}
};

// вот так выводится строка из памяти программ
printf("%S\n", str); // как видите, никаких pgm_read_xxxx

// вот собственная функция перебора символов подобной строки
int flash_strlen(const __flash char *s){
  int result = 0;
  while(*s++)
     result++;
  return result;
}

i = flash_strlen(str);
как видите, достаточно описать тип с префиксом const __flash, и данные окажутся в памяти программ, а доступ к ним можно осуществлять так, как будто они в озу, т.е. по имени переменной или через разыменование указателя соответствующего типа.

всё просто

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

Ср янв 19, 2022 20:14:08

аа. я понял. тогда реально отпадает потребность во всех этих извращениях с тем что и от куда читать.
но все же, я такой человек который хочет докопаться до истины, почему я могу получить правильный адрес без использования спец макросов. Единственное что наталкивает на мысль что на этапе компиляции туда подставляются нужные значения..

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

Ср янв 19, 2022 20:15:35

Roman Solovey писал(а):я такой человек который хочет докопаться до истины
ну, успехов в раскопках :)))

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

Ср янв 19, 2022 20:42:34

может поможет - нашел примерчик в своих раскопках, давненько, когда тоже меню ковырял

з.ы. проверил в протеусе - блинкает

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

Чт янв 20, 2022 00:14:21

Добрый вечер. Переписал библиотеку для дисплейчика SSD1306 (128х64) с Arduino на нормальный C++(14). для МК ATmega328P. hardware SPI. Работает нормально. Прошел весь тест. Поменяв pinReset, pinDC протесстировал и на ATmega 2560. Работает на любой меге если позволяет размер памяти. Далее планирую переписать и для цветных дисплейчиков. Заказал - уже в пути (4 шт. разных). Вкурил в абстрактные классы, наследование, виртуальные методы, поверхностно в темплеты. hardware SPI для Ардуины также переписан и затемплетен - файл SPI(AVR_T).h. Все файлики в архиве. (пирожок только что из печки - прошу откушать) :P

Добавлено after 13 minutes 29 seconds:
Питание дисплея по сигнальным проводам, так что отсутствует необходимость подключения внешнего иcточника 3,3 V.
Вложения
IMG_0500.JPG
Картинка, тестовая плата
(84.67 KiB) Скачиваний: 59
SSD1306(ATmega326P).png
Подключение и работа дисплея SSD1306
ATmega328P AtmelStudio -std=c++14
(15.99 KiB) Скачиваний: 54
ssd1306(new).rar
Подключение и работа дисплея SSD1306
ATmega328P AtmelStudio -std=c++14
(98.03 KiB) Скачиваний: 72

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

Чт янв 20, 2022 08:14:03

Поучите,пожалуйтса, как правильно сделать следующее. Продолжаю развивать систему журналирования. У меня каждые 2,5мс пишется уже 23байта:
Код:
    typedef struct data_buffer {
        int16_t setspeedLeft;       // 2
        int16_t setspeedRight;      // 2
        int16_t RealSpeedLeft;      // 2
        int16_t RealSpeedRight;     // 2
        int32_t StepsLeft;          // 4
        int32_t StepsRight;         // 4
        uint32_t Time;              // 4
        uint8_t vbat;
        uint8_t sensors;
        uint8_t whereami;
    }  __attribute__((packed)) data_buffer_t;
Это быстрый поток. Но еще хочу добавить медленный поток, который за 28 секунд планируется около десятка записей. Для этого я ввёл байт whereami, который показывает в каком программном модуле я нахожусь. Но если в этом байте записан 0, то это типа признака медленного потока и при интепретации данные передаются другие (и пока что меньше чем в быстром потоке):
Код:
typedef struct slow_data {
    int coordX;
    int coordY;
    uint segmentLength;
    int nodeNum;
}
Как объявить это дело, чтобы размер записи всегда был одинаковым и байт whereami тоже находился в одном и том же месте. Конечно я могу просто дефайнами переобозвать, что #define coordX SetSpeedLeft итд. Но, ведь, наверняка, есть более красивый способ записи? Слышал про union, но не могу сообразить как его сюда приделать, чтобы поле whereami никуда не уехало.

до вечера...

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

Чт янв 20, 2022 08:29:39

так?
Код:
typedef struct data_buffer {
   union{
      struct {
        int16_t setspeedLeft;       // 2
        int16_t setspeedRight;      // 2
        int16_t RealSpeedLeft;      // 2
        int16_t RealSpeedRight;     // 2
      };
      struct{
        int coordX; //2
        int coordY; // 2
        uint segmentLength; // 2
        int nodeNum; // 2
      };
   };
   int32_t StepsLeft;          // 4
   int32_t StepsRight;         // 4
   uint32_t Time;              // 4
   uint8_t vbat;
   uint8_t sensors;
   uint8_t whereami;
 }  __attribute__((packed)) data_buffer_t;
Ответить