使用预处理器定义的计算产生不正确的值
Calculation with preprocessor-defines yields incorrect value
我很确定这是初学者常犯的错误,但我不知道找到现有答案的正确词语。
我已经定义了一些连续的预处理器宏:
#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
。由于我猜测 was/is 数据类型有问题,我也尝试了 uint32_t temp
。但是,在这种情况下,temp
总是 255
。
// example 2
uint32_t h = millis() + offset - t0 * R / DURATION;
millis()
returns 递增的 unsigned long
值(自开始以来的毫秒数)。这里,h
增加了 4 倍太快了。 unsigned long h
也一样。当我尝试除以 4*DURATION
的变通方法时,h
总是 0
.
是数据类型问题吗?如果没有,我该如何解决?
此代码按预期适用于 Arduino Uno 和 ESP32
#define DURATION 10000
#define NUMPIXELS 60
#define NUMTRANSITION 15
#define UNITS_PER_PIXEL 128
#define R ((NUMPIXELS-1)/2 + NUMTRANSITION) * UNITS_PER_PIXEL
uint32_t t0 = millis();
void setup() {
// put your setup code here, to run once:
Serial.begin (115200);
//Later I use these values to calculate a value and assign it to a variable. Here two examples:
// example 1
randomSeed(721);
}
void loop() {
// For UNO /ESP use uint16_t temp = random(500,10000); // ranges from 500 to 10000
// for ATtiny85 (DigiSpark)
uint32_t temp = random(500,10000); // ranges from 500 to 10000
temp = 255 * (temp - 500) / (10000 - 500);
// Here, temp is always 0. Since my guess was / is an issue with the datatype, I also tried uint32_t temp. However, temp was always 255 in this case.
// example 2
Serial.println(temp);
uint16_t offset = random(2000, 5000);
uint32_t h = millis() + offset - t0 * R / DURATION;
Serial.println(h);
delay (5000); // Only to prevent too much Serial data, never use in production
}
环境 ArduinoIDE 1.8.12/avr 核心 1.8.2 和 ESP32 1.04。
你编译到什么硬件?尝试测试程序,它(至少在被测试的硬件上)做了它应该做的。
编辑:作为参考,OP 使用 Attiny85 (Digispark),其中 var size defs 比 UNO /ESP 更重要 - 而不是 Serial,您将使用 SerialUSB。
给未来支持请求者的提示 -> 由于可能存在硬件特定问题,请始终参考您的微控制器环境(硬件和软件)
我很确定这是初学者常犯的错误,但我不知道找到现有答案的正确词语。
我已经定义了一些连续的预处理器宏:
#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
。由于我猜测 was/is 数据类型有问题,我也尝试了 uint32_t temp
。但是,在这种情况下,temp
总是 255
。
// example 2
uint32_t h = millis() + offset - t0 * R / DURATION;
millis()
returns 递增的 unsigned long
值(自开始以来的毫秒数)。这里,h
增加了 4 倍太快了。 unsigned long h
也一样。当我尝试除以 4*DURATION
的变通方法时,h
总是 0
.
是数据类型问题吗?如果没有,我该如何解决?
此代码按预期适用于 Arduino Uno 和 ESP32
#define DURATION 10000
#define NUMPIXELS 60
#define NUMTRANSITION 15
#define UNITS_PER_PIXEL 128
#define R ((NUMPIXELS-1)/2 + NUMTRANSITION) * UNITS_PER_PIXEL
uint32_t t0 = millis();
void setup() {
// put your setup code here, to run once:
Serial.begin (115200);
//Later I use these values to calculate a value and assign it to a variable. Here two examples:
// example 1
randomSeed(721);
}
void loop() {
// For UNO /ESP use uint16_t temp = random(500,10000); // ranges from 500 to 10000
// for ATtiny85 (DigiSpark)
uint32_t temp = random(500,10000); // ranges from 500 to 10000
temp = 255 * (temp - 500) / (10000 - 500);
// Here, temp is always 0. Since my guess was / is an issue with the datatype, I also tried uint32_t temp. However, temp was always 255 in this case.
// example 2
Serial.println(temp);
uint16_t offset = random(2000, 5000);
uint32_t h = millis() + offset - t0 * R / DURATION;
Serial.println(h);
delay (5000); // Only to prevent too much Serial data, never use in production
}
环境 ArduinoIDE 1.8.12/avr 核心 1.8.2 和 ESP32 1.04。
你编译到什么硬件?尝试测试程序,它(至少在被测试的硬件上)做了它应该做的。
编辑:作为参考,OP 使用 Attiny85 (Digispark),其中 var size defs 比 UNO /ESP 更重要 - 而不是 Serial,您将使用 SerialUSB。
给未来支持请求者的提示 -> 由于可能存在硬件特定问题,请始终参考您的微控制器环境(硬件和软件)