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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Мудрый кот
Сообщения: 1735
Зарегистрирован: Вт авг 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 однотактные команды). Если конечно в разрядную сетку результаты влезают.
Реклама
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1339
Зарегистрирован: Чт авг 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'
Контактная информация:
Реклама
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1339
Зарегистрирован: Чт авг 21, 2014 11:11:48
Откуда: краснодарский край

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

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

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

[uquote="главный колбасист",url="/forum/viewtopic.php?p=4483017#p4483017"]такая хрень.[/uquote]
Если нажать Alt+PrtSc, то скопируется только активное (в данном случае маленькое) окошко.
Ну и в данном случае сохранять лучше в формате сжатия без потерь, например, .png
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 7360
Зарегистрирован: Пт авг 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 - не срабатывает
Реклама
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32

Сообщение Martian »

если вариантов немного, то можно их перебрать:

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

#define I2C_DEV_1
#ifdef I2C_DEV_1
  #define I2C_DEV_NUM 1
  #define I2C_DEV         I2C1
  #define I2C_IRQn        I2C1_IRQn
  #define I2C_IRQHandler  I2C1_IRQHandler
  #define CMU_CLOCK       cmuClock_I2C1
#endif
#ifdef I2C_DEV_2
  #define I2C_DEV_NUM 2
  #define I2C_DEV         I2C2
  #define I2C_IRQn        I2C2_IRQn
  #define I2C_IRQHandler  I2C2_IRQHandler
  #define CMU_CLOCK       cmuClock_I2C2
#endif
Добавлено after 3 minutes 8 seconds:
может, можно сократить до

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

#define I2C_DEV_NUM 1
#ifdef I2C_DEV_NUM == 1 //если это прокатит
  #define I2C_DEV         I2C1
  #define I2C_IRQn        I2C1_IRQn
  #define I2C_IRQHandler  I2C1_IRQHandler
  #define CMU_CLOCK       cmuClock_I2C1
#elif I2C_DEV_NUM == 2
  #define I2C_DEV         I2C2
  #define I2C_IRQn        I2C2_IRQn
  #define I2C_IRQHandler  I2C2_IRQHandler
  #define CMU_CLOCK       cmuClock_I2C2
#endif
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7360
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

Это не спортивно... на stack overflow нашел такой топик:

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

#define mkstrX(s) #s
#define mkstr(s) mkstrX(s)
#define PROJECT "..\\" mkstr(ID) "_data_var.h"
Но...

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

#define I2C_DEV         "I2C" mkstr(I2C_DEV_NUM)
даёт фигню.. Оно годится для сгенерить строку, а не подсунуть что-то, что еще должно по дефайну раскрыться.
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32

Сообщение Martian »

ну почему ж неспортивно... такое сплошь и рядом.

а так:

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

#define I2C_DEV_NUM     1
#define I2C_DEV         I2C##I2C_DEV_NUM
#define I2C_IRQn        I2C##I2C_DEV_NUM##_IRQn
?
мне самому сейчас не проверить, и никогда не использовал # и ##

Добавлено after 27 minutes 41 second:
[uquote="uldemir",url="/forum/viewtopic.php?p=4488953#p4488953"]#define I2C_DEV I2C ## I2C_DEV_NUM - не срабатывает[/uquote]
а... не заметил.
жаль... и странно, по описанию должен вроде
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 7360
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

Если бы всё было так просто...:

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

../i2c_drv2_emlib.c:49:25: error: 'I2CI2C_DEV_NUM_IRQn' undeclared (first use in this function)
   49 | #define I2C_IRQn        I2C##I2C_DEV_NUM##_IRQn
      |                         ^~~
../i2c_drv2_emlib.c:92:20: note: in expansion of macro 'I2C_IRQn'
   92 |   NVIC_SetPriority(I2C_IRQn, I2C_IRQ_PRI);
      |                    ^~~~~~~~
Оно внутри другого дефайна не раскрывает I2C_DEV_NUM
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32

Сообщение Martian »

ага, я добрался до компилятора и увидел, что просто подставляет имя, зараза...

на https://stackoverflow.com/questions/554 ... efine-in-c предложен вариант двойной обёртки, проверил:

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

#define JOIN(var1, var2) JOIN_(var1, var2)
#define JOIN_(var1, var2) var1##var2

#define I2C1     5

#define I2C_DEV_NUM     1
#define I2C_DEV         JOIN(I2C,I2C_DEV_NUM)
...
a = I2C_DEV; //дебаггер показал 5
Контактная информация:
Мудрый кот
Сообщения: 1735
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="uldemir",url="/forum/viewtopic.php?p=4488953#p4488953"]#define I2C_DEV I2C ## I2C_DEV_NUM - не срабатывает[/uquote]У меня есть пачка макросов:

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

