#c
#c
Вопрос:
У меня есть шестнадцатеричный цвет, такой как 0xaabbcc в качестве uint32_t, и я хочу извлечь отдельные компоненты RGB, поэтому я хочу 0xaa, 0xbb и 0xcc. Вот как я это делаю:
uint32_t color_hex = ((uint32_t)0xaabbcc);
uint8_t red = (uint8_t)((color_hex &&t;&&t; 16) amp; 0xFF);
uint8_t &reen = (uint8_t)((color_hex &&t;&&t; 8) amp; 0xFF);
uint8_t blue = (uint8_t)(color_hex amp; 0xFF);
// Then I'm doin& an i2c write with red, &reen and blue where the function accepts a uint8_t
i2c_write(<addr&&t;, <re&&&t;, amp;red);
i2c_write(<addr&&t;, <re&&&t;, amp;&reen);
i2c_write(<addr&&t;, <re&&&t;, amp;blue);
Значения red, &reen и blue не равны 0xaa, 0xbb и 0xcc соответственно. Я получаю 0xcd, 0xce и 0xcf. Кто-нибудь может мне помочь?
Комментарии:
1. у вас слишком много ненужных приведений и круглых скобок
2. @phuclv это не должно влиять на то, почему мои значения неверны, хотя
3. конечно, я знаю. Вот почему это просто комментарий, чтобы отметить, что это значительно снизит читаемость для более сложного кода. В любом случае вам следует добавить информацию об используемой вами платформе, потому что
i2c_write
функция, которую я нашел, не получает 3 подобных параметра
Ответ №1:
Проблема заключается в том, как вы используете i2c_write
функцию.
Вы говорите, что он принимает at uint8_t
, но передаете uint8_t *
в качестве аргумента.
Вместо
i2c_write(<addr&&t;, <re&&&t;, amp;red);
вы должны сделать
i2c_write(<addr&&t;, <re&&&t;, red);
Было бы разумно, чтобы три значения, которые вы получаете, были произвольными, но являлись последовательными числами, поскольку red
, &reen
и blue
, скорее всего, хранятся в виде отдельных смежных байтов.
Предполагая, что функция правильно объявлена с аргументами, указатель усекается до младшего байта.
Предполагая, что функция объявлена с аргументами, я бы ожидал, что компилятор выдаст предупреждение / ошибку по этому поводу, передав целое число в качестве аргумента функции-указателя. Если нет, вам следует увеличить уровень предупреждений, выдаваемых вашим компилятором. Всегда обращайте внимание на предупреждения компилятора.
Комментарии:
1. Привет, спасибо за ваш ответ. Я изменил его на use
i2c_write(<addr&&t;, <re&&&t;, red);
, но значение по-прежнему неверное: (2. @innyme Какие значения вы получаете сейчас? Этого достаточного изменения, чтобы результат был совершенно другим.
3. Извините, я забыл изменить свой цвет обратно на тот, который я на самом деле использую вместо aabbcc, который выглядит как белый. Это решило проблему — большое вам спасибо!