以下の内容はhttps://shuzo-kino.hateblo.jp/entry/2020/01/16/235854より取得しました。


標準ライブラリ搭載の二分探索 bsearch関数

整列済みの配列や構造体を二分探索できる関数です。
ただ、結構使い方が面倒なのでメモ。

実際のところ

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);
}



以上の内容はhttps://shuzo-kino.hateblo.jp/entry/2020/01/16/235854より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14