• ベストアンサー

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

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% (2126/6288)
回答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

  • 配列を使わずに、変数名を動的にループで回したい

    配列を使わずに、変数名を動的にループで回したい 大学の課題をやっている途中に思ったことなのですが……。 プログラム中に同じ型の変数p1,p2,p3があり、それぞれの変数にループで同じ処理を施したいと思っています。 しかし、「p(i)」や「("p" + i)」などと、変数どうしを別のものとして認識させようとしても、コンパイラから警告が出て上手くいきません。 配列を使えば、このような処理が出来ることはわかるのですが、使う変数名を指定されてしまっているために、今回は配列を使えません。 出来るか出来ないか、出来る場合は方法を知りたいです。 後、今回はC言語のプログラムで利用出来るかが自分にとっての問題なのですが、C言語以外のこのプログラミング言語なら出来る、とかの情報もこの機会に知りたいです。 お答え出来る範囲でいいので、もしよければ回答お願いします。

  • 配列の定義について

    配列とは、同じ形式のデーターを連続した記憶領域で確保するためのものである。 配列を構成する個々の領域を要素と呼び、要素の位置を添え字で示す。 Javaでは配列の先頭の要素を(0)番目と呼ぶ。 今、hairetsuという名前で10個の整数からなる配列を定義したい。 この場合の配列は(0)番目から始まり、終端は(9)番目である。 これを定義するには (int[] hairetsu;) (hairetsu = new int[10];) のように2行で行う方法と、 (int[] hairetsu = (new int[10];) のように、一行で行う方法がある。 Javaでは定義済みの配列の要素数は、配列変数名.(length)で知ることができ、 終端は(length + 1)番目となる。 したがって(length + 1)番目以降を使おうとすると、 配列要素の範囲外で(例外)が発生する。 この文章の( )の中は間違っていますか?

    • ベストアンサー
    • Java
  • 配列をグローバル変数にとってやりたい

     今晩は、Cの初心者です宜しくお願いします。  今、ポインターを使わないでグローバル変数でサブルーチンから配列が使えるのかの勉強をしているのですが、 Cでは、配列をグローバル変数にとってやることは出来ないのでしょうか。  どうも正常にプログラムが実行出来ないのですが。  宜しくお願いします。

  • 配列 隣の要素を参照するのですが

    最初に 8つの要素を持つint型の配列(配列名dat)があるとして、最初全要素に「0」が代入されています。scanf関数でn番の要素に「1」が代入されたとします。n番なのでどこに「1」が代入されたかはわからないです。 問題 for文を使用して何番目に「1」が入力されたかを調べますが、以下のルールに従がわなくてなならいです。 ルール ・現在の要素から隣の要素を参照しなくてはいけない。 ・参照する範囲は要素の数「0~7」番 #include<stdio.h> void main() { int i, dat[8]; for(i=0;i<8;i++){ dat[i]=0; } i=0; scanf("%d",&i); dat[i] = 1; for(i=0;i<8;i++){ if(dat[i+1] == 1){print("%d列目に「1」がありました", i+1); } } でも…こうすると0番目の要素が参照されないですそれを回避するには?そして… 最大の要素(dat[7])にきたときは隣を参照しないようにするにはどうすればよいのでしょう?

  • 配列のプログラム作成

    【質問】 次の処理を行うプログラムを作成します。 (1)10個の要素を持つ一次配列dat[10]を宣言します (2)dat[0]に0、dat[1]に1をセットします (3)dat[2]以降の要素には、前の2つの要素の和を計算し入力します (4)配列の各要素の値を表示します 【プログラム作成例】 dat[ 0] = 0 dat[ 1] = 1 dat[ 2] = 1 dat[ 3] = 2 dat[ 4] = 3 dat[ 5] = 5 dat[ 6] = 8 dat[ 7] = 13 dat[ 8] = 21 dat[ 9] = 34 上記の解答は下記の通りなのですが、下記以外の解答方法を教えてはいただけないでしょうか? C言語に詳しい方よろしくお願いいたします。 #include <stdio.h> main() { int i, dat[10]; dat[0] = 0; dat[1] = 1; for (i=2; i<10; i++) { dat[i] = dat[i-2] + dat[i-1]; } for (i=0; i<10; i++) { printf ("dat[%2d] = %2d\n", i, dat[i]); } return (0); }

  • div要素で定義された配列変数間の値引き渡し

    div要素のid名と値を配列[id名,値]で定義して、親htmlと子iframe間で同名の変数の引き渡しを行なっています。 数が多いのでfor文で実施したいのですがうまくいきません。 間違いを正していただけませんでしょうか。 var arr = [ ["b01", b01], ["b02", b02], ["b03", b03],    ・    ・ ]; // iframeの呼び出し var doc = document.getElementsByTagName("iframe")[0].contentWindow; // iframe内div要素の値取得、親の変数に代入 for (var i = 0; i < arr.length; ++i) { arr[i][1] = doc.document.getElementById(`"${arr[i][0]}"`).innerHTML; } 意図としては上のような形にしたいのですが、これではうまくいきません。 おそらく`"${arr[i][0]}"`の部分がいけないのだと思います。 alert(`"${arr[0][0]}"`)の結果は意図どおり"b01"と出力されます。 もちろん以下であれば変数がきちんと渡ります。 var b01 = doc.document.getElementById("b01").innerHTML; var b02 = doc.document.getElementById("b02").innerHTML; var b03 = doc.document.getElementById("b03").innerHTML;    ・    ・ よろしくお願いします。

  • 配列名の定義の仕方?

    配列名を操作したいのですがうまくいきません。やりたいことは下記の★部分で配列名を定義したいのですが、定義の方法がうまくいっていないようです。 //配列名と要素を設定 var station1 = new Array("東京","渋谷","新宿"); var station2 = new Array("横浜","藤沢","川崎"); var station3 = new Array("千葉","浦安","津田沼"); //★任意の番号を設定し配列名を定義 var no = 1; //ここでは仮に1とする var arrayName = "station" + no; ←ここで「station1」としたい document.write(arrayName[2]); 上記ではうまくいきません。どうやったらstation1という配列名を作って要素を取得できるのでしょうか?

  • perl 配列名変数指定するには

    perlプログラムで for文で ループ分の配列定義するには どうしたらよいですか? 下記のようなことができないかと 考えております。 for(my $i = 0; $i < $file_no; $i++){ my @{"segments$i"} =(); #配列定義 my ${"line$i"}="";     #変数定義 my %{"hash$i"}= ();    #ハッシュ定義 open(ARG1,$ARGV[$i]); while(<ARG1>){ ${'line'.$i} = $_; chomp ${'line'.$i}; @{'segments'.$i} = split(/\t/,${'line'.$i});        ${'hash'.$i}{${'segments'.$i}[0]}=${'segments'.$i}[1];     } close(ARG1); } #下記で、その後 各ハッシュに設定したデータをもとに いろいろ計算したい foreach my $a (keys %{'hash'.$i}){ ・・・ } 今は、Can't declare array dereference in "my" at test.pl line XX, near "} =" と 配列定義でエラーとなり処理できません。

    • ベストアンサー
    • Perl
  • Java:クラスのインスタンスを配列の要素にする?

    問題集で次のプログラムを見掛ました。 A[] array = {new B(), new C()}; クラスA型の配列変数arrayにクラスBとクラスCのインスタンスを要素として代入しています。 このような配列を作成した場合、具体的にどのような使い方があるのでしょうか? 簡単なプログラムを書いて頂けると嬉しいです。 よろしくお願いします。

  • 複数の配列からfor構文の中で任意の要素を表示させる

    @dat1=(12,11,16,17); @dat2=(21,26,23,20); ・・・ @dat17=(22,34,31,18); for($i=1;$i<=$17;$i++){ print @{"dat$i"};print "\n"; } といったように,@dat1から@dat17まで配列が用意されているときに上の例では当然ながら@dat1全ての要素が表示されます。これを任意の要素のみを表示させたい場合にはどのようにすればよいでしょうか? 例えば@dat1から@dat17までの0番目の要素($dat1~17[0])と1番目の要素($dat1~17[1])のみを表示させたいのですが...

    • ベストアンサー
    • Perl