関数配列
Category: プログラマーNEO
Posted by: Yasuhiro Saeki
*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/
今回はちょっと専門的な内容です。
プログラム未経験の方にはわかりづらい内容になってます。ご容赦ください。
また、大変な自画自賛が含まれています。
たまには自分を褒めてあげよう、ということなので、ご容赦ください。
*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/
だいぶ昔になりますが、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の標準ではないので自作。
今回はちょっと専門的な内容です。
プログラム未経験の方にはわかりづらい内容になってます。ご容赦ください。
また、大変な自画自賛が含まれています。
たまには自分を褒めてあげよう、ということなので、ご容赦ください。
*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/
だいぶ昔になりますが、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の標準ではないので自作。