реклама на сайте
подробности

 
 
> Сделать из дефайна функцию.
Jenya7
сообщение Jun 12 2017, 14:14
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Я запутался. В Линуксе есть дефайн
Код
#define DIV_ROUND_CLOSEST(x, divisor)         \
{                                             \
    typeof(x) __x = x;                        \
    typeof(divisor) __d = divisor;            \
    (((typeof(x))-1) > 0 ||                   \
    ((typeof(divisor))-1) > 0 || (__x) > 0) ? \
    (((__x) + ((__d) / 2)) / (__d)) :         \
    (((__x) - ((__d) / 2)) / (__d));}

Как мне из него сделать С функцию?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
k155la3
сообщение Jun 12 2017, 14:36
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(Jenya7 @ Jun 12 2017, 17:14) *
. . .
Как мне из него сделать С функцию?

Загвоздка с typeof(x). IMHO. Возможно это тоже из специфичных макросов.
Тем более - в С. ОНО скорее подходит для конвертации в шаблон С++.


Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 12 2017, 14:50
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(k155la3 @ Jun 12 2017, 19:36) *
Загвоздка с typeof(x). IMHO. Возможно это тоже из специфичных макросов.
Тем более - в С. ОНО скорее подходит для конвертации в шаблон С++.

да. генерик для эмбедед не получиться. а если аргументы uint32_t ?

так что ли
Код
unsigned int Div_Round_Closest(unsigned int x, unsigned int divisor)        
{                                            
    if ( (x-1) > 0 || (divisor-1) > 0 || (x > 0))
        return (x + (divisor / 2)) / divisor;
    else      
         return (x - (divisor / 2)) / divisor;
}


Сообщение отредактировал Jenya7 - Jun 12 2017, 14:42
Go to the top of the page
 
+Quote Post
k155la3
сообщение Jun 12 2017, 14:58
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(Jenya7 @ Jun 12 2017, 17:50) *
так что ли
. . .


По-моему, не совсем.
Код
. . .
    (((typeof(x))-1) > 0 ||               //   - проверка типа, или его кода
    ((typeof(divisor))-1) > 0            //   - тоже
     (__x) > 0)

Чтобы понять что должно быть - надо откопать кто-есть-ху макрос typeof() или что-оно-там-есть.
Если аргументы фиксированного типа - то это все никчему.


Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 12 2017, 15:05
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(k155la3 @ Jun 12 2017, 19:58) *
По-моему, не совсем.
Код
. . .
    (((typeof(x))-1) > 0 ||               //   - проверка типа, или его кода
    ((typeof(divisor))-1) > 0            //   - тоже
     (__x) > 0)

Чтобы понять что должно быть - надо откопать кто-есть-ху макрос typeof() или что-оно-там-есть.
Если аргументы фиксированного типа - то это все никчему.


я так понимаю в моем случае (unsigned int) все сводиться к return (x + (divisor / 2)) / divisor;
Go to the top of the page
 
+Quote Post
k155la3
сообщение Jun 13 2017, 08:23
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(Jenya7 @ Jun 12 2017, 18:05) *
я так понимаю в моем случае (unsigned int) все сводиться к return (x + (divisor / 2)) / divisor;

Это можно только предположить. Исходя из названия "DIV_ROUND_CLOSEST"
макрос как-то относится к делению, округлению (или его подвиду) и и еще чему-то.
Как гипотеза: округление для плавающих типов в ту или иную сторону, в зависимости от знака.

Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 13 2017, 09:25
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(k155la3 @ Jun 13 2017, 13:23) *
Это можно только предположить. Исходя из названия "DIV_ROUND_CLOSEST"
макрос как-то относится к делению, округлению (или его подвиду) и и еще чему-то.
Как гипотеза: округление для плавающих типов в ту или иную сторону, в зависимости от знака.

то есть как предроложить? тут либо (((__x) - ((__d) / 2)) / (__d)) = (x - (divisor / 2)) / divisor либо нет, какие могут быть варианты.
Go to the top of the page
 
+Quote Post
k155la3
сообщение Jun 13 2017, 09:47
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(Jenya7 @ Jun 13 2017, 12:25) *
то есть как предроложить? тут либо ... либо нет, какие могут быть варианты.

Исходя из имеющейся инф-ии, непонятно, как работает typeof(x), а ОНО фигурирует в условии.

Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jun 13 2017, 10:53
Сообщение #9


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Код
unsigned int Div_Round_Closest(unsigned int x, unsigned int divisor)
{
    return (x/(float)divisor + 0.5f);
}
- это только положительных чисел, а для отрицательных -0,5f надо.

Либо так:
Код
int divRoundClosest(const int n, const int d)
{
  return ((n < 0) ^ (d < 0)) ? ((n - d/2)/d) : ((n + d/2)/d);
}

Подробности тут:
https://stackoverflow.com/questions/2422712...d-of-truncating


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 13 2017, 11:49
Сообщение #10


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(demiurg_spb @ Jun 13 2017, 15:53) *
Код
unsigned int Div_Round_Closest(unsigned int x, unsigned int divisor)
{
    return (x/(float)divisor + 0.5f);
}

- это только положительных чисел, а для отрицательных -0,5f надо.

спасибо. таки надо округлять. только не пойму как divisor сократился?

а. понял.
весь макрос сводиться к округлению результата.

Сообщение отредактировал Jenya7 - Jun 13 2017, 11:59
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Jenya7   Сделать из дефайна функцию.   Jun 12 2017, 14:14
|- - XVR   Цитата(k155la3 @ Jun 13 2017, 12:47) Исхо...   Jun 13 2017, 10:50
|- - ar__systems   Цитата(k155la3 @ Jun 13 2017, 04:47) Исхо...   Jun 13 2017, 12:24
|- - k155la3   Цитата(ar__systems @ Jun 13 2017, 15:24) ...   Jun 13 2017, 13:53
|- - esaulenka   Цитата(k155la3 @ Jun 13 2017, 16:53) Я не...   Jun 13 2017, 15:02
|- - k155la3   Цитата(esaulenka @ Jun 13 2017, 18:02) (1...   Jun 14 2017, 06:29
- - x893   1. Посмотрите что генерирует препроцессор и сразу ...   Jun 12 2017, 23:28
- - ViKo   Когда такое возможно? (typeof(x))-1) > 0   Jun 14 2017, 06:49
|- - megajohn   Цитата(ViKo @ Jun 14 2017, 09:49) Когда т...   Jun 14 2017, 07:09
- - ViKo   То есть, так проверяется, что x беззнакового типа?   Jun 14 2017, 07:39
- - sigmaN   На С++ я бы начал с такой реализации. WARNING...   Jun 14 2017, 12:03


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 22:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.01469 секунд с 7
ELECTRONIX ©2004-2016