• 締切済み

動的配列の使い方の問題

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

みんなの回答

回答No.3

2番さんの続き?に近いですが。 リンクチェーン方式も手としてはあります。 root->data->data->data->NULL; とチェーンでつないでいく方式。。 typedef struct _tag_CHAIN { int data; struct _tag_CHAIN *next; /* ここがNULL以外なら次のデータがある */ }CHAIN; typedef struct _tag_CHAIN_ROOT { CHAIN *root; /* データの根元 */ int count; /* 本来はいらないが、追加するごとに+1しておけば数がすぐ求まる */ }CHAIN_ROOT; 後はひたすら読みだす!。 残念ながら、これだと、メモリアロケートが大量になるので、 効率は悪いのですが、1発で読み切れます。 この方式の場合、1行削除ってのが、めちゃくちゃ簡単だったりします。 (もちろん1行追加も) root->data_a->data_b->data_c->NULL; data_bがさしているnextをdata_aのnextに代入。 data_bを解放。 これで、data_bをチェインから外すという具合。 1行の長さが可変だったり、何千行もあるような場合、 場合により、効率がいいこともありますよ。

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.2

1. アロケートする 2. それに入るだけデータを読む 3. データを読み切ったら、余分にアロケートした事になった分をデアロケート 4. 読み切れなかったら、追加でアロケートして2.に戻る という手もあります。

  • maiko04
  • ベストアンサー率17% (345/1956)
回答No.1

C言語では1件(1行)読むたびにメモリーを確保していく手法があります。 一回読んだら全部メモリーにあって配列にすることもできるし検索やソートも できます。 テキストファイルだと行ごとに長さが違いますが、1行目が20文字だったら 20文字分確保、2行目が100文字なら100文字分確保します。 無駄がないですね。

関連するQ&A