現在、いわゆる組み込み制御の技術者として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;
}
No.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)ファイルのヘッダ部分に書くことで、いざメンテの場合に対象部分(テーブル)をより速く発見し、少しでも作業を短時間で終えることができますね。
bug_bugさん、早速の御回答ありがとうございます。
初心者の低いレベルの質問に真摯に対応いただき感謝いたします。
> それをソースではベタな配列として実装します。
> 実行コードでは演算を行わず、その配列へアクセスすることで様々な
> メリットが享受できます。
配列を使うと簡単に制御することができるのですね。
> サンプル同等のコードをテーブルを使用して記述してみると
サンプルコードの御提供ありがとうございます。
非常に分かりやすくなりますね。
まさに、自分がやらなければならない制御の実現方法が分かった気がします。
> ワンパターンな実装方法ですので、
> テーブルを構造体配列として好きに定義すれば、
> 別の案件でもいろんな状態の管理が後々楽になります。
確かに、このコードだとメンテナンスが非常に楽になりそうです。
> 以下追記ですが、上司殿のおっしゃる言葉は、
> 「ヘッダ(sw_out.cの先頭部分)でテーブルを持って
> Cソース(実行コード上)では簡単なコードにできないか?」
> と私なら解釈します。
多分、bug_bugさんの仰るとおりだと思います。
自分が「ヘッダ」という言葉からヘッダファイル(*.h)と決め付けてしまっただけでCソースファイルのヘッダ部分という解釈が正しいと思います。
細かい点にまで御忠告いただき、非常に分かりやすく御回答を拝見させていただくことができました。
本当に自分のようなレベルの技術者には助かります。
ありがとうございました。
質問させていただいた件については皆様の御協力により解決することができました。
ありがとうございました。
今後もよろしくお願いします。
No.1
- 回答日時:
> ヘッダ(sw_out.h)でテーブルを持って、
> Cソース(sw_out.c)では簡単なコードにできないか?
上司が「テーブル」って言われているので素直に配列(テーブル)を
使えば大幅にコード削減・最適化できると思うのですが・・・
敢えてコードは記しません、ググればすぐ出ます。
また、提示されましたソースを見てもテーブル記述は無く、
テーブルというよりはただの定数宣言のような気がします。
smallinokiさんの言われている「テーブル」の定義が
私の認識と異なるものであれば、的外れですので申し訳ありません。
参考URL:http://www.geocities.jp/ky_webid/c/023.html
lesskeyさん、早速の御回答ありがとうございます。
初心者の低いレベルの質問に真摯に対応いただき感謝いたします。
> 上司が「テーブル」って言われているので素直に配列(テーブル)を
> 使えば大幅にコード削減・最適化できると思うのですが・・・
配列を使うと簡単に制御することができるのですね。
参考URLを拝見させていただきました。
非常に参考になりました。ありがとうございます。
> 敢えてコードは記しません、ググればすぐ出ます。
一応、「C言語」「ヘッダ」「テーブル」等のキーワードでgoogleの検索サイトから検索はしてみたのですが、なかなか自分のレベルでは何万件のなかから自分の知りたい情報にたどり着くことができずに質問させていただいた次第です。今後は知識レベルを上げてこれらの情報から目的のサイトを特定できるようにしていきたいと思います。
> また、提示されましたソースを見てもテーブル記述は無く、
> テーブルというよりはただの定数宣言のような気がします。
申し訳ありません。質問の日本語の表現力不足だったかもしれません。
[sw_out.h]の内容はテーブルを表現したものではなく、自分自身のプログラムをそのまま記したものです。
今後は、質問の日本語も分かり易い記述ができるように表現力向上に努めたいと思います。
質問させていただいた件については皆様の御協力により解決することができました。
ありがとうございました。
今後もよろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- カスタマイズ(車) アンプのハイパス設定 3 2023/05/04 10:32
- スピーカー・コンポ・ステレオ より良いサブウーファーの接続方法を教えて下さい 現行のオーディオシステムは基本的にはCDP→プリ→パ 5 2022/08/24 16:19
- 電気・ガス・水道 電気工事に詳しい方 5 2022/07/28 12:47
- Windows 95・98 Windows11にバージョン アップしました。 2 2023/07/21 18:36
- その他(趣味・アウトドア・車) スフェロスSWと BG のリールどっちがいいと思いますか? 1 2022/12/13 19:13
- CPU・メモリ・マザーボード メモリーを4GBから8GBに変えた方。 13 2022/11/22 16:02
- ホームベーカリー・ホットプレート・圧力鍋 アサヒ軽金属 活力鍋パッキン 1 2022/03/27 22:01
- 国産車 スズキ パレットSW TS 2009年式のターボについて 2 2022/04/01 21:32
- 国産車 パレットSW TS CBA-MK21Sのターボについて 1 2022/04/16 04:10
- 釣り リールについて 19ステラsw 8000hgを購入したのですがハンドルの左右交換はできるのでしょうか 2 2022/05/07 13:01
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ExcelVBAからAccessMDB内のテー...
-
Accessで別mdbのテーブルをコピー
-
『列名 '担当者CD' があいま...
-
ExcelからAccessのテーブルに書...
-
ACCESS2010 実行時エラー 2766
-
DataGridViewに複数テーブルの...
-
ワークテーブルの作成について
-
ADO&mdbで、リンクテーブルの...
-
エクセルのテーブルを解除する...
-
(泣)VBscriptでinnerhtmlを使...
-
SQLを発行とは?クエリの作成と...
-
VB.NET データセットとADOレコ...
-
vb ado → vb2005 ado.net変換
-
VB.NETでのAccessテーブルリンク
-
Access2003VBA リンクテーブル...
-
DataGridの中身をDataSetにテー...
-
AccessからExcelへエクスポート...
-
SQL文の最後に「;」はいら...
-
VBとアクセスでSQL文に変...
-
同一セッションIDのブラウザを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBとアクセスでSQL文に変...
-
Accessで別mdbのテーブルをコピー
-
他のMDBのテーブルに追加したい
-
SQLを発行とは?クエリの作成と...
-
手動または分散トランザクショ...
-
HTMLのテーブルの行数が多くな...
-
エクセルのテーブルを解除する...
-
ExcelVBAからAccessMDB内のテー...
-
Excel複数シートをaccessへ一括...
-
DataGridの中身をDataSetにテー...
-
CSVファイルのエクスポートでソ...
-
AccessからExcelへエクスポート...
-
.net 複数の主キーを設定する方法
-
『列名 '担当者CD' があいま...
-
COBOLのINVALID KEYが理解でき...
-
アクセステーブル、リンクとロ...
-
ACCESSのテーブル名をリストに...
-
MDBテーブルへの追加変更を教え...
-
【ADO】「Execute」を使うと...
-
ACCESS2010 実行時エラー 2766
おすすめ情報