• ベストアンサー

配列変数の各要素を違う変数名で再定義するには

Cプログラム初心者です。よろしくお願いします。 配列dm_dat[1000]の各要素を違う変数名(連続した)DM0からDM999の変数名で再定義したいのですが(グローバル変数として)、#define DM0 dm_dat[0]~#define DM999 dm_dat[999]を実際に入力するのはいやなので、他に簡単にすませる方法はないでしょうか?DM0でなくDM(0)なら#define DM(i) dm_dat[i]とできるのですが・・初心者には難しいです。 どなたか、教えてくださるとありがたいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

#2です。 > 回答の方法では変数名の変換になりません。そして関数内で展開しても > 他で変数DM0から1000は使うのでコンパイルするとエラーになってしまいますが・・グローバル変数としてつかいたいのですが・・ 意味がわかりません。 提示したプログラムを実行すれば、DM0からDM999のマクロ定義が出力されますので、それをヘッダファイル(例えばdm_dat.hのような名前にする)として保存し、それを各ソースファイルからインクルードすればよいのです。

neofx
質問者

お礼

回答ありがとうございます。 指示されたプログラムのprintfをfprintfを使用してファイルに展開できました。そこで欲張って、第2の方法としてプリプロセッサだけを使って展開できないでしょうか? よろしくお願いします。

その他の回答 (6)

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.7

>第2の方法としてプリプロセッサだけを使って展開できないでしょうか? 残念ながらできません。 できるんだったら、みなさんとっくに提示してますよ。 一度作っちゃえばいいので、そこにこだわる必要はないと思うのですが。

neofx
質問者

お礼

ご意見ありがとうございます。 専門家の意見がそうならヘッダーファイルに展開することでいきたいと思います。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.6

別解としては「エディタのマクロを使って何とかする」というのもありそうですが.... 別に「シーケンサに合わせる」必要性なぞさらさらないのでは? 少なくとも, 「シーケンサに送るデータ上で整合性が取れていれば, プログラム上で合わせなければならない理由は全くない」と思いますがね.

neofx
質問者

お礼

回答ありがとうございます。 ご意見のように無理に合わせる必要性はないかと思います。 ただ、浅学のため自分で色々試してみたのですが、できなくて 専門家ならどうするか勉強のためにも知りたいのですが・・ 別解もあったら教えてください。

  • php504
  • ベストアンサー率42% (926/2160)
回答No.5

#2さんの回答は手で書く代わりにプログラムに書かせるという意味です 標準出力をファイルにリダイレクトすれば #define~ という行が1000行書かれたファイルが作成されます リダイレクトはコマンドプロンプトなどで プログラム名 > ファイル名 とすれば良いです

neofx
質問者

お礼

回答ありがとうございます。 欲張って、第2の方法としてプリプロセッサだけを使って展開できないでしょうか? よろしくお願いします。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.3

>変数名をDM0~999で宣言したい 配列を使うことのメリットを放棄してまで その1000個の変数名を使いたいのはどうしてですか?

neofx
質問者

お礼

質問ありがとうございます。 シーケンサとマイコンとのやり取りでシーケンサ側の変数名がDM0からの変数名です。それでマイコン側でも変数名をあわせたいのですが・・

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

コードを自動生成すればよいのでは? 言語は何でもかまいませんが、C言語で書くなら... #include <stdio.h> int main(void) {  int i;  for (i = 0; i <= 999; i++)   printf("#define DM%d dm_dat[%d]\n", i, i);  return 0; } とでもしておけばよいでしょう。

neofx
質問者

お礼

回答ありがとうございます。 回答の方法では変数名の変換になりません。そして関数内で展開しても 他で変数DM0から1000は使うのでコンパイルするとエラーになってしまいますが・・グローバル変数としてつかいたいのですが・・ よろしくお願いします。

  • Interest
  • ベストアンサー率31% (207/659)
回答No.1

ポインタを使ってみては? 例えば、 int dm_dat[1000]; // と宣言されているとして int *dm = dm_dat; // としてしまえば、 int i;       // このiで配列の要素にアクセスするとして dm[i] と dm_dat[i] は同じ値。 *(dm + i) でも同じことですよね。 ポインタがなんだかよくわからない場合は、この本がお勧めです。 http://www.amazon.co.jp/%E7%A7%98%E4%BC%9DC%E8%A8%80%E8%AA%9E%E5%95%8F%E7%AD%94-%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E7%B7%A8-SOFTBANK-BOOKS-%E6%9F%B4%E7%94%B0/dp/4797302976 C言語はポインタの理解が最大の難所ですが、マスターすれば強力な武器になります。

neofx
質問者

お礼

早速のご回答ありがとうございます。 ポインタを使っても変数名がDMO~DM999になりません。 変数名をDM0~999で宣言したいのです。その方法がわかりません。

関連するQ&A