• ベストアンサー

C言語の配列について

Cでプログラミングを行っております。 配列についてお聞きしたいのですが、 たとえばi=0~NUMとしてTest[i]という配列があって、 ある条件に達したらTest[3]やTest[5]という一部を完全に削除するということをしたいのです。 どうやったらできるでしょうか。 よろしくおねがいいたします。

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

  • ベストアンサー
回答No.7

静的な配列ではメモリの関係上 完全に削除することは不可能です。 (例) int Test[ NUM ]; ← 静的な配列宣言 方法としては、  データのシフトによる仮想的な削除(データのみ削除)  動的な配列 などがあります。 データのシフトはmemset()を用いて行います。 (例) 3番目のデータを削除  i = 3;  memset( &Test[i], &Test[i+1], sizeof(Test[0])*(NUM-1-i) ); これは、Test[3]のデータを削除して それ以降のデータをシフトして詰めています。 動的な配列に関しては少々説明がたいへんなので 自分で調べてみてください。 キーワードとして  malloc(), calloc(), realloc(), free() などを参照してください。 あまりうまく説明ができませんでしたが 参考になりましたでしょうか。

その他の回答 (6)

  • valvelde
  • ベストアンサー率35% (46/129)
回答No.6

TESTのポインタの配列を用意して 必要なくなった時点でNULLを設定する。

回答No.5

例えば、構造体の要素が正の値しかとらない場合、負の値を入れることで「消滅した」とすることが出来ます。 また、構造体の要素に「存在フラグ」を追加することで、それが消滅したかどうかを判定させることも出来ます。 後者の例) typedef struct{ bool flag; double a; double b; double c; }TEST ** TEST tst[NUM]; if(tst[i].flag) { /* 処理 */ }

回答No.4

何をしたいのか教えてもらえますか? 配列を使用するメリットは、添え字で素早く要素を 参照できることです。あるいは、配列全体を素早く 操作できることです。 本当に、「完全に削除」する必要があるのでしょうか?要素の値として、「意味のない値を入れておく」という操作を行うことがあります。

sosohoho
質問者

補足

具体的には以下のような感じです。 例 typedef struct{ double a; double b; double c; }TEST TEST tst[NUM]; といった具合の配列をつくり、 0~NUM-1までの要素を用いてシミュレーションを行い、 それである一定の条件に満たされたtst[i]はシミュレーションの中において「消滅した」とみなす感じです。 「意味のない値を入れておく」ということについて教えていただければと思います。

回答No.3

> 配列は独自の構造体で作ってるんですよ。 > これでできますかね?? 訊くよりやってみるのが数倍早いし為になります。

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.2

Cの言語仕様で定められている配列には、一部削除という機能はないので、不要となる要素のメモリに、以降の要素を一つずつ詰めていくなどの処理(他にも実装方法はいろいろあります。)を記述する必要があります。 そこらへん自前で実現しようとすると大変(バグの元にもなる。)なので、Vector等の便利なデータ構造を提供するSTLといったライブラリを利用するのが早道と思います。

sosohoho
質問者

補足

なるほど。 ただ、C++の知識はないんですよね…。 どうしたものか…。

回答No.1

配列の大きさを変えることはできません。 int Test[NUM]; ではなく、 int* Test = (int*)malloc(NUM*sizeof(int)); であれば、ポインタの付け替えでなんとかなりますが。

sosohoho
質問者

補足

配列は独自の構造体で作ってるんですよ。 これでできますかね??

関連するQ&A