Мои векторы исчезают - PullRequest
0 голосов
/ 27 июля 2011

Итак, у меня проблема в двух методах, опубликованных ниже. Помимо ужасного именования переменных, у меня есть только одна проблема. Каким-то образом между getData и cutRamping мой вектор TwoDee исчезает. Я отследил его с помощью gdb, и в конце getData он заполняется значениями, но когда я пытаюсь отследить его вручную или программа пытается использовать его в cutRamping, он выдает ошибку, связанную с итератором в векторе, и когда Я говорю GDB для печати вектора, он печатает 0x0 вместо действительного адреса памяти. Эти два метода буквально вызываются вплотную, так что я не знаю, как я мог бы потерять данные в векторе TwoDee без вызова каких-либо методов, которые бы это делали. Любая помощь будет оценена!

заголовочный файл:

class Deviation
{
public:
    Deviation();
    void graphDev(std::string infile, std::string outfile1, std::string outfile2, std::vector<double> plats);

private:
    void getData();
    void cutRamping();
    void calcDev();
    void makeGraph();

    std::string input, output1, output2;
    std::vector<double> current, dx, dy, gcurrent, gdx, gdy, gdevx, gdevy, tempcurrent, tempdx, tempdy, plateaus;
    std::vector< std::vector<double> > TwoDee, FileOut, FileOutTemp; // File Out is a 2-D array that holds the Strength, b3-6 and a3-6 that are to be written to the file in that order where the Temp just holds each plateau value
    std::vector<double> curRow;
};

файл cpp:

void Deviation::getData()
{
    float f;
    vector< vector<float> > TwoDee;
    vector <float> curRow;
    TwoDee.clear();
    curRow.clear();
    FILE * pFile;
    ifstream inFile(input.c_str());
    // Counts the number of lines in the file
    unsigned int lines = count(istreambuf_iterator<char>(inFile), istreambuf_iterator<char>(), '\n');
    inFile.close();
    pFile = fopen (input.c_str(),"r");
    // Pushes all of the data into a 2-D vector
    for (unsigned int j = 0; j<lines; j++)
    {
        for (unsigned int i = 0; i<37; i++)
        {
            fscanf (pFile, "%f", &f);
            curRow.push_back((double)f);
            // Just says that it pushed back a value
            //cout<<"just pushed back "<<f<<endl;
        }
        TwoDee.push_back(curRow);
        curRow.clear();
    }

    fclose (pFile);

    for (unsigned int i = 0; i<TwoDee[0].size(); i++)
    {
        current.push_back(TwoDee[1][i]);
        dx.push_back(TwoDee[4][i]);
        dy.push_back(TwoDee[5][i]);
    }
}

void Deviation::cutRamping()
{
    // Moved these out of the loop for now
    tempcurrent.clear();
    tempdx.clear();
    tempdy.clear();
    unsigned int i = 0;
    bool keepgoing = true;
    for (unsigned int j = 0; j<plateaus.size(); j++)
    {
        keepgoing = true;
        while (i<current.size()&&keepgoing)
        {
            if (fabs(plateaus[j]-current[i]) < 0.2 && i<current.size()) // (0.2 is the tolerance to determine if the current is ramping or not)
            {
                tempcurrent.push_back(current[i]);
                tempdx.push_back(dx[i]);
                tempdy.push_back(dy[i]);
                FileOutTemp[0].push_back(TwoDee[3][i]);

    // ...
    // Rest of the method that never gets called
}

1 Ответ

2 голосов
/ 27 июля 2011

Вектор в getData является «теневым» (скрывающим) вектором в вашем классе, а затем, когда выходит getData, все содержимое вектора освобождается.Вероятно, вам не следует переопределять его в методе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...