[解決済み] C 動的に成長するアレイ
質問
ゲーム内のエンティティのquot;raw"リストを読み込むプログラムがあるのですが、不特定多数のエンティティのインデックス番号(int)を持つ配列を作り、いろいろな処理をしようと思っています。そのインデックスを保持するために、あまりメモリやCPUを使わないようにしたいのですが...。
私がこれまで使ってきた手っ取り早い解決策は、メイン処理関数(ローカルフォーカス)の中で、ゲームエンティティの最大サイズを持つ配列と、リストにいくつ追加されたかを追跡するための別の整数を宣言することです。 これは満足のいくものではありません。すべてのリストが3000以上の配列を保持するので、それほど多くはありませんが、さまざまな機能で6-7個のリストにこのソリューションを使用する可能性があるので、無駄のように感じられます。
これを実現するためのC言語(C++やC#ではない)特有の解決策は見つかっていません。ポインターを使うことはできますが、(それが唯一の可能な方法でない限り)それを使うのは少し怖いです。
配列はローカル関数スコープを離れない(関数に渡され、その後破棄される)ので、状況が変わるかもしれません。
ポインタが唯一の解決策である場合、リークを回避するためにどのようにポインタを追跡すればよいですか?
どのように解決するのですか?
<ブロッククオートポインターは使えるのですが、ちょっと怖いんです。
動的配列が必要な場合、ポインターを逃れることはできない。でも、どうして怖いんですか?彼らは(あなたが注意する限りは、ですが)噛まないでしょう。C言語には組み込みの動的配列がないから、自分で書くしかない。C++では、組み込みの
std::vector
クラスがあります。C#やその他多くの高級言語にも、動的配列を管理する類似のクラスがあります。
ほとんどの動的配列の実装は、ある(小さな)デフォルトサイズの配列から始めて、新しい要素を追加するときにスペースが足りなくなったら、配列のサイズを倍にすることで動作します。以下の例でわかるように、これはそれほど難しいことではありません。(簡潔さのため、安全性の確認は省略しています)
typedef struct {
int *array;
size_t used;
size_t size;
} Array;
void initArray(Array *a, size_t initialSize) {
a->array = malloc(initialSize * sizeof(int));
a->used = 0;
a->size = initialSize;
}
void insertArray(Array *a, int element) {
// a->used is the number of used entries, because a->array[a->used++] updates a->used only *after* the array has been accessed.
// Therefore a->used can go up to a->size
if (a->used == a->size) {
a->size *= 2;
a->array = realloc(a->array, a->size * sizeof(int));
}
a->array[a->used++] = element;
}
void freeArray(Array *a) {
free(a->array);
a->array = NULL;
a->used = a->size = 0;
}
使い方はいたってシンプル。
Array a;
int i;
initArray(&a, 5); // initially 5 elements
for (i = 0; i < 100; i++)
insertArray(&a, i); // automatically resizes as necessary
printf("%d\n", a.array[9]); // print 10th element
printf("%d\n", a.used); // print number of elements
freeArray(&a);
関連
-
[解決済み】警告:互換性のないポインタ型からの代入
-
[解決済み] clang: error: linker command failed with exit code 1が表示されるのはなぜですか?
-
[解決済み】「構造体でもユニオンでもないものにメンバー'*******'を要求する」とはどういう意味ですか?
-
[解決済み】サイズ8の無効な読み取り - Valgrind + C
-
[解決済み】C言語で多重定義を防ぐには?
-
[解決済み】0LLや0x0ULの意味は何ですか?
-
[解決済み】int型配列へのポインタのスカラ・イニシャライザの過剰要素
-
[解決済み】Makefile:1: ***セパレータがありません。停止します。
-
[解決済み] C言語で配列のサイズを決定するにはどうすればよいですか?
-
[解決済み] 配列のすべてのメンバーを同じ値で初期化するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Cコンパイルエラー。"変数サイズのオブジェクトが初期化されていない可能性がある"
-
[解決済み】Valgrind が "Invalid write of size 8" で文句を言う。
-
[解決済み】C 言語の添え字で配列の要素値を代入すると、配列でもポインタでもベクトルでもない値になる
-
[解決済み】"Expected expression before ' { ' token"(トークンの前に期待される式)。
-
[解決済み】ISO C90では、C言語での宣言とコードの混在が禁止されています。
-
[解決済み】ポインタと整数の比較で警告が出る
-
[解決済み】警告。この関数ではXが初期化されていない状態で使用される可能性があります。
-
[解決済み] char pointers: 'char*' から 'char' への無効な変換?
-
[解決済み] mallocの結果はキャストするのですか?
-
[解決済み] ある数字が2の累乗かどうかを確認する方法