以下代码可以很好地编译,并且可以在模拟器中无限期运行。这是一些基于输入电压来控制远程键盘的代码的开头。
我已将导致“挂起”条件的行隔离到下面的注释中。注释掉该行会导致代码无限期地运行(LED永远持续闪烁)。将该线留在里面会使LED在大约3个开/关周期后停止闪烁。
serial.writeLine("Hello World");
const keyMap = [
{ 8: "1", 87: "2", 155: "3", 214: "A" },
{ 256: "4", 302: "5", 342: "6", 379: "B" },
{ 406: "7", 435: "8", 462: "9", 487: "C" },
{ 507: "*", 528: "0", 547: "#", 565: "D" }
];
const FLASH_TIMEOUT = 10;
let flashTimer = FLASH_TIMEOUT;
basic.forever(function () {
for (let row: number = 0; row < keyMap.length; row++) {
let values: Object = keyMap[row];
// the next line causes the crash
let targets: string[] = Object.keys(values); // <--- BOOM
// for (let col: number = 0; col < targets.length; col++) {
// }
}
flashLED();
});
function flashLED() {
if (--flashTimer < 1) {
flashTimer = FLASH_TIMEOUT;
led.toggle(4, 4);
}
}
我正在寻找为什么这行导致micro:bit硬件挂起的答案?我知道从简单的switch语句开始,我可以采用多种方法来构造此代码。我的内存不足了吗?为什么只在几个周期后才发生?
我是这个平台的新手,无法找到有关此类错误情况的任何信息。
在这种情况下,似乎行本身不是问题。
let keyMap = [
{ 8: "1", 87: "2", 155: "3", 214: "A" },
{ 256: "4", 302: "5", 342: "6", 379: "B" },
{ 406: "7", 435: "8", 462: "9", 487: "C" },
{ 507: "*", 528: "0", 547: "#", 565: "D" }
];
keyMap.forEach(
(el, i) => {
let values= keyMap[i];
let targets= Object.keys(values);
console.log(targets);
})