整列済みの配列や構造体を二分探索できる関数です。
ただ、結構使い方が面倒なのでメモ。
実際のところ
C言語の標準ライブラリstdlib.hに実装されているものです
Arduino UNOでの使用例
入力値の光センサー値に基づいて、出力としてのLEDの輝度を制御しています
一々場合分けすると死ぬほど面倒ですが、bsearch関数を使えば対応表にあわせてLEDの輝度を変更可能です
久々に魔界実装っぽいのをした気がする
#include <stdlib.h> struct LedMapping { int sensorValue; byte brightness; }; // マッピングテーブル(センサー値でソート済み) const LedMapping LED_MAP[] = { {0, 0}, {200, 64}, {400, 128}, {600, 192}, {800, 255} }; // 比較関数 int compare_mapping(const void* a, const void* b) { const LedMapping* x = (const LedMapping*)a; const LedMapping* y = (const LedMapping*)b; return x->sensorValue - y->sensorValue; } void setup() { pinMode(9, OUTPUT); // LED pin Serial.begin(9600); } void loop() { int sensorValue = analogRead(A0); LedMapping key = {sensorValue, 0}; // 標準ライブラリのbsearch()を使用 LedMapping* result = (LedMapping*)bsearch( &key, LED_MAP, sizeof(LED_MAP)/sizeof(LED_MAP[0]), sizeof(LedMapping), compare_mapping ); byte brightness = result ? result->brightness : 0; analogWrite(9, brightness); delay(100); }