1

作成したクラスのオブジェクトのベクトルがあり、各オブジェクトには 4 つの変数 (2 つの double、1 つの int、および bool) が含まれています。int は ID 番号として使用されているため、ベクター内のどのオブジェクトがどれであるかを追跡できますが、作成した別のクラスのメンバー関数は double で計算を実行し、bool (true と false) を操作します。ベクトルからの 2 つのランダム オブジェクトが互いに相互作用するように、random_shuffle を使用してベクトルを並べ替えていますが、ここで問題が発生しています。random_shuffle が動作した後、2 つの double と bool は適切に値を返します (私は思う) が、最初の ID 番号を持つオブジェクトを除くすべての ID 番号に対して、ID 番号 int が意味不明 (-858993460) として返されます。これは、コードの一般的なバージョンです。ID番号を印刷するのを手伝ってくれる人はいますか?大変感謝しております。

int main()
{
    CalculationClass CalculationObject;

    int vectorsize; // number of objects from class "Object" to create
    vectorsize = PromptForVectorSize(); // user inputs number of objects to create
    std::vector<Object> ObjectVector(vectorsize, Object() );    

    int iterations;    // number of loops to run 
    iterations = PromptForIterations(); // user inputs number of loops



    for(int z = 0; z<ObjectVector.size(); z++) // gives signed/unsigned warning
    {   // Gives each object an ID number //
    CalculationObject.EstablishIDNumbers(ObjectVector[z], z);
    }   


    for(int i = 0; i<iterations; i++)
    {
    cout << "========================================="     << endl;
    cout << "RUN NUMBER " << i+1 << endl;


        std::random_shuffle (ObjectVector.begin(), ObjectVector.end());


        for(size_t x = 0; x<ObjectVector.size(); x+=2)          
        {

            cout << ObjectVector[x].getIDNumber() << endl;
            cout << ObjectVector[x].getObjectDouble() << endl;
            cout << ObjectVector[x+1].getIDNumber() << endl;
                            cout << ObjectVector[x+1].getObjectDouble() << endl;

            CalculationObject.Function(ObjectVector[x], ObjectVector[x+1]);

                            cout << ObjectVector[x].getIDNumber() << endl;
            cout << ObjectVector[x].getObjectDouble() << endl;
            cout << ObjectVector[x+1].getIDNumber() << endl;
                            cout << ObjectVector[x+1].getObjectDouble() << endl;

            cout << "=========================================" << endl;

        }
    }

    return 0;
}
4

1 に答える 1

2

たとえばvectorsize、5 を考えてみましょう。ランダム シャッフル操作の後 -

for(size_t x = 0; x<ObjectVector.size(); x+=2)          
{
    ObjectVector[x].getIDNumber()
    ObjectVector[x+1].getIDNumber()
    ....

反復変数の値は 0、2、4xになります。4 のとき、条件は満たされます (4<5)。しかし、実際の問題は、ベクトル要素に 4、5 インデックスでアクセスしていることです。サイズ 5 のベクトルの有効なインデックスは 0 ~ 4 です。したがって、プログラムの動作は未定義です。

于 2013-08-16T21:03:28.730 に答える