Я почти уверен, что это распространенная ошибка новичка, но я не знаю правильных слов для поиска существующего ответа.
Я определил несколько последовательных макросов препроцессора:
#define DURATION 10000
#define NUMPIXELS 60
#define NUMTRANSITION 15
#define UNITS_PER_PIXEL 128
#define R ((NUMPIXELS-1)/2 + NUMTRANSITION) * UNITS_PER_PIXEL
Позже я использую эти значения, чтобы вычислить значение и присвоить его переменной. Вот два примера:
// example 1
uint16_t temp; // ranges from 500 to 10000
temp = 255 * (temp - 500) / (10000 - 500);
Здесь temp
всегда 0
. Так как мое предположение было / является проблемой с типом данных, я также попытался uint32_t temp
. Однако в этом случае temp
всегда было 255
.
// example 2
uint32_t h = millis() + offset - t0 * R / DURATION;
millis()
возвращает возрастающее значение unsigned long
(миллисекунды с момента запуска). Здесь h
слишком быстро увеличивает коэффициент в 4 раза. То же самое для unsigned long h
. Когда я пытался обойти это путем деления на 4*DURATION
, h
всегда было 0
.
Это проблема типа данных? Если или нет, как я могу решить это?