Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
6 / 6 / 1
Регистрация: 22.12.2011
Сообщений: 134
1

Директива препроцессора в несколько строк

23.12.2013, 15:48. Показов 718. Ответов 9
Метки нет (Все метки)

Подскажите пожалуйста как за дефайнить такую вот функцию
C++
1
2
3
4
5
    float Cosine(float a, float b, float value)
    {
        value = (1 - cos(value * F_PI)) * 0.5f;
        return a * (1 - value) + b * value;
    }
не могу разобраться как записать эту операцию в одно выражение..
мои тщетные попытки увенчались провалом. :<
C++
1
#define Cosine(a, b, value) (value = (1 - cos(value * F_PI)) * 0.5f; a * (1 - value) + b * value;)
Заранее спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.12.2013, 15:48
Ответы с готовыми решениями:

Директива препроцессора #if
Вобще при коспиляции файла взятого с офф сайта микрософт endian.h Получаю вот такие ошибки...

директива препроцессора
Не получается запустить простенькую программу на С++ Borland,вроде сделал все как надо,но выдает...

Директива препроцессора pragma
Добрый день! Помогите, пожалуйста, не могу понять смысл такой записи. (интересуют строки с...

Директива препроцессора define
Объясните пожалуйста, что означает define в Си. Если можно поподробнее и с примером. Знаю только,...

9
Программист
307 / 182 / 176
Регистрация: 05.12.2013
Сообщений: 683
Записей в блоге: 5
23.12.2013, 15:59 2
Я бы так сделал:
C++
1
2
#define VALUE(v) (1-cos((v)*F_PI))*0.5f
#define COSINE(a,b,v) (a)+(VALUE(v))*((b)-(a))
Второе выражение я преобразовал к виду: a+value(b-a), чтобы избавиться от повторяющегося value. При желании можно объединить две директивы в одну, просто вместо VALUE(v) записав выражение из директивы выше.
1
6 / 6 / 1
Регистрация: 22.12.2011
Сообщений: 134
23.12.2013, 16:07  [ТС] 3
Спасибо конечно, но не очень то помогло.. Мне нужен именно 1 дефайн. Поэтому собственно и спросил..
Все эти извращения проворачиваю исключительно в угоду оптимизации, а в случае повторного вызова выражения " (1-cos((v)*F_PI))*0.5f " оно будет работать ещё медленнее чем через вызов функции.. :<
0
║XLR8║
1106 / 853 / 256
Регистрация: 25.07.2009
Сообщений: 4,181
Записей в блоге: 5
23.12.2013, 16:27 4
C
1
2
#define Cosine(a, b, value) \
    ((value = 0.5f * (1 - cos(value * F_PI))), (a) * (1 - value) + b * value)
По идее.
http://lmgtfy.com/?q=c%2B%2B+c... +operators

Добавлено через 8 минут
Цитата Сообщение от Shaman163 Посмотреть сообщение
Все эти извращения проворачиваю исключительно в угоду оптимизации
C++
1
2
3
4
5
void Cosine(const float &a, const float &b, float &result) 
{
    value = (1 - cos(value * 3.14159265)) * 0.5f;
    value = a * (1 - value) + b * value;
}
1
9 / 9 / 3
Регистрация: 09.12.2012
Сообщений: 219
23.12.2013, 16:28 5
Зачем в c++ что то дефайнить? Это же c++ а не c (плохой тон,господа). Используй в тупую вызов своей функции.
1
║XLR8║
1106 / 853 / 256
Регистрация: 25.07.2009
Сообщений: 4,181
Записей в блоге: 5
23.12.2013, 16:29 6
Shaman163, Да, кстати, поиграйся с флагами оптимизации, сейчас компиляторы многое умеют, так что функция может пахать реже дефайна.
0
6 / 6 / 1
Регистрация: 22.12.2011
Сообщений: 134
23.12.2013, 16:39  [ТС] 7
Цитата Сообщение от Warezovvv Посмотреть сообщение
Это же c++ а не c
Видимо я просто ещё слишком зелен, чтобы знать такие штуки
Дефайнить показалось логичным, ибо на ООП не будет затрачен ресурс..
outoftime, Как же мне по вашему гуглить? если я не знал что загуглить..
За ответ большущее спасибо.
0
9 / 9 / 3
Регистрация: 09.12.2012
Сообщений: 219
23.12.2013, 16:43 8
Цитата Сообщение от Shaman163 Посмотреть сообщение
Видимо я просто ещё слишком зелен, чтобы знать такие штуки
Дефайнить показалось логичным, ибо на ООП не будет затрачен ресурс..
outoftime, Как же мне по вашему гуглить? если я не знал что загуглить..
За ответ большущее спасибо.
вместо дефайн давно есть inline функции.
1
║XLR8║
1106 / 853 / 256
Регистрация: 25.07.2009
Сообщений: 4,181
Записей в блоге: 5
23.12.2013, 16:45 9
Shaman163, http://mmcs.sfedu.ru/~ulysses/... g_gcc.html раздел "Оптимизация" флаг -O3
Наиболее «агрессивная» оптимизация, включаются развертку циклов и автоматическое встраивание функций.

Искать "флаги оптимизации" и их описание
1
Программист
307 / 182 / 176
Регистрация: 05.12.2013
Сообщений: 683
Записей в блоге: 5
23.12.2013, 18:35 10
Цитата Сообщение от Shaman163 Посмотреть сообщение
Мне нужен именно 1 дефайн.
Так я вам объяснил, как их в один объединить:

C++
1
#define COSINE(a,b,v) (a)+((1-cos((v)*F_PI))*0.5f)*((b)-(a))
Добавлено через 1 минуту
Цитата Сообщение от Shaman163 Посмотреть сообщение
а в случае повторного вызова выражения " (1-cos((v)*F_PI))*0.5f " оно будет работать ещё медленнее чем через вызов функции
Вы вообще читали мои пояснения? Никакого повторного вызова не будет, потому как ваше выражение сводится к a+value*(b-a).
2
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.12.2013, 18:35

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Сделать переход по кнопке от первой формы ко второй. Ожидается директива препроцессора
ребят, в чем ошибка? #include&lt;test2&gt; // - error CS1024: Ожидается директива препроцессору ...

Использование препроцессора для генерации строк
Здрям! Грубо говоря, есть макрос, например: #define COUNT 8 И есть строка, которая должна...

Записать в файл несколько строк, а затем записать несколько строк из этого файла в другой
Заранее создать текстовый файл 1.txt и записать в него несколько строк текста. Программа должна...

Директивы препроцессора Составить программу, использующую директивы препроцессора
1) Задать константы M1,M2,...,M5 и вычислить M1+ 2M2 + 3M3 + 4M4 + 5M5 2) С помощью директив #if,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.