プロが教えるわが家の防犯対策術!

現在、いわゆる組み込み制御の技術者としてC言語によるマイコン制御のソフトウェア開発を行っていて、スイッチの出力を制御する仕組みを考えています。

状態(2状態):S00、S01
スイッチ(2スイッチ):SW1、SW2
出力:ON、OFF

実際には状態もスイッチも出力もこれより多く複雑なのですが、簡単に説明させていただきます。

自分としては簡単にswitch文で制御すればいいだろうと思い、設計していたのですが、それでは無駄にコーディングが必要になってしまうのでダメだと上司に言われ、ヘッダ(sw_out.h)でテーブルを持って、Cソース(sw_out.c)では簡単なコードにできないか?と言われました。その方が後のメンテナンスが簡単だと言われました。

上司の言っていることは分かるのですが、実際にコードとしてどのように記述したらいいのか分かりません。

そこで、このような制御を実現するC言語(*.h,*.c)の記述の方法を分かる方、御教授よろしくお願いします。

以下に、スイッチ出力の判定を行うテーブルと自分の最初の考え方のソースコードを記します。

******S00****S01**
SW0*SW_ON**SW_OFF*
SW1*SW_OFF*SW_ON**

[sw_out.h]
#define S00 0x00 /* 状態0 */
#define S01 0x01 /* 状態1 */
#define SW0 0x00 /* スイッチ0 */
#define SW1 0x01 /* スイッチ1 */
#define SW_OFF 0x00 /* 出力OFF */
#define SW_ON 0x01 /* 出力ON */

[sw_out.c]
#include "sw_out.h"
int sw_out(int state, int sw)
{
int out;
out = SW_OFF;
switch(state){
case S00:
switch(sw){
case SW0:
out = SW_ON;
break;
case SW1:
out = SW_OFF;
break;
}
break;
case S01:
switch(sw){
case SW0:
out = SW_OFF;
break;
case SW1:
out = SW_ON;
break;
}
break;
}
return out;
}

A 回答 (2件)

テーブルと言われても具体的にイメージが沸かない状態だと思いますので、テーブルという言葉から簡単なエクセルの表形式みたいなものを連想すれば良いでしょう。


それをソースではベタな配列として実装します。
実行コードでは演算を行わず、その配列へアクセスすることで様々なメリットが享受できます。

サンプル同等のコードをテーブルを使用して記述してみると

[sw_out.c]
#include "sw_out.h"

#define NSWITCH 2
unsigned char sw_table[][NSWITCH] = {
/* { SW0, SW1 }, */
{ SW_ON, SW_OFF },/* S00 */
{ SW_OFF, SW_ON },/* S01 */
};

int sw_out( int state, int sw )
{
return (int)sw_table[state][sw];
}

スイッチの追加も、状態の追加も、各状態でのスイッチの挙動もテーブルの変更だけで可能です。
メンテの際、実行コードに触れる必要が少ないのもテーブルを使うメリットです。
(他に実行速度や可読性など)

ワンパターンな実装方法ですので、テーブルを構造体配列として好きに定義すれば、別の案件でもいろんな状態の管理が後々楽になります。


以下追記ですが、上司殿のおっしゃる言葉は、「ヘッダ(sw_out.cの先頭部分)でテーブルを持ってCソース(実行コード上)では簡単なコードにできないか?」と私なら解釈します。

「ヘッダファイル(.h)」と「(.c)ファイルのヘッダ部分」の違いですね。
ヘッダファイル(.h)に記述してしまっては、他のモジュールから複数インクルードされた場合、簡単に多重定義のエラーになりますが、(.c)ファイルのヘッダ部分に書くことで、いざメンテの場合に対象部分(テーブル)をより速く発見し、少しでも作業を短時間で終えることができますね。
    • good
    • 0
この回答へのお礼

bug_bugさん、早速の御回答ありがとうございます。
初心者の低いレベルの質問に真摯に対応いただき感謝いたします。

> それをソースではベタな配列として実装します。
> 実行コードでは演算を行わず、その配列へアクセスすることで様々な
> メリットが享受できます。

配列を使うと簡単に制御することができるのですね。

> サンプル同等のコードをテーブルを使用して記述してみると

サンプルコードの御提供ありがとうございます。
非常に分かりやすくなりますね。
まさに、自分がやらなければならない制御の実現方法が分かった気がします。

> ワンパターンな実装方法ですので、
> テーブルを構造体配列として好きに定義すれば、
> 別の案件でもいろんな状態の管理が後々楽になります。

確かに、このコードだとメンテナンスが非常に楽になりそうです。

> 以下追記ですが、上司殿のおっしゃる言葉は、
> 「ヘッダ(sw_out.cの先頭部分)でテーブルを持って
> Cソース(実行コード上)では簡単なコードにできないか?」
> と私なら解釈します。

多分、bug_bugさんの仰るとおりだと思います。
自分が「ヘッダ」という言葉からヘッダファイル(*.h)と決め付けてしまっただけでCソースファイルのヘッダ部分という解釈が正しいと思います。

細かい点にまで御忠告いただき、非常に分かりやすく御回答を拝見させていただくことができました。
本当に自分のようなレベルの技術者には助かります。
ありがとうございました。

質問させていただいた件については皆様の御協力により解決することができました。
ありがとうございました。
今後もよろしくお願いします。

お礼日時:2007/12/16 10:21

> ヘッダ(sw_out.h)でテーブルを持って、


> Cソース(sw_out.c)では簡単なコードにできないか?

上司が「テーブル」って言われているので素直に配列(テーブル)を
使えば大幅にコード削減・最適化できると思うのですが・・・
敢えてコードは記しません、ググればすぐ出ます。

また、提示されましたソースを見てもテーブル記述は無く、
テーブルというよりはただの定数宣言のような気がします。

smallinokiさんの言われている「テーブル」の定義が
私の認識と異なるものであれば、的外れですので申し訳ありません。

参考URL:http://www.geocities.jp/ky_webid/c/023.html
    • good
    • 0
この回答へのお礼

lesskeyさん、早速の御回答ありがとうございます。
初心者の低いレベルの質問に真摯に対応いただき感謝いたします。

> 上司が「テーブル」って言われているので素直に配列(テーブル)を
> 使えば大幅にコード削減・最適化できると思うのですが・・・

配列を使うと簡単に制御することができるのですね。
参考URLを拝見させていただきました。
非常に参考になりました。ありがとうございます。

> 敢えてコードは記しません、ググればすぐ出ます。

一応、「C言語」「ヘッダ」「テーブル」等のキーワードでgoogleの検索サイトから検索はしてみたのですが、なかなか自分のレベルでは何万件のなかから自分の知りたい情報にたどり着くことができずに質問させていただいた次第です。今後は知識レベルを上げてこれらの情報から目的のサイトを特定できるようにしていきたいと思います。

> また、提示されましたソースを見てもテーブル記述は無く、
> テーブルというよりはただの定数宣言のような気がします。

申し訳ありません。質問の日本語の表現力不足だったかもしれません。
[sw_out.h]の内容はテーブルを表現したものではなく、自分自身のプログラムをそのまま記したものです。
今後は、質問の日本語も分かり易い記述ができるように表現力向上に努めたいと思います。

質問させていただいた件については皆様の御協力により解決することができました。
ありがとうございました。
今後もよろしくお願いします。

お礼日時:2007/12/16 10:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!