C违约问题

时间:2013-07-15 15:36:00

标签: c

标题含糊不清,但我无法真正想到如何简洁地描述这个问题。这是我的代码:

#include <DigiUSB.h>

// Global
#define NUM_LEDS 2
int defaultReadings[] = {2,2};

void read_usb()
{
    int usbReadings[NUM_LEDS], i, numChars = 0;
    for (i=0;DigiUSB.available();i++)
    {
        usbReadings[i] = DigiUSB.read()-'0';
        numChars++;
    }

    for (i=0;i<numChars;i++)
    {
        if (usbReadings[i] == 0)
            // usbReadings is local, defaultReadings is global
            usbReadings[i] = defaultReadings[i];
        DigiUSB.write(usbReadings[i]+'0');
    }

    memcpy(defaultReadings,usbReadings,sizeof(defaultReadings));
}

因此defaultReadings变量初始化为{2,2}。当available()时,新字符将被读入本地数组usbReadings。

接下来当迭代usbReadings时,如果usbReadings值为零,则该函数应该恢复到该位置的旧条目。 usbReadings的大小总是与defaultReadings的大小相同。

然而,这在实践中并不奏效。代码运行良好并且不会产生任何错误,但它没有按照我的想法进行操作。

以下是通过对read_usb()的四个函数调用进行读写的示例。

  Actual            Intended

Reads:  3,2       Reads:  3,2
Writes: 3,2       Writes: 3,2
Reads:  3,0       Reads:  3,0
Writes: 3,3       Writes: 3,2
Reads:  0,4       Reads:  0,4
Writes: 2,4       Writes: 3,4
Reads:  0,3       Reads:  0,3
Writes: 2,3       Writes: 3,3

正如您在上一个读/写行中所看到的,它有时可以正常工作。在我的代码中你能看到什么东西可以给出这些奇怪的值吗?我已经搞砸了几个小时了,并没有想出这种奇怪行为的理由。

编辑:

我的解决方案

对于任何尝试远程关闭的人,这可能会有所帮助。不幸的是,这是非常具体的案例,但我认为一般的解决方案可以被真正对答案感兴趣的人抽象出来。

最终,我决定将“思考”放在计算机方面。如果你没有收集我的评论或帖子,这段代码就会出现在DigiSpark Arduino上 - 通过USB端口插入计算机的“模拟”。它读取计算机和从计算机读取。而不是让DigiSpark解析零并记住最后一个,我让计算机这样做。

支持这一点的最大原因是DigiSpark的可怕/不存在的调试功能。

1 个答案:

答案 0 :(得分:3)

如果您在第一个循环中只读取一个值,则usbReadings的第二个值将保持未定义但仍会复制到defaultReadings