#define concatVOID
#define concat_SUBST2(a, b, c, d, e, f, g, h, i, j, k, l, ...) \
        a##b##c##d##e##f##g##h##i##j##k##l
#define concat_SUBST(...) concat_SUBST2(__VA_ARGS__)
#define concat(...) concat_SUBST(__VA_ARGS__, concatVOID, concatVOID, \
        concatVOID, concatVOID, concatVOID, concatVOID, concatVOID, concatVOID, \
        concatVOID, concatVOID, concatVOID, concatVOID, concatVOID, concatVOID)
Поэтому если бы мне нужно было, то сделал бы так:
#define I2C_DEV concat(I2C, I2C_DEV_NUM)

Если компилятор не поддерживает макросы с переменным числом аргументов, то можно сделать такие:

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

#define concatAB_(a, b) a##b
#define concatABC_(a, b, c) a##b##c
#define concatABCD_(a, b, c, d) a##b##c##d
#define concatABCDE_(a, b, c, d, e) a##b##c##d##e
#define concatABCDEF_(a, b, c, d, e, f) a##b##c##d##e##f
#define concatAB(a, b) concatAB_(a, b)
#define concatABC(a, b, c) concatABC_(a, b, c)
#define concatABCD(a, b, c, d) concatABCD_(a, b, c, d)
#define concatABCDE(a, b, c, d, e) concatABCDE_(a, b, c, d, e)
#define concatABCDEF(a, b, c, d, e, f) concatABCDEF_(a, b, c, d, e, f)
и тогда:
#define I2C_DEV concatAB(I2C, I2C_DEV_NUM)
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Доброго времени суток.
Вопрос по IAR.
Вот синтаксис обработчика прерывания.

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

#pragma vector=vect_num
__interrupt void func(void){}
А какой синтаксис применить, чтобы повесить на несколько векторов один обработчик?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Будете долго смеяться.

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

#pragma vector=vect_num1, vect_num2
__interrupt void func(void){}
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

VladislavS писал(а):Будете долго смеяться.
Не буду ни разу. Не сомневался, что должно быть просто. Интуитивно попробовал так,

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

#pragma vector=vect_num1
#pragma vector=vect_num2
__interrupt void func(void){}
Проект собрался, с ворнингом и не так :)

Ваш вариант самое то, даже в дизассемблере проверил )).
Спасибо. :beer:
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Всем доброго времени суток.

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

struct example
{
    int a;
    int b;
    int c;
};
Чисто гипотетически, на уровне препроцессора, можно определить на каком месте по порядку в структуре находится какой-нибудь из ее элементов?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Встал на лапы
Аватара пользователя
Сообщения: 145
Зарегистрирован: Пн апр 02, 2012 15:56:23

Сообщение azhel12 »

[uquote="Z_h_e",url="/forum/viewtopic.php?p=4531616#p4531616"]Всем доброго времени суток.
Чисто гипотетически, на уровне препроцессора, можно определить на каком месте по порядку в структуре находится какой-нибудь из ее элементов?[/uquote]

ЕМНИП в Си как минимум прямо в стандарте закреплено, что в порядке объявления, в C++ вроде нет, но это надо постараться найти компилятор, который их поменяет местами (стандартные GCC, Clang, MSVC так не делают).

Если нужна 100% гарантия, можно воспользоваться макросом offsetof, который позволяет вычислить смещение поля (ну а дальше сравнить их).
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Порядок элементов компилятор сделает последовательным, однозначно.
azhel12 писал(а):можно воспользоваться макросом offsetof
попробую.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Родился
Сообщения: 16
Зарегистрирован: Пт апр 02, 2021 18:53:28

Сообщение lord99 »

Доброго времени суток. Подскажите где почитать, как сделать плавающую точку для 7 сегментного индикатора. Вот кусок кода где точка после первой цифры (например 9,05),
switch(seg_counter)
{
case 0:
PORTD = ~((SEGMENTE[display % 1000/100])|0x80); // Выводим второй разряд и добавляем десятичную точку
break;
case 1:
PORTD = ~(SEGMENTE[display % 100/10]); // Выводим второй разряд
break;
case 2:
PORTD = ~(SEGMENTE[display % 10]); // Выводим третий разряд
break;
}
if (seg_counter++ > 2) seg_counter = 0;
}
а нужно автоматом поставить после второй, когда будет более 9,99 , то есть 10,1
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32

Сообщение Martian »

Вариантов решения несколько. В Вашем случае проще всего сравнить в каждом случае число, меньше ли оно 10, 100 и 1000
Контактная информация:
Родился
Сообщения: 16
Зарегистрирован: Пт апр 02, 2021 18:53:28

Сообщение lord99 »

[uquote="Martian",url="/forum/viewtopic.php?p=4540593#p4540593"]Вариантов решения несколько проще всего сравнить в каждом случае число, меньше ли оно 10[/uquote]
if(a>b) ... else ...? Но где и как?
Ответить

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