jeudi 24 septembre 2015

Valgrind shows "Invalid read of size 8" while reading file

I have a simple method which is searching for exact values in the vectors (data obtained from file) or interpolating the not existing once. I have been running this program many times before and it was working and suddenly it's not. The code:

double  Integr::F(double x_val, double q2_val){

    int i=0;
    bool interpolate_x=0, interpolate_q=0;

    vector<double>::iterator it = begin(x_f);
    for(; it != end(x_f) ; it += 201){

        if(*it == x_val){
            interpolate_x = 0;
            break;
        }
        else if(*it > x_val){
            interpolate_x = 1;
            break;
        }
        i += 201;
    }

    it = begin(q2)+i;
    for(; it != end(q2) ; ++it){

        if(*it == q2_val){
            interpolate_q = 0;
            break;
        }
        else if(*it > q2_val){
            interpolate_q = 1;
            break;
        }
        ++i;
    }
    double f1, f2;
    if(interpolate_x){

        f1 = Interpolate::interpolate(f[i], f[i-201], x_f[i], x_f[i-201], x_val);
        f2 = Interpolate::interpolate(f[i-1], f[i-202], x_f[i-1], x_f[i-202], x_val);
        if(!interpolate_q) return f1;
        else{
            return Interpolate::interpolate(f1, f2, q2[i], q2[i-1], q2_val);
        }
    }
    if(interpolate_q){

        return Interpolate::interpolate(f[i], f[i-1], q2[i], q2[i-1], q2_val);
    }
    else return f[i];
}

Firstly, valgrind shows:

==4138== Invalid read of size 8
==4138== at 0x4021C8: Integr::F(double, double) (Integr.cpp:81)

and it points to the last line in the above method:

else return f[i];

Can anyone tell me what is wrong?

Aucun commentaire:

Enregistrer un commentaire