Перейти к содержанию
    

Препроцессор ведёт себя неоднозначно. Как это понять?

О какой архитектуре речь идёт? У IAR для ARM с С++17, а соответственно и с вычислениями на этапе компиляции, уже очень даже терпимо. Остальные архитектуры сильно запаздывают в этом плане.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

22 minutes ago, VladislavS said:

О какой архитектуре речь идёт? У IAR для ARM с С++17, а соответственно и с вычислениями на этапе компиляции, уже очень даже терпимо. Остальные архитектуры сильно запаздывают в этом плане.

Да, сорри, сразу не указал. Речь про AVR. Меги простейшие  - 8515, 16А, и т.д.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Расчеты frequency tuning word для разнообразных DDS (формула напомнила) вполне работают на базе 64-разрядных целых (uint64_t например).

Даже на AVR.

/* функция преобразования требуемой частоты в FTW при заданной тактовой частоте DDS */
/* divider - это делитель опорной частоты перед DDS, умноженный на делитель выходной частоты ЗА DDS. */
static ftw_t 
freq2ftw(uint_fast32_t freq, uint_fast16_t divider, uint_fast64_t ddsosc)
{
    const uint_fast64_t d = (uint_fast64_t) divider << FTW_RESOLUTION;
    return (freq * d) / ddsosc;
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 часов назад, x893 сказал:

#define FREQ_COEFF ((1 << 32) / FCLK)

нельзя ?

Нельзя. Надо #define FREQ_COEFF ((1ull << 32) / FCLK)  :wink2:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

42 минуты назад, GenaSPB сказал:

Расчеты frequency tuning word для разнообразных DDS (формула напомнила) вполне работают на базе 64-разрядных целых (uint64_t например).

    const uint_fast64_t d = (uint_fast64_t) divider << FTW_RESOLUTION;

Интересно: зачем тут const:unknw:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 часа назад, jcxz сказал:

#define FREQ_COEFF ((1ull << 32) / FCLK)

Господа, я конечно понимаю, выходные и всё такое, но почему <<32 ???

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 hours ago, jcxz said:

Нельзя. Надо #define FREQ_COEFF ((1ull << 32) / FCLK)  :wink2:

Это понятно что ULL. Я для примера написал только.

Можно и ((uint64_t)1) << 32

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 hours ago, jcxz said:

 зачем тут const?

Для программиста. Или для "красоты".

 

При целочисленной вычисление отдельного множителя не годится. Только формулой с требуемой частотой. А то слишком падает точность.

Изменено пользователем GenaSPB

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, x893 сказал:

Это понятно что ULL. Я для примера написал только.

Можно и ((uint64_t)1) << 32

Можно для чего? Мне кажется Вы плохо разбираетесь в обсуждаемом вопросе. Между:

#define FREQ_COEFF ((1ull << 32) / FCLK)

и

#define FREQ_COEFF (((uint64_t)1 << 32) / FCLK)

огромная разница. Первое - более универсально, чем 2-е. Второе во многих случаях применять нельзя. Изучайте си чтобы узнать почему!

И не зная куда автор потом использует это своё FREQ_COEFF ваш вариант там может не работать. Мой будет работать везде.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

23 minutes ago, jcxz said:

Можно для чего? Мне кажется Вы плохо разбираетесь в обсуждаемом вопросе. Между:

#define FREQ_COEFF ((1ull << 32) / FCLK)

и

#define FREQ_COEFF (((uint64_t)1 << 32) / FCLK)

огромная разница. Первое - более универсально, чем 2-е. Второе во многих случаях применять нельзя. Изучайте си чтобы узнать почему!

И не зная куда автор потом использует это своё FREQ_COEFF ваш вариант там может не работать. Мой будет работать везде.

Что бы ТС понял что кроме pow() есть обычный способ. А ULL в конце или uint64_t это уже только профессионалы программирования объясняют.

Такие мелочи самому нужно понимать. Буду учить, учить, и учить С, а то за 30 лет еще не всё выучил.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 часов назад, jcxz сказал:

огромная разница. Первое - более универсально, чем 2-е.

Интересно узнать. Объясните. На полном серьезе. Не считая того, что ull на какой-то платформе может оказаться меньше 64 бит. В чем большая универсальность?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

22 минуты назад, Сергей Борщ сказал:

Интересно узнать. Объясните. На полном серьезе. Не считая того, что ull на какой-то платформе может оказаться меньше 64 бит. В чем большая универсальность?

Константу полученную по 1-му варианту можно использовать внутри выражений директив препроцессора, тех которые требуют вычисления выражения. Например: #if, #elif.

Константу из 2-го варианта там использовать нельзя.

Т.е. - при первом варианте #if FREQ_COEFF > 10 препроцессор нормально слопает. При 2-м варианте выдаст ошибку компиляции.

И далее - все остальные макросы порождённые из FREQ_COEFF станут также неприменимы в #if если само FREQ_COEFF будет неприменимо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 часов назад, jcxz сказал:

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

Понятно. да, не подумал. Тогда ловлю вас на противоречии самому себе :blum:

В 15.06.2019 в 13:16, jcxz сказал:

Препроцессор всегда выполняет только текстовую подстановку.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно посмотреть текст после препроцессора и понять, что идет в компилятор.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...