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