公式アカウントからの投稿が始まります

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]とできるのですが・・初心者には難しいです。
どなたか、教えてくださるとありがたいです。

A 回答 (7件)

#2です。



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

意味がわかりません。
提示したプログラムを実行すれば、DM0からDM999のマクロ定義が出力されますので、それをヘッダファイル(例えばdm_dat.hのような名前にする)として保存し、それを各ソースファイルからインクルードすればよいのです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/09/02 10:12

>第2の方法としてプリプロセッサだけを使って展開できないでしょうか?


残念ながらできません。
できるんだったら、みなさんとっくに提示してますよ。
一度作っちゃえばいいので、そこにこだわる必要はないと思うのですが。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/09/02 12:09

別解としては「エディタのマクロを使って何とかする」というのもありそうですが....


別に「シーケンサに合わせる」必要性なぞさらさらないのでは? 少なくとも, 「シーケンサに送るデータ上で整合性が取れていれば, プログラム上で合わせなければならない理由は全くない」と思いますがね.
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/09/02 11:15

#2さんの回答は手で書く代わりにプログラムに書かせるという意味です


標準出力をファイルにリダイレクトすれば
#define~
という行が1000行書かれたファイルが作成されます
リダイレクトはコマンドプロンプトなどで
プログラム名 > ファイル名
とすれば良いです
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/09/02 10:14

>変数名をDM0~999で宣言したい



配列を使うことのメリットを放棄してまで
その1000個の変数名を使いたいのはどうしてですか?
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/09/02 06:22

コードを自動生成すればよいのでは?


言語は何でもかまいませんが、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;
}

とでもしておけばよいでしょう。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/09/02 06:27

ポインタを使ってみては?



例えば、

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%A …

C言語はポインタの理解が最大の難所ですが、マスターすれば強力な武器になります。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/09/01 23:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!