2016-04-08 19 views
-1

ベクターベクターをクリアする際に問題があります。ベクターが正しくクリアされない

私はタプル関数を使用して複数の変数を返します。

タプル関数を2回連続して呼び出します(毎回異なるファイルを使用します)。

私は、関数からの出力をチェックすると、私はむしろ vector1.size= vector1.sizevector2.size = vector2.sizeより

vector1.size = vector1.sizevector2.size = (vector1.size + vector2.size)

相当を取得します。

これは、ファンクションコールの間にベクトルが正しくクリアされておらず、2番目の出力が最初の出力の上に書き込まれていると考えられます。以下は

私のコードです:

(メイン

)と宣言

tuple<vector<float>, vector<vector<float>>, int> ReadFile(string fileToBeRead); 

vector<float> sadInterpolationStorage; 
vector<vector<float>> sadInterpolationVectorStorage; 
vector<float> userInterpolationStorage; 
vector<vector<float>> userInterpolationVectorStorage; 
int sadAnimationLength; 
int inputAnimationLength; 

int main() { 

    tie(sadInterpolationStorage, sadInterpolationVectorStorage, sadAnimationLength) = ReadFile(sadWalkCycleMocapFile); 

    tie(userInterpolationStorage, userInterpolationVectorStorage, inputAnimationLength) = ReadFile(inputMocapFile); 

cout << sadInterpolationVectorStorage[1].size() << endl; 
cout << userInterpolationVectorStorage[1].size() << endl; 


return 0; 
} 

