• 締切済み

プログラム言語の動的配列について

動的配列という場合、配列のサイズがプログラム動作中に変化する、という意味でしょうか。 それとも、プログラム作成時に配列サイズが指定されておらず、外部のデータを読み込んでその時点でサイズが確定するという場合もあるかと思います。おなじことでしょうか。 なお、配列のサイズが指定されていないプログラムがあるとして、実行開始したあとから指定された配列サイズがメモリ容量とか制限によって上限値があるということにはなるかと思います。 また、大き目に配列を用意して実際に使用する場合、その一部しか使わないというのは通常のことだと思います。そのような場合は全く無関係だと思います。 データのサイズが違っても同じプログラムが使えるので1つ作ればあちこちに応用できることになると思います。このあたりのことがクリアになると同じことをするプログラムは1つだけあればいいということになります。 一応、C,C++,Fortran(77,95)という昔からある言語で、ということですが。 よろしくお願いします。

みんなの回答

  • hiodraiu
  • ベストアンサー率15% (448/2823)
回答No.4

動的配列はスタック領域やヒープ領域上に確保された変数で、静的配列はコード領域上に確保された変数です。

  • f272
  • ベストアンサー率46% (8014/17129)
回答No.3

動的配列とは,配列の宣言時に要素数が決まっていない配列ということです。従ってコンパイル時には固定の領域を割り当てることができず,実行時に配列のサイズが決まった時点で領域を割り当てることになります。もちろん,割り当てた後に,領域を開放して再び割り当てることも可能です。 > 大き目に配列を用意して実際に使用する場合、その一部しか使わないというのは通常のことだと思います。 ちゃんと設計して作るようなプログラムだと,殆ど見かけません。 > データのサイズが違っても同じプログラムが使えるので1つ作ればあちこちに応用できることになると思います。 データのサイズによってプログラムを変えるなんて面倒でしょうがありません。動的配列の出番ですね。 > 一応、C,C++,Fortran(77,95)という昔からある言語で、ということですが。 FORTRAN77には動的配列はありません。

  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.2

動的配列というのは、コンパイル時に配列サイズが決まらないと言うことです。言い換えると、配列変数宣言時に要素数が定数・定数式ではないということです。 >動的配列という場合、配列のサイズがプログラム動作中に変化する、という意味でしょうか。 それとも、プログラム作成時に配列サイズが指定されておらず、外部のデータを読み込んでその時点でサイズが確定するという場合もあるかと思います。 だと、後者ですね。もちろん、前者を兼ねるケースもあると思いますが。

回答No.1

>データのサイズが違っても同じプログラムが使えるので1つ作ればあちこちに応用できることになると思います。このあたりのことがクリアになると同じことをするプログラムは1つだけあればいいということになります。 全く同じ処理をするならデータサイズに関係なく処理できるようプログラムを作ります。 データサイズ毎に別々のプログラムを作ると言うような事はしません。

