c - 基于布尔值在任一方向循环遍历数组
问题描述
我正在寻找一种基于某些传递的布尔值在任一方向上循环遍历某个数组的方法,其功能与以下内容相同:
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;
}
}
除了创建一个反转数组的方法之外,还有一个很好的简化吗?
解决方案
您可以有条件地定义起点和终点以及增量:
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]);
}
}
我们事先不知道索引将以哪种方式更改(递增或递减),因此我们不能在循环条件中使用小于或大于。并且在处理完最后一项之后,索引将再次被修改,因此停止点位于正在处理的区域之后。
同样,我们需要扫描区域前一个位置的起点,以便在递增(或递减)索引后处理有效的第一项。
推荐阅读
- java - Java Runtime -ERR 'fsctl Command not found
- c# - String.Replace() 带有布尔值?
- php - 我如何从对象打印订阅
- elasticsearch - 安装 ElasticSearch APM
- android - How can i set action for whole snackbar layout not just for a text?
- druid - Flush data from Historical Node Memory to Deep Storage
- django - Django 测试:URL 映射到基于类的视图
- c# - WindowService 发送自动短信,但它对我不起作用
- android - BluetoothConnectionService 返回空的 ConnectedThread
- c# - Rx code blocks UI thread?