userInterpolationVectorStorage[1].size()は常に (sadInterpolationVectorStorage[1].size()+ sadInterPolationVectorStorage[1].size()の和に等しくなります。 のどこかでベクターが消去されていないようですが、ReadFile()にはすべての変数が作成されます。

のReadFile()

tuple<vector<float>, vector<vector<float>>, int> ReadFile(string fileToBeRead) { 
string firstLineInFile; 
string secondLineInFile; 
string thirdLineInFile; 
vector<float> interpolationStorage; 
vector<vector<float>> interpolationVectorStorage; 
int animationLength = 0; 
vector<vector<float>> vectorStorage; 

//Create a vector to hold all the mocap data values in float form. 
vector<float> floatTokens; 
//Create a vector to hold an entire frame (the data and the words). 
vector<string> oneFrame; 

//Create an input file stream 
ifstream in(fileToBeRead, ios::in); 
//cases to handle the first 3 lines of the file (first 3 lines contain no data, but are necessary) 
//extracts each line into an object and writes them to the top of the output file 
getline(in, firstLineInFile); 
getline(in, secondLineInFile); 
getline(in, thirdLineInFile); 


//loop until the end of the file is reached 
while (in.eof() == 0) { 

    //create a buffer to store each frame 
    stringstream buffer; 
    //write the frameID to the file. 
    extractFrameID(in); 
    //loop around the 29 lines in a frame, push each line into the vector. 
    for (int i = 0; i < 29; i++) { 
     string tempString; 
     getline(in, tempString); 

     //if the end of the file is reached (.empty() is used as the last line in the mocap file is always an empty line. 
     if (tempString.empty()) { 

#pragma region Storing all data vectors in a vector 
      vectorStorage.push_back(rootXVector); 
      vectorStorage.push_back(rootZVector); 

      vectorStorage.push_back(lowerBackXVector); 
      vectorStorage.push_back(lowerBackYVector); 
      vectorStorage.push_back(lowerBackZVector); 
      vectorStorage.push_back(upperBackXVector); 
      vectorStorage.push_back(upperBackYVector); 
      vectorStorage.push_back(upperBackZVector); 
      vectorStorage.push_back(thoraxXVector); 
      vectorStorage.push_back(thoraxYVector); 
      vectorStorage.push_back(thoraxZVector); 
      vectorStorage.push_back(lowerNeckXVector); 
      vectorStorage.push_back(lowerNeckYVector); 
      vectorStorage.push_back(lowerNeckZVector); 
      vectorStorage.push_back(upperNeckXVector); 
      vectorStorage.push_back(upperNeckYVector); 
      vectorStorage.push_back(upperNeckZVector); 
      vectorStorage.push_back(headXVector); 
      vectorStorage.push_back(headYVector); 
      vectorStorage.push_back(headZVector); 
      vectorStorage.push_back(rClavicleYVector); 
      vectorStorage.push_back(rClavicleZVector); 
      vectorStorage.push_back(rHumerusXVector); 
      vectorStorage.push_back(rHumerusYVector); 
      vectorStorage.push_back(rHumerusZVector); 
      vectorStorage.push_back(rRadiusXVector); 
      vectorStorage.push_back(rWristYVector); 
      vectorStorage.push_back(rHandXVector); 
      vectorStorage.push_back(rHandYVector); 
      vectorStorage.push_back(rFingersXVector); 
      vectorStorage.push_back(rThumbXVector); 
      vectorStorage.push_back(rThumbZVector); 
      vectorStorage.push_back(lClavicleYVector); 
      vectorStorage.push_back(lClavicleZVector); 
      vectorStorage.push_back(lHumerusXVector); 
      vectorStorage.push_back(lHumerusYVector); 
      vectorStorage.push_back(lHumerusZVector); 
      vectorStorage.push_back(lRadiusXVector); 
      vectorStorage.push_back(lWristYVector); 
      vectorStorage.push_back(lHandXVector); 
      vectorStorage.push_back(lHandYVector); 
      vectorStorage.push_back(lFingersXVector); 
      vectorStorage.push_back(lThumbXVector); 
      vectorStorage.push_back(lThumbZVector); 
      vectorStorage.push_back(rFemurXVector); 
      vectorStorage.push_back(rFemurYVector); 
      vectorStorage.push_back(rFemurZVector); 
      vectorStorage.push_back(rTibiaXVector); 
      vectorStorage.push_back(rFootXVector); 
      vectorStorage.push_back(rFootZVector); 
      vectorStorage.push_back(rToesXVector); 
      vectorStorage.push_back(lFemurXVector); 
      vectorStorage.push_back(lFemurYVector); 
      vectorStorage.push_back(lFemurZVector); 
      vectorStorage.push_back(lTibiaXVector); 
      vectorStorage.push_back(lFootXVector); 
      vectorStorage.push_back(lFootZVector); 
      vectorStorage.push_back(lToesXVector); 
#pragma endregion 
      //loop for every data type, 58 or so 
      for (size_t i = 0; i < vectorStorage.size(); i++) { 
       //interpolate between each data value and store the result in a vector. 
       //loop for every data value of every data type , 227 or so (1 per frame). 
       for (size_t j = 1; j < vectorStorage[i].size(); j++) 
       { 

        interpolationStorage.push_back(vectorStorage[i][j] - vectorStorage[i][j - 1]); 

       } 
       interpolationVectorStorage.push_back(interpolationStorage); 
       interpolationStorage.clear(); 

      } 
      vectorStorage.clear(); 

      cout << "Reading of " << fileToBeRead << " completed" << endl; 

      return make_tuple(interpolationStorage, interpolationVectorStorage, animationLength); 
     } 
     oneFrame.push_back(tempString); 
    } 

    //populate the buffer with the vector. 
    copy(oneFrame.begin(), oneFrame.end(), ostream_iterator<string>(buffer, "\n")); 

    //split the buffer up into tokens(objects) and store them into a vector 
    vector<string> mainTokenVector = split(buffer.str(), ' '); 

    //defining vectors. 
    vector<float> floatTokenVector; 
    vector<string> stringTokenVector; 

    //loop to split up the token vector into strings and floats, and store them in vectors 
    for (size_t i = 0; i < mainTokenVector.size(); i++) { 
     //if the token is a string, put it in the string vector 
     if (isFloat(mainTokenVector[i]) == 0) { 
      stringTokenVector.push_back(mainTokenVector[i]); 
     } 
     //if the token is a float, put it in the float vector 
     else if (isFloat(mainTokenVector[i]) == 1) { 
      floatTokenVector.push_back(stof(mainTokenVector[i])); 
     } 

    } 

#pragma region Pushing data values to vectors 
    //pushing all data values to their responding vectors in order to interpolate between them later. 

    rootXVector.push_back(floatTokenVector[0]); 
    rootZVector.push_back(floatTokenVector[2]); 

    lowerBackXVector.push_back(floatTokenVector[6]); 
    lowerBackYVector.push_back(floatTokenVector[7]); 
    lowerBackZVector.push_back(floatTokenVector[8]); 
    upperBackXVector.push_back(floatTokenVector[9]); 
    upperBackYVector.push_back(floatTokenVector[10]); 
    upperBackZVector.push_back(floatTokenVector[11]); 
    thoraxXVector.push_back(floatTokenVector[12]); 
    thoraxYVector.push_back(floatTokenVector[13]); 
    thoraxZVector.push_back(floatTokenVector[14]); 
    lowerNeckXVector.push_back(floatTokenVector[15]); 
    lowerNeckYVector.push_back(floatTokenVector[16]); 
    lowerNeckZVector.push_back(floatTokenVector[17]); 
    upperNeckXVector.push_back(floatTokenVector[18]); 
    upperNeckYVector.push_back(floatTokenVector[19]); 
    upperNeckZVector.push_back(floatTokenVector[20]); 
    headXVector.push_back(floatTokenVector[21]); 
    headYVector.push_back(floatTokenVector[22]); 
    headZVector.push_back(floatTokenVector[23]); 
    rClavicleYVector.push_back(floatTokenVector[24]); 
    rClavicleZVector.push_back(floatTokenVector[25]); 
    rHumerusXVector.push_back(floatTokenVector[26]); 
    rHumerusYVector.push_back(floatTokenVector[27]); 
    rHumerusZVector.push_back(floatTokenVector[28]); 
    rRadiusXVector.push_back(floatTokenVector[29]); 
    rWristYVector.push_back(floatTokenVector[30]); 
    rHandXVector.push_back(floatTokenVector[31]); 
    rHandYVector.push_back(floatTokenVector[32]); 
    rFingersXVector.push_back(floatTokenVector[33]); 
    rThumbXVector.push_back(floatTokenVector[34]); 
    rThumbZVector.push_back(floatTokenVector[35]); 
    lClavicleYVector.push_back(floatTokenVector[36]); 
    lClavicleZVector.push_back(floatTokenVector[37]); 
    lHumerusXVector.push_back(floatTokenVector[38]); 
    lHumerusYVector.push_back(floatTokenVector[39]); 
    lHumerusZVector.push_back(floatTokenVector[40]); 
    lRadiusXVector.push_back(floatTokenVector[41]); 
    lWristYVector.push_back(floatTokenVector[42]); 
    lHandXVector.push_back(floatTokenVector[43]); 
    lHandYVector.push_back(floatTokenVector[44]); 
    lFingersXVector.push_back(floatTokenVector[45]); 
    lThumbXVector.push_back(floatTokenVector[46]); 
    lThumbZVector.push_back(floatTokenVector[47]); 
    rFemurXVector.push_back(floatTokenVector[48]); 
    rFemurYVector.push_back(floatTokenVector[49]); 
    rFemurZVector.push_back(floatTokenVector[50]); 
    rTibiaXVector.push_back(floatTokenVector[51]); 
    rFootXVector.push_back(floatTokenVector[52]); 
    rFootZVector.push_back(floatTokenVector[53]); 
    rToesXVector.push_back(floatTokenVector[54]); 
    lFemurXVector.push_back(floatTokenVector[55]); 
    lFemurYVector.push_back(floatTokenVector[56]); 
    lFemurZVector.push_back(floatTokenVector[57]); 
    lTibiaXVector.push_back(floatTokenVector[58]); 
    lFootXVector.push_back(floatTokenVector[59]); 
    lFootZVector.push_back(floatTokenVector[60]); 
    lToesXVector.push_back(floatTokenVector[61]); 
#pragma endregion 

    //clear the vectors to prepare them for the next frame. 
    oneFrame.clear(); 
    mainTokenVector.clear(); 
    stringTokenVector.clear(); 
    floatTokenVector.clear(); 
    animationLength++; 
} 
//close the file currently associated with the object, disassociating it from the stream. 
in.close(); 

}

ノー成功を収めて、なぜこれが起こっている把握しようと、過去数時間を費やしてきたので、すべての任意の助けをいただければ幸いです。ご質問がある場合は、私に知らせてください。 乾杯!

+0

デバッガを使用してコードをステップ実行する方法を学ぶ必要があるようです。良いデバッガを使用すると、プログラムを1行ずつ実行し、どこからずれているかを確認することができます。これはプログラミングをする場合に不可欠なツールです。詳しい読書:** [小さなプログラムをデバッグする方法](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)** – NathanOliver

+0

私はコードをデバッグしようとしましたが、これに対する解決策を見つけることに成功しませんでした。私は 'vector2'が' vector1 + vector2'に設定されているところを特定できません。 –

答えて

1

それを実演しました。

従って私は、彼らがリセットを取得していなかった、関数の外ですべてのボディベクトル(lowerBackXVector lowerBackYVector lowerBackZVector)などを宣言しました。私は関数内でそれらを定義し、今は完全に動作します。みんなありがとう。

関連する問題