0

私は学生で、まだベクトルを教えられていませんが、今すぐ使用する必要があります。構造体のベクトルを作成しようとしています。構造体は、アセンブリ コードのラベルです。ラベルを追加するたびにベクトルのサイズを変更しますが、ラベルから情報を取得しようとすると、それらはすべて同じです。残念ながら実際にコードを共有することはできませんが、この問題を解決するために必要な行を示します。それで、私は何を間違っていますか?さらにコードが必要な場合は、お知らせください。

グローバルに宣言:

vector<Label> labeldir;

ベクトルのサイズを変更し、情報を追加します。label は、アセンブリ コードのファイル内のラベルの名前です。

labeldir.resize(labelnum + 1);
labeldir[labelnum].name = label;

注: これは while ループで実行されており、ラベルが見つかるたびに labelnum がインクリメントされます。

各ラベルの名前にアクセスする例:

for (int i = 0; i < labeldir.size(); i++){
    cout << "Label entry " << i << " name : " << labeldir[i].name << endl;
}

対応する出力で、問題に注意してください (上記のコードは while ループ内にあり、これは 3 回繰り返されます)。

Label entry 0 name : start
Label entry 0 name : done
Label entry 1 name : done
Label entry 0 name : five
Label entry 1 name : five
Label entry 2 name : five

アセンブリ コードの最初の 3 つのラベル。最初のラベルと 2 番目のラベルの間に行がありますが、通常の命令です。

start   add 1   2   1   decrement reg1
done    halt                end of program
five    .fill   5
4

3 に答える 3

2

あなたが間違っていることを正確に理解するのは少し難しいですが、推測させてください:

ベクトルをロードするコードは、おそらく次のようになります。

#include <string>

struct Label
{
    Label(const std::string& N) : Name(N)
    {}

    Label()
    {}

    std::string Name;
};

int main()
{
    std::vector<Label> labeldir;

    labeldir.push_back(Label("one"));
    labeldir.push_back(Label("two"));
    labeldir.push_back(Label("three"));
    labeldir.push_back(Label("four"));

    int i = 0;
    for(auto l : labeldir)
    {
        std::cout << "Label entry " << i++ << " name : " << l.Name << "\n";
    }

    system("PAUSE");
    return 0;
}
于 2013-04-22T04:18:08.753 に答える
2

あなたの構造のnameメンバーは. つまり、ラベルごとに個別の文字列を作成する代わりに、個別のポインターを作成するだけですが、それらはすべて同じ場所を指しています。Labelchar *

コンテンツを印刷しようとすると、それらはすべて同じバッファーを指しているため、すべての Label はそのバッファーに最後に読み込まれた名前を示します。

治療法:std::stringの代わりに使用しchar *ます。

于 2013-04-22T04:18:40.270 に答える