藤原と申します。
えっと、できたら、新しい話題は、(他のメールへの返信では
なくて)新しいメールとして出していただけたらうれしいなとか
思います。
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