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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Открыл глаза
Сообщения: 60
Зарегистрирован: Вс ноя 13, 2022 14:58:17

Сообщение Bill_ »

[uquote="VladislavS",url="/forum/viewtopic.php?p=4394562#p4394562"]Связанный свитер, а список связный. А так, в целом верно. Разве что, память не только в куче можно взять.[/uquote]
Исправил. :)
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7382
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

Ну, это всё понятно. пополнение списка у меня не предполагается. потому как это не настоящий форт, а всего-лишь способ интерпретации команд. Очень простой, причем. Почему я кошусь в сторону списков? Хочется избавиться от ограничения на длину строки. Для интерпретатора нуль-терминированная строка вполне подходит (тем более что у меня сейчас это сделано также - сравнение либо до '\0', либо до 12-го символа). Но массив, как вы сказали, имеет жёстко заданные размеры. И для того чтобы иметь возможность с этим справиться и может помочь список. Почему меня не устраивает применение "add_sym()" - из-за того, что тогда этот "список" будет в двух местах и в ПЗУ, и в ОЗУ. И еще нужно будет ждать пока он проиницализируется при старте.
Реклама
Открыл глаза
Сообщения: 60
Зарегистрирован: Вс ноя 13, 2022 14:58:17

Сообщение Bill_ »

[uquote="uldemir",url="/forum/viewtopic.php?p=4394571#p4394571"]Ну, это всё понятно. пополнение списка у меня не предполагается. потому как это не настоящий форт, а всего-лишь способ интерпретации команд. Очень простой, причем. Почему я кошусь в сторону списков? Хочется избавиться от ограничения на длину строки. Для интерпретатора нуль-терминированная строка вполне подходит (тем более что у меня сейчас это сделано также - сравнение либо до '\0', либо до 12-го символа). Но массив, как вы сказали, имеет жёстко заданные размеры. И для того чтобы иметь возможность с этим справиться и может помочь список. Почему меня не устраивает применение "add_sym()" - из-за того, что тогда этот "список" будет в двух местах и в ПЗУ, и в ОЗУ. И еще нужно будет ждать пока он проиницализируется при старте.[/uquote]
Используйте в элемента не массив символов, а указатель на него. Например, вместо

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

char word[12];

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

char *word;
Хотя инициализация массива будет выглядеть одинаково.
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="uldemir",url="/forum/viewtopic.php?p=4394571#p4394571"]Почему я кошусь в сторону списков? Хочется избавиться от ограничения на длину строки.[/uquote]У вас не хватает памяти? Пусть у вас три десятка элементов в среднем занятых на половину. 30х6=180 байт лишних. Вы уверены, что функции работы со связным списком займут меньше? Пока что это выглядит как преждевременная оптимизация.
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 7382
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

В своё время (лет эдак 30 назад) Харий Буш говорил про винчестеры, что скорость их заполнения является константой и от объёма диска независящая. Так же и с памятью. Когда-то хватало 4 килобайт, сейчас и в 128 становится тесно. Хотя новый проект идёт на кристалле с 1.5М флеша и 0.5М озу. Но если серьёзно, хочется научиться разным техникам просто из интереса. И честно, мне плевать, сколько это памяти съест, а как это внятно написать в программе, чтобы было легче её "сопровождать". Я мог бы оставить строку с ограниченной длинной, и когда мне захотелось бы добавить слово "init_brakepath" тогда пришлось бы думать, сократить эту команду на 2 символа или в определении поменять 12 на 14. А так, я даже еще потерял 4 байта памяти на указатель к строке, но зато можно не ломать голову что делать.
СпойлерСобственно, всё это началось с того, что взяв проект двухлетней давности я не мог вспомнить, как пользоваься некоторыми командами и поэтому захотелось добавить команду "help", которая мне напомнила бы, как та или иная команда работает. Т.е. help переключает контекст и команда init_brakepath не инициализирует таблицу тормозного пути, а рассказывает, что она будет делать. Так что важнее читаемость программы для дальнейшей модификации, а не объём памяти (хотя его тоже нельзя брасывать со счёт). Читаю тут что на C++ это можно делать гораздо продвинутей, но я еще сам не настолько продвинут
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Красивого решения для работы со строковыми литералами на этапе компиляции нет даже в С++. Каждый раз решение под задачу приходится придумывать. Где-то память важна, где-то скорость доступа. Для USB-дескрипторов, например, вот так делаю.

