[H8-ML(2913)] Re: C++での設計
From: FUJIHARA Keiichi <keiichi@xxxxxxxxxxxxx>
Date: 2003年03月05日(水)12時29分13秒
 藤原と申します。
 えっと、できたら、新しい話題は、(他のメールへの返信では
なくて)新しいメールとして出していただけたらうれしいなとか
思います。

This message is reply to 福井 和敏 - san
(Subject was : [H8-ML(2912)] C++での設計)

Message-ID: <20030305112704.238A.FUKUI.KAZUTOSHI@xxxxxxxxxxx>
in Wed, 05 Mar 2003 11:49:51 +0900 ...


> ここで疑問に思ったのがLEDが接続されるポートをどうやって
> Privateなメンバ変数として宣言し、アドレスを指定すればいいかということです。

一般に、Cの「変数」として、ポートをアクセスするには、

unsigned char *PDR1   = (unsigned char *)0xffd4;
/* MPU 内部レジスタ(P1データ)                   */
struct portDef *P1    = (struct portDef *)0xffd4;
/* MPU 内部レジスタ(P1ビットごとアクセス)       */

の表記で変数に割り当てが可能です。
ここで、 portDef は、

struct portDef
{
  unsigned char b7 : 1;
  unsigned char b6 : 1;
  unsigned char b5 : 1;
  unsigned char b4 : 1;

  unsigned char b3 : 1;
  unsigned char b2 : 1;
  unsigned char b1 : 1;
  unsigned char b0 : 1;
};  

のようにあらかじめ、定義しておきます。

ただ、このポートをプライベートなメンバ変数として持つということの
必然性は若干疑問があります。

特に、LED の点灯/消灯だと実際に使うのはポートの中の1ビットだけだと
思いますが、上記のようにC言語の範囲では、ポートのアドレスを指定する
ことができても、その中のどのビットを割り当てるかは(例えば、コンスト
ラクタの引数としては)指定できません。

また、C++におけるメンバのアクセス制御は、ただ単に、その変数に対す
るアクセス制御なので、この場合、ポートをプライベートなメンバーに割り
当てても現実のポートにはアクセスできてしまいます。

実際に、見当はずれのところでポートに直接値を書き込んでいて、LED の
挙動がおかしい場合に、LED の関数の中を見ても原因はわからないでしょう。

このため、普通はこのレベルは、「LED が具体的にどのポートにつながって
いるかを意識せずにコントロールできる」という意味の情報隠蔽を行うの
が適切だと思います。
そうすれば、LED のつながっているポートが変更になった際に、変更箇所が
よくわかりますから。

そういう意味で、通常の #define によるポート割り当てでも全く問題は
ないと思うわけです。

クラスにまとめるのは、通常はもっと大きな単位にすると良いと思います。
例えば、LED が点灯/消灯するのは、もっと別の意味を表現するための
ものだと思います。
その「意味」を表現するものをクラスにまとめて、その際には、LED を
点灯/消灯させる関数自体が、そのクラスのプライベートなメンバ関数
となるでしょう。

-- 
_/ -- Last 12662 hours until ATHENS 2004 Olympic Games -------------
_/ FUJIHARA Keiichi
_/ E-Mail : keiichi@xxxxxxxxxxxxx <or> nagi@xxxxxxxxxxxxxxx
_/ URL    : http://www.keiichi.fujihara.name/
------------------------------------------+----- Luna Phase  1.90 --
PGP FingerPrint = 7CC3 4F95 8CC7 87D3 7178  C348 CD65 7F08 D68F 69F6


スレッド概略
[2849(R)](起点)
 └[2912(U)]
   └[表示中]
     ├[2914(1)]
     └[2915(2)]


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]