ベクターベクターをクリアする際に問題があります。ベクターが正しくクリアされない
私はタプル関数を使用して複数の変数を返します。
タプル関数を2回連続して呼び出します(毎回異なるファイルを使用します)。
私は、関数からの出力をチェックすると、私はむしろ vector1.size= vector1.size
とvector2.size = vector2.size
より
vector1.size = vector1.size
と vector2.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();
}
ノー成功を収めて、なぜこれが起こっている把握しようと、過去数時間を費やしてきたので、すべての任意の助けをいただければ幸いです。ご質問がある場合は、私に知らせてください。 乾杯!
デバッガを使用してコードをステップ実行する方法を学ぶ必要があるようです。良いデバッガを使用すると、プログラムを1行ずつ実行し、どこからずれているかを確認することができます。これはプログラミングをする場合に不可欠なツールです。詳しい読書:** [小さなプログラムをデバッグする方法](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)** – NathanOliver
私はコードをデバッグしようとしましたが、これに対する解決策を見つけることに成功しませんでした。私は 'vector2'が' vector1 + vector2'に設定されているところを特定できません。 –