タイトルをどう書いてよいか分からなかったので
あいまいなタイトルになってしまって申し訳ないです。
見て頂き有難う御座います。
どちらかと言えばCプログラミングのノウハウについて質問です。
ある構造体定義があります。
typedef struct _A{
int a;
int b;
}A;
これを以下のように定義し直し、ユーザには
Bの名前で公開させたいと考えています。
typedef A B;
なぜかと言うと、Aはハード寄りの定義の為、
ハードの定義名を意識させない為にBの名前にした方が分かりやすいと
考えた為です。
このような実装により、分かりやすくなりますでしょうか?
また、他に理想的な実装方法はありますでしょうか?
よろしくお願い致します。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
No.1 です。
今後ハードウエアの変更が予想されるのであれば、typedef のような直接の割り当ては危険です。
それこそ、理想は、論理的な層での関数を準備して、その関数の定義以外の場所では、A の存在を見えなくすることです。
そうすれば、LEDの色数が増えても、それまでのプログラムは変更しなくてすみます。
たとえば、ハードウエアの機能が加わることで、物理的な割り当ての順序は簡単に変わってしまいますから。
オーバーヘッドの関係で関数をかぶせられない場合でも、型名をいじるのではなく、適切な変数名と、その後で、必要があれば、ポートの変換をしたほうがいいでしょう。
そうすれば、データ定義の段階で、(見えるにしても)どのポートにLEDが割あたっているのかわかります。
単純にLEDを制御するのなら、
struct port
{
unsigned b0: 1;
unsigned b1: 1;
unsigned b2: 2;
};
に対して、
struct port LED_No1 = (ポートアドレスの割り当てなど)
という定義で、
LED_No1.b0 = 0; で赤くなったり、
LED_No1.b1 = 1; で緑になったり
とかですね。
さらにわかりやすくすのであれば、
#define RED b0
#defien GREEN b1
#define ON 0
#define OFF 1
で、
LED_No1.RED = ON;
LED_No.1.GREEN = OFF;
など。
なるほどとても参考になりました。
オーバーヘッドはそれ程制限が厳しいわけではないので
教えて頂いたイメージで関数をかぶせて実装してみたいと思います。
丁寧に説明して頂きありがとうございました。
質問の締め切りはもう少し時間をあけてから行いたいと思います。
No.1
- 回答日時:
ただ単に、ハードよりの名前を意識させないために、名前を変えるというのは、あまり意味がない気がします。
逆に懸念されるべき事が。
ハードよりの名前と、よりわかりやすい名前というのが考えられるということは、ハードウエアの要素(例えば、具体的なポート番号)と、ユーザーインターフェースの要素(例えば、LEDの色など)という考え方があるということだと思います。
そして、今は、たまたま、それらが、特定の構造体を通じて密接に関わっているということになります。
ケース1:今後ハードウエアの変更などが考えらる場合
このとき、ハードウエアの要素と、ユーザーインターフェースの要素の関係が壊れる可能性があります。この場合、構造体はどちらの要素に併せて変更すべきなのでしょうか?
ハードウエアの構成に併せて変更したとして、LEDの色とアンマッチになるかも知れません。
しかも、プログラムの中では、別の名前の構造体を経由して、「正しい色」を制御しているとしたら、なぜ、目的の色が制御できないのか、判断に困るかも知れません。
ケース2:今後ハードウエアの変更などが「絶対に」ない場合
この場合、はじめから、Aを定義せずに、Bを使うというのも方法だと思います。
一般的にいえば、ユーザーから、ハードウエアを隠す場兄は、ユーザーインターフェースの層と、ハードウエアの層を分離することが考えられます。
ただ、少なからず、オーバーヘッドが発生するので、それとのかねあいになりますが。
例えば、ハードウエアのポートがあって、それに、LEDがつながっているとすれば、ユーザー側には、LED を制御するための関数だけを提供します。
具体的な、ハードウエアへのアクセスはその関数の中だけで行うわけです。
そうすれば、ハードウエアの変更があっても、プログラムの変更は最低限ですみます。
構造体などのデータに直接アクセスする場合でも、今回の例では、ハードウエア側には、構造体のAを、ユーザー側には、構造体Bを別々に定義します。(内容は同じになりますが)
そして、プログラムからは、
1)構造体Bのデータにアクセスして、設定を行う
2)構造体Bをもとに、ハードウエアを制御するための関数を準備して、それを呼び出してもらう。今回の例では、構造体Bから構造体Aへの単純な代入になりますが。
のようにします。
※設定値を読み出す必要があれば、逆の手順になります。
これは、ユーザー側の目的(LEDを点灯させるなど)と、ハードウエアの働き(特定のポートを ON/OFF するなど)を分離するということでもあります。
C++などで、「オブジェクト指向」をすると、このあたりが、もっとスマートに記述できるようになりますが。
この回答への補足
とても丁寧な回答ありがとうございました。
質問文の中で1点訂正なのですが、構造体Aの定義は
自担当コードではなく、includeしているハードウェア側の定義です。そして、例えばLEDだとした場合、今後色数が増える可能性があります。
やはりtypedefA B;が無難なやり方ですかね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語 構造体の中に共用体を定...
-
VBAのプログラムで、DIAG = 1# ...
-
Integer変数をカラにしたいので...
-
「#undef」と「#define」の使い...
-
VBAにてcolorindexを変数に格納...
-
条件によって構造体のリスト構...
-
命名規則 VB 構造体
-
値が変わるのはどうしてでしょ...
-
C++ 構造体の一括初期化 {0}
-
enum宣言と列挙変数の初期値に...
-
ローカル変数の多重定義
-
構造体の代入と比較
-
構造体の継承?再定義?
-
VBAの変数のデータ型を変更する...
-
関数の引数の順番の混乱を回避...
-
C言語のキャストについて
-
構造体の後半をクリアするには?
-
関数から配列を返すには?
-
ExcelVBAで質問です。離れた二...
-
void*型のデータサイズ
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAのプログラムで、DIAG = 1# ...
-
Integer変数をカラにしたいので...
-
C++ 構造体の一括初期化 {0}
-
「#undef」と「#define」の使い...
-
構造体のデータを丸ごとコピー...
-
C言語 構造体の中に共用体を定...
-
VBAにてcolorindexを変数に格納...
-
値が代入されてない時
-
typedefをプログラム中で解除す...
-
VBAの変数のデータ型を変更する...
-
long型のデータをバイト型の配...
-
異なる構造体のデータのコピー
-
charとucharの違い
-
整数から16進数への変換 現在c...
-
構造体のポインタにNULLが入らない
-
日付チェック関数について
-
VBAで符号無し整数
-
ユーザー定義型変数の一括初期化
-
値が変わるのはどうしてでしょ...
-
命名規則 VB 構造体
おすすめ情報