2012-10-19 110 views
2

我写了下面的代码,一次点亮一行LED。for循环结束时的延迟

int ledPins[] = {7,8,9,10,11,12,13}; 

void setup() { 
    for (int i = 0; i < sizeof(ledPins); i++) { 
    pinMode(ledPins[i], OUTPUT); 
    } 
} 

void loop() { 
    for (int i = 0; i < sizeof(ledPins); i++) { 
    digitalWrite(i, HIGH); 
    delay(1000); 
    digitalWrite(i, LOW); 
    delay(1000); 
    } 
} 

上述工作正常。然而,在完成for循环之后,重复之前会有很长的延迟(约10秒)。

为什么会有这么长的延迟?这是预期还是与我的代码有问题?

+0

是否应该按顺序闪烁所有LED? –

+0

@JanDvorak是的,它闪烁每个LED的顺序,然后有(不需要的)延迟... – smilledge

+2

如果sizeof'返回大小以字节为单位,并且每个int都不止一个字节,则会闪烁更多的LED是。 –

回答

4

函数sizeof(array)返回内存中数组的大小,以字节为单位。并且因为sizeof(int)可能不是1,所以您会得到比预期更大的值。

sizeof可用于确定数组中元素的数量,方法是将整个数组的大小除以单个元素的大小。

所以这行:

for (int i = 0; i < sizeof(ledPins); i++) { 

应该写成:

for (int i = 0; i < sizeof(ledPins)/sizeof(int); i++) { 

见: http://en.wikipedia.org/wiki/Sizeof

+0

很好的答案,谢谢! – smilledge

+0

@Jan Dvorak。 Arduino不是从C++“派生”的。它使用GCC,这是C++。如果你不相信这会将IDE切换到详细模式,并观察编译器的工作。只有IDE试图通过生成原型来伪装C++编译器(并且做得不好),并且这个库会将主要链接到您的草图,以便您拥有setup + loop而不是main。 –

+0

@UdoKlein对不起,我现在找不到我的原始资源。维基百科和标签wiki现在都是正确的。 –

1

在作为阵中拥有固定的大小很简单做到这一点这种情况下:

#define NO_LEDS 7 

int ledPins[NO_LEDS] = {7,8,9,10,11,12,13}; 

void setup() { 
    for (int i = 0; i < NO_LEDS; i++) { 
    pinMode(ledPins[i], OUTPUT); 
    } 
} 

或者将数组大小的计算移动到一个变量中并使用它。

int ledPins[] = {7,8,9,10,11,12,13}; 
int noLeds; 

void setup() { 
    noLeds = sizeof(ledPins)/sizeof(int); 

    for (int i = 0; i < noLeds; i++) { 
    pinMode(ledPins[i], OUTPUT); 
    } 
} 
+0

#define NO_LEDS 7最好是像const一样unsigned int no_leds = 7;编译后的代码将会是相同的,但您可以通过编译器进行类型检查。 –

+0

关于第二段代码,最好将其计算为一个常量。这是const unsigned int noLeds = sizeof(ledPins)/ sizeof(int);绝对不需要将其作为变量。 –