1. Под каждый литерал глобальная структура. Макросы зло, но шаблоны и строковые литералы плохо дружат. Так что, пока макрос.
Изображение

2. Набиваем глобальных объектов
Изображение

3. Создаём массив указателей на глобальные объекты. Причём, тут даже жертвуем типизацией.
Изображение

4. Например, поиск в такой "структуре" по индексу
Изображение

И никакие связные списки для константных данных этапа компиляции, само собой, тут не нужны. Каждый инструмент предназначен для своих задач.
Спойлер
изображение_2023-04-01_125710093.png
(13.67 КБ) 569 скачиваний
изображение_2023-04-01_125920771.png
(10.53 КБ) 562 скачивания
изображение_2023-04-01_130154999.png
(4.97 КБ) 565 скачиваний
изображение_2023-04-01_130635725.png
(4.95 КБ) 524 скачивания
Друг Кота
Аватара пользователя
Сообщения: 7382
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

Вопрос по ардуине. Есть функция в файле motors.cpp

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

void set_motor_pwm_frequency(int frequency) {
  switch (frequency) {
    case PWM_31250_HZ:
      // Divide by 1. frequency = 31.25 kHz;
... 
      break;
    case PWM_3906_HZ:
      // Divide by 8. frequency = 3.91 kHz;
...
      break;
    case PWM_488_HZ:
    default:
      // Divide by 64. frequency = 488Hz;
...
      break;
  }
}
вызывается просто:

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

set_motor_pwm_frequency();
Я бы подумал, что установится частота 488Гц. Но в хидере она объявлена так:

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

/***
 * @brief set the motor pwn drive to one of three possible values
 */
void set_motor_pwm_frequency(int frequency = PWM_31250_HZ);
Это что значит? в плюсах я ничего не понимаю.
Друг Кота
Аватара пользователя
Сообщения: 15788
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

"аргумент по умолчанию" - если ничего в аргументах не указывается пользователем будет использовано значение по умолчанию.
8)
OKF
Это не хвост, это антенна
Сообщения: 1452
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

[uquote="uldemir",url="/forum/viewtopic.php?p=4409235#p4409235"]Но в хидере...[/uquote]
Не в хидере, а в хедере! "Карту купи..."
Друг Кота
Аватара пользователя
Сообщения: 7382
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

Лучше бы по делу что написали, что произойдёт, если этот хи... пусть будет так: motors.h не будет включен в motors.cpp.
Встал на лапы
Сообщения: 81
Зарегистрирован: Пт май 14, 2021 22:25:07

Сообщение zx_gamer »

Я вижу тут народ списки обсуждал. TL;DR.
Чем не устраивает плюсовый std::list? Список, конечная самая простая из сложных структур данных, но реализовывать функции для работы с ней с нуля муторно.
Кстати, совет, можно написать список полностью в максросах (как шаблоны на Си++) и тогда можно будет не копипастить их для разных типов данных.
Встал на лапы
Аватара пользователя
Сообщения: 145
Зарегистрирован: Пн апр 02, 2012 15:56:23

Сообщение azhel12 »

[uquote="zx_gamer",url="/forum/viewtopic.php?p=4412126#p4412126"]Чем не устраивает плюсовый std::list?[/uquote]
Думаю, что не ошибусь, если скажу, что среднему программисту гораздо проще написать свою реализацию списка (хоть на си, хоть на плюсах с шаблонами), чем свой кастомный аллокатор для STL-контейнеров.
Друг Кота
Аватара пользователя
Сообщения: 7382
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

