初めて質問致します。VC++.net Win2000 で勉強してます。
文字列定数を配列として使用したい時、どこでどのように定義すればよいのでしょうか。
数や内容が変更になる事もあるかもしれないので、本体の中ではなく別ファイルでと
考えているのですが。(もちろん本体プログラム中ではそれなりの対処はしてあります)
今のところ、という以下のような codelist.h を用意してインクルードしてます。
#define CODE_LNG 5
#define MAX_C1 5
char NameC1[MAX_C1][CODE_LNG + 1] = {AAAAA,BBBBB,CCCCC,DDDDD,EEEEE};
でもヘッダ中では宣言のみで、内容は定義してはいけないんですよね?
とすると、イニシャライズする関数を作って、そのなかで1つずつ
strcpy(NameC1[0], AAAAA);
のように代入していくのでしょうか。なんかもの凄く分り辛くなりそうな...
こんな時、どのようにしたら良いのでしょうか。
どうぞよろしくお願い致します。
> 数や内容が変更になる事もあるかもしれないので、
> 本体の中ではなく別ファイルでと考えているのですが。
この考え方に一票。
ただ、
> もちろん本体プログラム中ではそれなりの対処はしてあります
この「それなりの対処」がどのようなモノかが気になります。数や内容に変更があっても
*.cppや*.hに手を加えなくても大丈夫なようになっていますか? 更に言えば「別ファイ
ル」が空っぽだったり、存在していなかったり、想定外の内容になっていても落ちないよ
うにしてありますか?
> 今のところ、という以下のような codelist.h を用意してインクルードしてます。
> でもヘッダ中では宣言のみで、内容は定義してはいけないんですよね?
「好ましくない」だけで「絶対やってはいけない」ではありません。
> こんな時、どのようにしたら良いのでしょうか。
・データに変更の可能性があるのならデータファイルを別に作る
・ヘッダファイルで変数の宣言だけをしておく
-ポインタにするか、vectorにするかはお好み次第
・初期化関数で、
-データファイルを読み込み
-必要に応じて格納領域を確保し
-データを格納する
-何らかの理由によりデータの格納ができなければエラー表示
#define CODE_LNG 5
#define MAX_C1 5
extern char NameC1[MAX_C1][CODE_LNG + 1];
としておいて、別途定義用cppを作り、
#include codelist.h
char NameC1[MAX_C1][CODE_LNG + 1]
= {AAAAA,BBBBB,CCCCC,DDDDD,EEEEE};
とするのではいかがでしょう。
お返事いただきまして、ありがとうございます。
> > もちろん本体プログラム中ではそれなりの対処はしてあります
> この「それなりの対処」がどのようなモノかが気になります。数や内容に変更があっても
> *.cppや*.hに手を加えなくても大丈夫なようになっていますか? 更に言えば「別ファイ
> ル」が空っぽだったり、存在していなかったり、想定外の内容になっていても落ちないよ
> うにしてありますか?
はい。大丈夫なつもりです。CODE_LNG , MAX_C1 もその為に定義して本体中で使用
してます。
> 「好ましくない」だけで「絶対やってはいけない」ではありません。
なるほど。あちらこちら調べていると、必ずと言っていいほど「ヘッダ中では...」
と指摘されているので、非エラーでも利用不可なのかと思っていました。
> ・データに変更の可能性があるのならデータファイルを別に作る
目から鱗です。
プログラム本体とは別のファイルにする事は考えてもいませんでした。
コンパイル時にファイルを入れ替えて、バージョンを書換えて...の事ばかり考えてました。
ただ、汎用性は高まると思うのですが、そのファイルを不用意に書換えてしまう場合も
考慮しないといけなくなりますよね?
今回は、データマッチング用なので、アンマッチのケースがある時は、アラートを
出すようにすれば問題ないかも知れません。
どちらにしても初期化関数を用意すべきという事ですね。
ご意見ありがとうございました。
考えなら書いてて、時間が掛かりすぎましたね。申し訳ないです。
> #define CODE_LNG 5
> #define MAX_C1 5
> extern char NameC1[MAX_C1][CODE_LNG + 1];
>
> としておいて、別途定義用cppを作り、
>
> #include codelist.h
> char NameC1[MAX_C1][CODE_LNG + 1]
> = {AAAAA,BBBBB,CCCCC,DDDDD,EEEEE};
なるほど。
マルチソースファイルってのは、こうするんですね。
こちらの方が、僕には後から見ても分りやすそうな気がします。
,で列挙するなら、コメントも入れ易いですし。
#ファイルをオープンして...とか、項目毎に strcpy して、というのは
#面倒(プログラマ失格ですね)だったり、後から見難いように思ってたので...
ありがとうございました。
とりあえずお2人のご意見を参考に、仕様の再検討も含め考えたいと思います。
tib さんのは上手くいけばメンテフリーに出来そうですし、
dairygoods さんのは個人的に分りやすそうですし。
どうもありがとうございました。