【问题标题】:Vector not clearing correctly矢量未正确清除
【发布时间】:2016-04-08 20:00:00
【问题描述】:

我在清除向量向量时遇到问题。

我使用元组函数返回多个变量。

我连续两次调用元组函数(每次使用不同的文件)。

当我检查函数的输出时,我得到相当于

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

而不是 vector1.size= vector1.size 和 vector2.size = vector2.size。

这让我相信某处在函数调用之间没有正确清除向量,这导致第二个输出写在第一个输出之上。

下面是我的代码:

main() 和声明

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() 中,我为所有内容创建了新变量。

读取文件()

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();

}

过去几个小时我一直在试图弄清楚为什么会发生这种情况,但没有成功,所以任何帮助都将不胜感激。如果您有任何疑问,请告诉我。 干杯!

【问题讨论】:

  • 听起来您可能需要学习如何使用调试器来单步调试您的代码。使用好的调试器,您可以逐行执行您的程序,并查看它与您期望的偏差在哪里。如果您要进行任何编程,这是必不可少的工具。延伸阅读:How to debug small programs
  • 我试过调试代码,但没有成功找到解决这个问题的方法。我无法确定将vector2 设置为vector1 + vector2 的位置。

标签: c++ vector tuples


【解决方案1】:

想通了。

我已经声明了所有的身体向量(lowerBackXVector lowerBackYVector lowerBackZVector) 等在函数之外,因此它们没有被重置。我在函数中定义了它们,现在它工作得很好。谢谢大家。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2020-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多