Снова глупый вопрос. Для расчета тормозного пути мне надо вычислить разность квадратов a²-b². В целочисленных вычислениях я использовал формулу (a-b)*(a+b) - два сложения и одно умножение. А как лучше считать для плавующей точки, если у процессора есть FPU? имеется в виду - два умножения и сложение или два сложения и умножение - что будет быстрее.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Имхо, умножение однотактное маловероятно даже на FPU, а сложение однозначно однотактное.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Мудрый кот
Сообщения: 1838
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="uldemir",url="/forum/viewtopic.php?p=4455689#p4455689"]если у процессора есть FPU? имеется в виду - два умножения и сложение или два сложения и умножение - что будет быстрее.[/uquote]Зависит от используемого CPU и его системы команд. И от степени дурости компилятора. Например - для Cortex-M4F с нормальным компилятором будет одинаково, так как сложения и умножения - все однотактные. Если конечно компилятору не вздумается MAC-инструкцию использовать. А для тех CPU, у коих есть 1-тактные MAC-и, быстрее будет вариант с 2-мя умножениями.

[uquote="uldemir",url="/forum/viewtopic.php?p=4455689#p4455689"]надо вычислить разность квадратов a²-b². В целочисленных вычислениях я использовал формулу (a-b)*(a+b) - два сложения и одно умножение.[/uquote]Если на Cortex-M4, то - зря. Так как 2 умножения + 1 сложение должно быть быстрее (2 однотактные команды). Если конечно в разрядную сетку результаты влезают.
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1393
Зарегистрирован: Чт авг 21, 2014 11:11:48
Откуда: краснодарский край

Сообщение главный колбасист »

https://www.cyberforum.ru/post7927930.html
Вот и у меня такая же фигня.
C:\crossdev\src\mingw-w64-v3-git\mingw-w64-crt\crt\crt0_c.c undefined reference to `WinMain@16'
Контактная информация:
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1393
Зарегистрирован: Чт авг 21, 2014 11:11:48
Откуда: краснодарский край

Сообщение главный колбасист »

Дошло теперь. У меня при запуске DevC++ вылазит такая хрень.
Что то не так с установкой было.
Вложения
2023-09-30_113916.jpg
(36.7 КБ) 98 скачиваний
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 20117
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

[uquote="главный колбасист",url="/forum/viewtopic.php?p=4483017#p4483017"]такая хрень.[/uquote]
Если нажать Alt+PrtSc, то скопируется только активное (в данном случае маленькое) окошко.
Ну и в данном случае сохранять лучше в формате сжатия без потерь, например, .png
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Друг Кота
Аватара пользователя
Сообщения: 7382
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

У меня ощущение дежавю, так как кажется, я уже задавал подобный вопрос или собирался. Хочется чего-то красивого. Вот есть такая толпа дефайнов:

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

#define I2C_DEV_NUM     1
#define I2C_DEV         I2C1
#define I2C_IRQn        I2C1_IRQn
#define I2C_IRQHandler  I2C1_IRQHandler
#define CMU_CLOCK       cmuClock_I2C1
 
Хотелось бы, чтобы поменяв в первой строчке цифру 1 на другую, в остальных определениях оно тоже поменялось. Я знаю как это сделать передавая аргумент в этот дефайн, наподобие:

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

#define SYNCROUTE(A)    SYNCH ## A ## ROUTE
#define SYNCHxROUTE(A)  SYNCROUTE(A)
....
GPIO->PRSROUTE[0].SYNCHxROUTE(5) = .....
//заменяется на
GPIO->PRSROUTE[0].SYNCH5ROUTE = 
Но для разнообразия, хотелось бы научиться и такой фокус делать. При этом надо еще помнить, что получаемый I2C1 - сам является дефайном.

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

#define I2C1                 ((I2C_TypeDef *) I2C1_BASE)                         /**< I2C1 base pointer */
#define I2C_DEV I2C ## I2C_DEV_NUM - не срабатывает
Ответить

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