*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/
  今回はちょっと専門的な内容です。
  プログラム未経験の方にはわかりづらい内容になってます。ご容赦ください。
  また、大変な自画自賛が含まれています。
  たまには自分を褒めてあげよう、ということなので、ご容赦ください。
*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/

だいぶ昔になりますが、C言語で作業をすることになった、と書きました。
2007/09/12「久々のC」参照

あれから9ヶ月。
だいぶ勘も取り戻してはいるのですが、まだまだ、戸惑うことが多いです。


特にあの時も書いたけど、文字列の扱い。
引数に渡したり、代入したりするのが面倒なこと!
VBやらPHPやらの癖でついつい、

mojiretu = "おはようございます。";

なんてやってしまいます。あるいは、

if (mojiretu == "こんばんは。") {...}

とかやってコンパイラに怒られる始末。

さらには構造体。

kouzoutai.youso

は新人研修時代に叩き込まれましたが、

p_kouzoutai->youso

なんて、研修中はあんまり使わなかったよー。
(記憶なくなってるだけ?)



さて、今の業務の中で、丸めの処理を行うのですが、
ユーザー様の都合によって、切捨てだったり切上げだったり四捨五入だったりします。

当然if文やswitch文を使って分岐するべきなのですが、

-*-*-*- -*-*-*- -*-*-*- -*-*-*- -*-*-*- -*-*-*-
marume_flg = 0; ←設定によって番号が変わる

// 丸めの設定によって処理を分岐
if (marume_flg == 0) {
  // 切捨ての場合
  marume_kekka = floor(marume_mae);
} else if (marume_flg == 1) {
  // 切上げの場合
  marume_kekka = ceil(marume_mae);
} else {
  // 四捨五入の場合
  marume_kekka = round(marume_mae);
}
-*-*-*- -*-*-*- -*-*-*- -*-*-*- -*-*-*- -*-*-*-

はっと思い出しました、関数配列。

C言語は関数を配列に入れて使うことが出来ます。
だからといってめったやたらにそんな使い方すると、
後で見た人が、いったい何をやっているのか、がわからなくなるので、
あんまり使いません。

でも今回の場合、どうせ設定によってfloorかceilかroundを使い分けるだけじゃん。(※1)
渡すものだっておんなじだし、これくらいならみてる人もわかるだろうから、
使っちゃえ!

・・・使っちゃいました。

// 丸め計算用関数配列
// 関数配列にそれぞれの算出関数を設定しておくことで、分岐を簡略化する
double (*func_marume_ruyo[])(double) = {floor,ceil,round};

marume_flg = 0; ←設定によって番号が変わる

marume_kekka = func_marume_ruyo[marume_flg](marume_mae);

ほら、シンプル!

新人研修の最終課題では、ちゃんと使い方を理解してなくて、ただ意味も無く、
関数を配列に入れてみただけだったけど、あれから7年。
ようやく僕は上手に使えるようになったようです。
どうですか?内藤さん。

(※1)
floor:切捨て(本当は引数を超えない最大の整数)
ceil :切上げ(本当は引数以上の最小の整数)
round:四捨五入。ただしCの標準ではないので自作。