Russian Qt Forum
Май 17, 2024, 03:47 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Операторы для C структуры  (Прочитано 14334 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Сентябрь 05, 2015, 13:13 »

Добрый день

Есть хедеры либы на С, там объявлена такая структура
Код
C++ (Qt)
typedef union {
unsigned int value;
struct {
 unsigned char a, r, g, b;
} argb;
} Color;
В пучине уже моих темплейт есть такое
Код
C++ (Qt)
T c1, c2;
float weight;
...
return c1 * (1 - weight) + с2 * weight;
Конечно при попытке инстанциации T = Color это не компилится т.к. для структуры Color нет нужных операторов. Как это порешать?

Спасибо 
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #1 : Сентябрь 05, 2015, 13:50 »

Цитировать
Конечно при попытке инстанциации T = Color это не компилится т.к. для структуры Color нет нужных операторов. Как это порешать?
Написать перегрузку для этих операторов?)

Код
C++ (Qt)
const Color operator*(Color c, float x)
{
   ...
}
 
const Color operator*(float x, Color x)
{
   ...
}
 
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Сентябрь 05, 2015, 14:37 »

Написать перегрузку для этих операторов?)
Но uchar не может хранить float.
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #3 : Сентябрь 05, 2015, 14:43 »

А 4 uchar'а ?)

Или я чего то не понимаю?)
« Последнее редактирование: Сентябрь 05, 2015, 14:55 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #4 : Сентябрь 05, 2015, 15:44 »

Или я чего то не понимаю?)
Конечно не понимаете, никто не понимает. Все нормально. Улыбающийся

Но uchar не может хранить float.
В точку. Ну и что? Как это соотносится с оператором умножения?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Сентябрь 05, 2015, 15:58 »

А 4 uchar'а ?)

Или я чего то не понимаю?)
Пример: даны 2 белых цвета argb = (255, 255, 255, 255) которые должны быть смешаны с весом 0.5 (т.е. среднее). Создавая операторы арифметики Color получаем (254, 254, 254, 254) - неверно.

Да, для простоты считаем что альфа всегда 255 (прозрачности нет) 
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #6 : Сентябрь 05, 2015, 16:06 »

Цитировать
Пример: даны 2 белых цвета argb = (255, 255, 255, 255) которые должны быть смешаны с весом 0.5 (т.е. среднее). Создавая операторы арифметики Color получаем (254, 254, 254, 254) - неверно.
Ну мы это уже проходили.. То что там будет под капотом этих опереторов это, как уже заметил Old, совсем другой вопрос.)

Я бы  вообще не вводил арифметику для таких объектов, как color.. Дабы людей не смущать)
Лучше написать набор функций с говорящими названиями, имхо) 
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #7 : Сентябрь 05, 2015, 16:09 »

Отлично подобранный раздел для вопроса, ну как всегда. Улыбающийся
Сложение мы проходили в 2010 и 2013 году:
http://www.prog.org.ru/topic_14700_0.html
http://www.prog.org.ru/topic_24054_0.html
сейчас дошли до умножения. Улыбающийся

Пример: даны 2 белых цвета argb = (255, 255, 255, 255) которые должны быть смешаны с весом 0.5 (т.е. среднее). Создавая операторы арифметики Color получаем (254, 254, 254, 254) - неверно.
Тут, конечно, стоили бы сразу спросить, а как это посчитать правильно, с вашей точки зрения. Но мы развлекаемся, поэтому сразу предложу так:
Код
C++ (Qt)
const Color operator*( Color c, float x )
{
   Color res;
   res.argb.r = float( c.argb.r ) * x;
   res.argb.g = float( c.argb.g ) * x;
   res.argb.b = float( c.argb.b ) * x;
   return res;
}
 
 
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Сентябрь 05, 2015, 16:29 »

Я бы  вообще не вводил арифметику для таких объектов, как color.. Дабы людей не смущать)
Лучше написать набор функций с говорящими названиями, имхо)  
А так и есть - но это место в template коде (см первый пост)

Ну мы это уже проходили.. То что там будет под капотом этих опереторов это, как уже заметил Old, совсем другой вопрос.)
Под капотом я разберусь. Сделал класс
Код
C++ (Qt)
struct rgbF {
friend rgbF operator + ( const rgbF & c, const rgbF & c );
 
float r, g, b;
};
 
И еще определил оператор
Код
C++ (Qt)
rgbF operator * ( const Color & c, float t );
Теперь все выражение интерполяции (c1 * (1 - weight) + с2 * weight) проходит, но рез-т rgbF, а вернуть я должен Color. Как это сделать? (про темплейт код не забывайте  Улыбающийся)
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #9 : Сентябрь 05, 2015, 16:52 »

Под капотом я разберусь.
Не похоже. Ваш вопрос как раз от туда. Улыбающийся
Вам нужно уметь скалить значения флотов в пространство uchar.
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #10 : Сентябрь 05, 2015, 17:16 »

Цитировать
Вам нужно уметь скалить значения флотов в пространство uchar.
Не, не, я, кажется, начинаю прозревать  Улыбающийся


Цитировать
Теперь все выражение интерполяции (c1 * (1 - weight) + с2 * weight) проходит, но рез-т rgbF, а вернуть я должен Color. Как это сделать?
Т.е. сейчас есть, например, такая шаблонная функция:

Код
C++ (Qt)
template <class R, class T>
R some_color_function(T clr1, T clr2);
 
 

Если она принимает и возвращает rgbF то всё ok? А если принимает Color, то не ok?
А надо чтоб по всякому работало, так?
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #11 : Сентябрь 05, 2015, 17:24 »

m_ax, я еше раз просмотрел тему... и совсем перестал понимать, в чем проблема. Улыбающийся
Может Igors обеспечить интригу в своих темах... подождем, думаю новые подробности нас удивят. Улыбающийся
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #12 : Сентябрь 05, 2015, 17:32 »

Цитировать
Может Igors обеспечить интригу в своих темах... подождем, думаю новые подробности нас удивят.  Улыбающийся
Угу) Товарищ igors - это как генератор случайных чисел - надо статистику набрать)
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #13 : Сентябрь 05, 2015, 18:45 »

Если она принимает и возвращает rgbF то всё ok? А если принимает Color, то не ok?
А надо чтоб по всякому работало, так?
Ну да. Есть выражение аргументы которого (c1 и c2)  template типы
Код
C++ (Qt)
return c1 * (1 - weight) + с2 * weight;
Один из типов - допотопный Color. Просто создать для него операторы не выходит - при вычислениях потеряется точность, да и вообще в каких-то случаях возможен weight > 1. Поэтому "внутри выражения" надо использовать др класс, флотовый. Шо неясно?

Угу) Товарищ igors - это как генератор случайных чисел - надо статистику набрать)
Если руки свисают ниже колен - значит "короткие ноги" (а не "длинные руки"  Улыбающийся)
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #14 : Сентябрь 05, 2015, 18:54 »

Ну все один к одному. Улыбающийся

Шо неясно?
Перечитайте ваш вопрос, да и весь тред, там про эти чудеса где нибудь написано? Улыбающийся

Специализируйте эту функцию для Color, и в ней меняйте тип на нужный, а после вычисления переводите результат в Color.
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.339 секунд. Запросов: 22.