関連するQ&A

  • 配列のサイズを決めないプログラム

    プログラムの作成時に配列のサイズを決めないでプログラムの実行時に決めるという場合があると思います。 1.可変サイズとして配列の宣言 2.プログラム開始後、何らかの情報でサイズを決定する 3.確保された配列にデータを読み込ませたりして使用する ここで質問ですが、データを読み込ませて配列のサイズが決まる場合、上記の方法では不成立のように思います。2と3が逆だからです。処理するデータに応じて配列のサイズを変更する方法を教えて頂きたいのですが。そのような処理が可能になるとプログラムがデータの量と無関係(もちろん限度あり)となり汎用化されると思うのですが。どのようにするのでしょうか。基本はfortran95ですが、Cでの処理でも参考になるかと思います。

  • 動的配列の使い方の問題

    プログラムには動的配列というものがあり、配列なのですが、最初の宣言でサイズは指定しない(型は指定すると思いますが)というような動作ができるのだろうと思います(それ以外もあるかもですが)。 私が目指しているのはデータの総数がわからないけれど、データファイルを読み込んで総数をカウントしたらわかるのでそれを使ってメモリを確保するというようなことです。事例集を見ると以下のようなものはあります。 allocatable a(:) ..... データファイルを開いてカウントしたら100だった ..... allocate(a(100)) この使い方ってあんまりご利益がないように思います。カウントしたら100だったということですが、その時はデータをとりあえず読んでいるわけです。 配列サイズ100とわかって実際にアロケートしないと配列は利用できないものなのでしょうか。 これに関連して質問ですが、サブルーチンとか関数とか副プログラムに配列を渡して処理する場合、サブルーチン側の配列(仮引数)の型、サイズを指定しない方法があるでしょうか。メイン側で決めたものに従いますということなのですが。 例えばサブルーチン側の仮引数BについてB(*)などとしていたらメイン側の指定通りになっているということになるのでしょうか。動的な配列ということでお尋ねしているのですが、副プログラムの仮引数の配列がサイズ依存が消えたように見えるからこちらの方が動的に見えるのですが。サイズに関してはメインで宣言したらどうにでも対応します、という弾力性があります。もちろ使いまわしも容易になりますが。 言語ですが、お気づきとは思いますが、Fortranです(ハズイ感じ)。その他の言語の仕様でも参考になります。よろしくお願いします。

  • 配列のサイズが明示的でない計算について

    Fortranを例にとった場合、 行列A,Bの積Cを計算する場合、例えば以下のようなループで計算していました。(Fortran77) do i=1,10 do j=1,10 sum=0.0 do m=1,10 sum=sum+a(i,m)*b(m,j) enddo c(i,j)=sum enddo enddo それが今では、以下1行です。(Fortran95) c=matmul(a,b) 配列1つ1つの成分について計算する必要がないと言えそうです。Pythonなんかは全部こういう思想ですね。 プログラム言語はすべてこういう方向に進んでいるように思えます。 これがやや不安に思えるところがあります。配列のサイズを指定していないのでどこまで使って計算しているかわからないからです。 古い方(上段)では配列のサイズや上限を指定しているので、指定しているところより先がどうなっていてもとりあえず被害はありません。 しかし、サイズについてのケアがないと思いがけないような計算をしてくるんじゃないかと思うのですが。計算のバグ取のときここ大丈夫かな?となって疑心暗鬼ということにならないかと思うのですが。 配列の最大値なども関数1つと言う感じですが、どこまでの範囲での最大なの?と聞きたくなるわけですが。 いかがでしょうか。

  • 配列のファイル出力について

    fortranでできるファイルへの配列の出力をC言語でどのようにプログラムするか教えて頂きたいと思います。 2次元配列a(i,j)の出力はfortranでは以下のようなプログラムになります。 open(10,.省略...) ファイルを指定して開く do j=1,ny                ループj   write(10,'(100f10.3)') (a(i,j),i=1,nx) ループi+書き出し enddo                  ループjの最後尾  close(10)                ファイルを閉じる 100f10.3というのは小数点3桁の実数で10カラムで表現したものが100個並ぶという意味です。これと同じことをやるC言語プログラムを教えて頂きたいのですが。私の手元にある本にはやり方が載っていません。 C言語にはfortranのような数字のカラムを指定するようなフォーマットの調整などできるのでしょうか。よろしくお願いします。

  • C言語とfortranでのデータの受け渡しについて

    はじめましてc_f_gaussと申します。 現在fortranで動的に配列を得るためにC言語を使用し 配列を確保しそのアドレスをfortranで定義してある 配列のアドレスと交換したいのですがどのようにしたら よいでしょうか? 今の段階ではC言語側でアドレスを交換してもfortran 側に戻ると元のアドレスに戻ってしまいます。 fortranとC言語でデータ受け渡すには何か必要な手続き があるのでしょうか?

  • 今流行りのプログラム言語は?

     今まで少し学習したのはBASIC, Fortran, AWKです。どれもほんの少しです。とりたててプログラム言語を学習しなければならないというわけではありません。  Windows 7でBASICは使えるのでしょうか。何を用意しなければならないのでしょうか。  Perlもほんの少しだけ学習はしました。  今流行りの言語はCでしょうか。C++でしょうか。Rubyでしょうか。漠然とした質問でスミマセン。

  • 配列サイズを明示せずサブルーチンに渡す方法

    プログラムのメインの方で2次元、3次元の高次元配列を設定してそれをサブルーチンに引き渡すことを考えています(しょっちゅうやっていることですが)。 この場合、サブルーチン側に汎用性を持たせるためにできるだけ配列のサイズを自動で渡すようにしたいと思っています(メインが変わるとそれに応じて自動対応)。そうしないとサブルーチンが汎用化せず、ケースバイケース(メイン側の配列のサイズが変わる場合それに応じてコードを書き変えなければならない)に応じなければならず、うっかりミスの間違いもおこりそうです。 配列のサイズを決めないサブルーチンの書き方を教えて頂きたいのですが。 なお、今回は配列はデータとして参照するだけで書き換えることはありません。 言語ですが、”サブルーチン”というだけあってFortranです。(Cのカテゴリだと答えを頂けるかなと思っているのですが。他に適当なところも無いようですが)

  • C言語 配列の長さの上限

    C言語で配列Array[N]の長さNの上限っていくらなんでしょうか? もし可能なのであれば上限を2147483647にしたいのですが、方法を教えてください。

  • プログラムでの配列の渡し方

    ここではフォートランの問題としてお尋ねします。(フォートランのカテゴリがないのでプログラムの専門家に聞けそうなカテゴリに質問してます。) dimension a(100,100) ... call abc(a) ... stop end subroutine abc(b) dimenison b(100,1) ... return end というようなプログラムがあります。メインの方でa(100,100)と宣言してサブルーチンではb(100,1)で受けるというような処理です。 このようにメインとサブで配列のサイズが異るのはどのようなレベルで許容されるものでしょうか。考え方がわからないのでお尋ねします。私は厳密にサイズを合わせると思っていました。しかしそうだとサブルーチンの使い回しができなくなります。このような問題はC言語の配列の先頭のアドレス云々という問題と似ているのですが。2次元配列ということがわかっていて片方のサイズがわかると自ずからもう片方のサイズがわかるということなのでしょうか。 まとめますと、以下のような点がわからないということです。 1.メインとサブで配列サイズが異なっても問題ないやり方 2.サブ側が動的に対応できるようにするプログラムの書き方(同じサブルーチンだけど、呼び出すメイン側の配列サイズに自動で対応する方法) *などを使うのだろうと思いますが。 この部分はしっかり理解しないと大怪我するところなので確認したいと思っています。 (実験して試すというのではなく、仕様としてどうかということですが) よろしくお願いします。

  • C言語 行列 配列

    現在、C言語を勉強中です。 C言語で (10000*10000)の大きさの行列を扱いたいです。 double a[10000][10000]の配列ではメモリ不足となってしまいます。 このような場合はどのようにプログラムを組んでいったら良いのでしょうか?

専門家に質問してみよう