2

ゲーム (Red Alert 3) を「ハッキング」しようとしています。対戦相手のユニット リストを表示するプログラムを作成しようとしています。それに関しては、最初に、シングルプレイヤーで実行できる自分のリストへの (静的) ポインターを見つける必要があります。

私はこの動作に気付きました: (どのアドレスが add_unit コードによって変更されたかを見ることによって):

  • ユニットがまだ構築されていない場合は、新しいアドレスを作成し (ランダム?)、値を 1 (そのタイプのユニットの数) に設定します。
  • ユニットがゲーム内で一度ビルドされている場合、ユニット タイプの元のアドレスを 1 増やします。

これは std::vector の動作のように見えます。現在、ベクトルの「ベース」アドレスを見つけるのに問題があり、さらに大きな問題があります。インデックスでアクセスするにはどうすればよいですか? std::vector は要素のアドレスをどこに格納しますか?

追加情報:

コードは (アセンブリから読み取ったものから) MS Visual C++ 2005 でコンパイルされています (再生するには MSVCR80 dll が必要です)。

ベクトル内のアドレスは次のようになります。

ここに画像の説明を入力

(強調表示されたアドレスは、最初の要素として表示されたアドレスです - 最初のユニット ビルド)

これは、定数値を追加して反復できるようには見えませんか?

新しいアドレスが追加されるたびに、他のすべてのアドレスは完全に有効であり、変更されません。

4

1 に答える 1

4

典型的な (決して必須ではありませんが) の実装vectorは、3 つの連続した単語を持つことです。

struct TypicalVector
{
    T * start;
    T * end;
    T * capacity;
};

要素へのアクセスは(不必要なオフセット計算を避けるためにポインタを先頭start[i]に置くことが重要なのはそのためです)、サイズは、容量はです。メモリ割り当てはバイトを取得し、割り当てられたメモリのアドレスと に設定します。要素の構築が増加します。startend - startcapacity - startc * sizeof(T)startcapacitystart + cend

于 2013-03-29T10:46:54.880 に答える