- ベストアンサー
C言語の配列について
Cでプログラミングを行っております。 配列についてお聞きしたいのですが、 たとえばi=0~NUMとしてTest[i]という配列があって、 ある条件に達したらTest[3]やTest[5]という一部を完全に削除するということをしたいのです。 どうやったらできるでしょうか。 よろしくおねがいいたします。
- みんなの回答 (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)
TESTのポインタの配列を用意して 必要なくなった時点でNULLを設定する。
- Trick--x--
- ベストアンサー率26% (19/72)
例えば、構造体の要素が正の値しかとらない場合、負の値を入れることで「消滅した」とすることが出来ます。 また、構造体の要素に「存在フラグ」を追加することで、それが消滅したかどうかを判定させることも出来ます。 後者の例) typedef struct{ bool flag; double a; double b; double c; }TEST ** TEST tst[NUM]; if(tst[i].flag) { /* 処理 */ }
- chukenkenkou
- ベストアンサー率43% (833/1926)
何をしたいのか教えてもらえますか? 配列を使用するメリットは、添え字で素早く要素を 参照できることです。あるいは、配列全体を素早く 操作できることです。 本当に、「完全に削除」する必要があるのでしょうか?要素の値として、「意味のない値を入れておく」という操作を行うことがあります。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
> 配列は独自の構造体で作ってるんですよ。 > これでできますかね?? 訊くよりやってみるのが数倍早いし為になります。
- osamuy
- ベストアンサー率42% (1231/2878)
Cの言語仕様で定められている配列には、一部削除という機能はないので、不要となる要素のメモリに、以降の要素を一つずつ詰めていくなどの処理(他にも実装方法はいろいろあります。)を記述する必要があります。 そこらへん自前で実現しようとすると大変(バグの元にもなる。)なので、Vector等の便利なデータ構造を提供するSTLといったライブラリを利用するのが早道と思います。
補足
なるほど。 ただ、C++の知識はないんですよね…。 どうしたものか…。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
配列の大きさを変えることはできません。 int Test[NUM]; ではなく、 int* Test = (int*)malloc(NUM*sizeof(int)); であれば、ポインタの付け替えでなんとかなりますが。
補足
配列は独自の構造体で作ってるんですよ。 これでできますかね??
補足
具体的には以下のような感じです。 例 typedef struct{ double a; double b; double c; }TEST TEST tst[NUM]; といった具合の配列をつくり、 0~NUM-1までの要素を用いてシミュレーションを行い、 それである一定の条件に満たされたtst[i]はシミュレーションの中において「消滅した」とみなす感じです。 「意味のない値を入れておく」ということについて教えていただければと思います。