首页 > 解决方案 > 基于布尔值在任一方向循环遍历数组

问题描述

我正在寻找一种基于某些传递的布尔值在任一方向上循环遍历某个数组的方法,其功能与以下内容相同:

void Transfer(bool *_payload, int _size, bool _isLSB)
{
    if (_isLSB)
    {
        for (int i = _size - 1; i >= 0; i--)
        {
            digitalWrite(dataPin, _payload[i]);
        }
    }
    else
    {
        for (int i = 0; i < _size; i++)
        {
            digitalWrite(dataPin, _payload[i]);
        }
    }
}

或者

void Transfer(bool *_payload, int _size, bool _isLSB)
{
    int _index = 0;
    if (_isLSB) _index = _size - 1;
    for (;;)
    {
        printf("%d",_payload[_index]);
        if (_isLSB) _index--;
        else _index++;
        if (_isLSB && _index < 0) break;
        if (!_isLSB && _index >= _size) break;
    }
}

除了创建一个反转数组的方法之外,还有一个很好的简化吗?

标签: c

解决方案


您可以有条件地定义起点和终点以及增量:

void Transfer(bool *_payload, int _size, bool _isLSB)
{
    int increment = _isLSB ? -1 : 1;
    int i = _isLSB ? _size : -1;      // one before the area to scan
    int end = _isLSB ? -1 : _size;    // one past the area

    while ((i += increment) != end)   // incr/decr before testing
    {
        digitalWrite(dataPin, _payload[i]);
    }
}

我们事先不知道索引将以哪种方式更改(递增或递减),因此我们不能在循环条件中使用小于或大于。并且在处理完最后一项之后,索引将再次被修改,因此停止点位于正在处理的区域之后。

同样,我们需要扫描区域前一个位置的起点,以便在递增(或递减)索引后处理有效的第一项。


推荐阅读