• ベストアンサー

【C言語】配列の中に配列を入れたい

const double A[2] = {1.0, 2.0}; double B[2][3] = { { A[0], A[1], 0.0 }, { 0.0, 0.0, 0.0 }}; このようなプログラムをコンパイルしようとすると、 初期化子の要素が定数ではありません というエラーが出てしまい困っています。どのように解決したらいいでしょうか。 OSはlinux、コンパイラgccです。

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

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.3

>配列の中に配列を入れたい 何か誤解を招く表現ですね。 「配列の中のある要素の初期値として、別の配列の要素を指定したい。」と言う意味でしょうか? 配列の初期値ですが、変数の記憶域が静的な場合は配列に限らず、定数しか指定できません。 動的領域の場合は変数の内容を初期値にすることは論理的に可能ですが、コンパイラによっては 静的な場合と一緒にしてしまっている場合があります。恐らく後者なのだと思います。 しょうがないので、配列生成後に代入するしかないでしょう。そもそも動的領域に初期値と いうのは本来できないことなのです。実際に生成されるコードは変数の確保→値の代入の順に なっており、明示的にソースコードを書くか書かないかの違いしかありません。

その他の回答 (2)

  • Trick--o--
  • ベストアンサー率20% (413/2034)
回答No.2

初期化でするからでは? double B[2][3]; B[0][0] = A[0]; B[0][1] = A[1]; ... とかでは駄目なの?

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.1

デファインシンボルじゃ駄目ですか? #define A1  1.0 #define A2  2.0 const double A[2] = {A1, A2}; double B[2][3] = { { A1, A2, 0.0 }, { 0.0, 0.0, 0.0 }}; 同じ環境無いんで確認できないけど・・・・・ (VCでやったら元々のでも通ってしまった)

関連するQ&A

  • C言語で作ったらWindowsでもMacでもLinuxでも動くんですか?

    Linuxでgccを使ってC言語を勉強してます。 Linuxのgccでコンパイルして作ったプログラムはWindowsでもMacでも動くんでしょうか? 逆にWindowsで作ったのはとか、Macで作ったのは他のOSで動くんだろうかと疑問で・・・。 教えてください!!

  • h8300-linux-elf-gccで指定可能な配列の大きさ

    AKI-H8/3069Fを使ってプログラムのC言語による組込ソフトの勉強をしています。そこで、教えていただきたいのですが、配列の大きさの上限値はいくつなのでしょうか? 例えば、unsigned int char a[1025];としてもコンパイル時にエラーが出なければ大丈夫なのでしょうか? 参考にしているのは、書籍『はじめる組込みLinux』です。そして、そのサポートサイトからダウンロードしたGCCコンパイラ(h8300-linux-elf-gcc)を使用しています。

  • C言語のコンパイルができません

    http://www.c-lang.org/primer.html 上記サイトのC入門用プログラム「hello.c」と言うソースのコンパイルを試みたのですが、エラーが出てしまいコンパイルできません。OSはwindows7でコンパイラはMinGWです。

  • C言語の配列について

    main() { int i; double min=100; double A[4]={50,2,1,3}; for(i=0; i<4; i++) {if(A[i]< min) min=A[i];} printf("%lf",min); } このようなプログラムを組んで配列Aの要素の最小値を求めています。 上記のプログラムで最小値はもとまるのですが、最小値を取るときの番地??(A[?]=1の?の値のことです。上記プログラムではA[2]=1なので2です。)をとりだしたいのですが、良い方法はないでしょうか?? アドバイスお願いします。

  • C言語 演習

    こちらの問題です。 http://www4.uploader.jp/user/tyranoheya/images/tyranoheya_uljp00037.txt コンパイラ:gcc OS:linux どのようにしていいかまったくわからない状態です。 よろしくお願いします。

  • C言語での質問です

    C言語を始めて、2ヶ月くらいです。コンパイラは、Borlandc++で、エディタは、bcpadに付いていたものを使っています。 「サンプル通り作成したプログラムがコンパイルエラーになり」 一つ一つ確認しても、間違っている箇所が見つかりません。一人で解決できないとき、皆さんはどのようにして解決していますか。

  • GPLについて

    gcc でコンパイルしたプログラムは gccのライブラリとリンクされることになると思いますが、このプログラムは配布する時に GPL にのっとって配布しなければならないのでしょうか? 一般的に linux で動く商用で配布されているプログラムなどのようなコンパイラでコンパイルされているのでしょうか?

  • C言語の配列について

    short* dst_buf = new short[dst_img->width * dst_img->height]; double *a = dst_buf[dst_img->width * jj + ii]; if(*a == 1.0){white++;} というプログラムをくんでいます。 dst_bufの中身をaに入れるというものです。 すると、エラーで 2tika06.exe の 0x00b3627d でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x07943db8 を読み込み中にアクセス違反が発生しました。 というものが出てくるのですがなぜでしょうか。 解決策がわかりません。 初歩的な質問ですが、よろしくお願いします。

  • 秒数を数える(C言語)

    プログラム実行時に時間を数え始めて、100秒経過したらまた最初からプログラムを実行しようと考えています。(tcpdumpみたいなもの) まず、秒数を数えて出力するプログラムを作ってみたのですが、実行しても0.000000と出てしまい、数えることが出来ませんでした。 (例) #include<stdio.h> #include<time.h> void tekitou(); int main() { while(1) { /*無限ループ*/ tekitou(); } return 0; } void tekitou() { static time_t start; time_t last; start = clock(); last = clock(); printf("%f\n", (double)(last - start)/CLOCKS_PER_SEC); } OSはLinuxでコンパイラはgccです。よろしくおねがいします。

  • C++ 共変 戻り値について

    c++ で例えば、 class A { public:  virtual ~A() {} }; class B { public:  virtual ~B() {}  virtual B& hoge() = 0; }; class D:  public A,  public B { public:  virtual D& hoge() // この戻り値でエラー  {   ...;   return *this;  } }; のようにコードを書いたとします。 そして、これを gcc 3.3 でコンパイルしたところ「ゴメン。共変はサポートしてないんだ」って感じでエラーとなってしまいました(gcc 3.2 では問題を孕んでたくせに、何も言わずにコンパイル通ってました)。 この共変の意味や、その実際の挙動、問題点等は判ったのですが、では一体、この様な場合にどのようにコードを修正するのが正しいのか思い至りません。 どなたか、私ならって言うお考えがあればご教示願えないでしょうか? ちなみに、コンパイラーを変えるってのは無しです^^) ## gcc 4.0 ならいけるのかな??

専門家に質問してみよう