C言語 プログラミング

【C言語】定数配列について(やってはいけない例)

更新日:

c_const_array_161004

戒めのための覚書。

最近、疲れると三葉の画像をネットで探す日々・・・。BDはよщ(゚д゚щ;)
【映画】「君の名は。」 おっさん目線の感想みたいな変な記事(ネタバレ「ほぼ」なし / もう一回見たい!)

 

スポンサーリンク

AdSense_336px

 

アホ過ぎる過ち

昔組んだCのプログラムを久しぶりに読んでみると配列を宣言する際に下記のような書き込んでいた。

 

しかも、よりにもよってこのプログラムはマイコン用だという有り得ない真実!!

 

間違いを認識する。

取り敢えず、間違っているとは言え、上記コードがやりたいのは『グローバルな定数配列を宣言し、各ソースファイルで共有したい』。

 

間違い①:「static」の意味がわかってない。

本来、staticを使用すると指定された変数や関数のスコープが宣言されたソースファイル内に限定される。

 

例えば、下記の用に宣言した変数「value」がhoge.c内ではtasuとhikuの両方で使えるグローバル変数となるがmain.cのでは使えない。

 

間違い②:ヘッダファイルにグローバル変数を宣言。

ヘッダファイルに変数を宣言するということは、このヘッダをインクルードしたソースにそれぞれ変数の実体が作成されるということ。

 

下記のようにhoge.cとmain.cで使用しているvalueは全くの別々の変数として各ソースコードに実体が作成され、片方で値が変わろうが何されようが、もう片方では知ったことではない。

 

 

正しいやり方

外部に公開したいグローバル変数にはextern宣言を使用する。下記のように、hoge.cに宣言した「value」をhoge.hにextern宣言で追記する。

 

こうすることで、hoge.hをインクルードしたソースファイルには「valueというグローバル変数が他の場所で宣言されていて使えるよ。」という認識になり、hoge.cとhogehoge.cの「value」は同じ変数という認識になる。

 

本題に戻り『定数配列』を宣言する場合でも同じで、例えば下記のようにhoge.cに「ARRAY」というconst配列を宣言し、hoge.hにextern宣言で追加する。

 

こうすることで、hoge.hをインクルードしたソースファイルにも「ARRAY」という定数配列が使用でき、かつ実体はhoge.cに一つだけなので、無駄な容量も食わない。

 

配列数を取得する場合の注意

配列を宣言する際、配列数を省略できるため配列内部の初期値が決まっている定数配列の場合は配列数を書かないことが多い。

 

extern宣言時にも省略は可能だが、この場合extern宣言で変数を認識してるソースファイルからは、sizeofで配列数を読み取ろうとするとエラーが発生する。

 

解決手段としては、単純にextern宣言時も配列数を記入すればいいだけ。実体のあるソースファイル側は省略できるが、バラバラに書くのはいただけないので、両方配列数を省略せずに記入することをおすすめする。

 

反省

今でも本当に恥ずかしい。マイコンの容量が圧迫されるほどの大きい実装内容でじゃなかったのが唯一の救い。

 

プログラミングの勉強を始めたばかりの初心者の人や独学で勉強している人は、参考書とにらめっこしているだけなく実際にコードを書いて、書いて、書いて、書いて、書いてとことん書いて勉強して下さい。それが一番の勉強方法です。

 

そして、どうしても分からない部分は素直に人に聞きましょう。今はQ&Aのサイトがいっぱいありますが、中にはエンジニア向けに特化したQ&Aサイトがあるので利用してみては?無料のサービスなのでガンガン使いましょう。いまだに私も質問しまくりですからねぇ・・・(-_-;)

 

『独学だとモチベーションが・・・』という人や『手っ取り早く基礎を習得したい!』という人は、今はオンラインで学習できるサービスがあるので活用してみては如何でしょうか?無料体験もあるし、何事も経験かな?

 

 

宜しければポチッとお願いします。

 

AdSense_336px

AdSense_336px

-C言語, プログラミング
-,

Copyright© My,WebNote - 備忘録 - , 2017 AllRights Reserved