C ++ STL векторный итератор ... но получил ошибку во время выполнения - PullRequest
0 голосов
/ 02 апреля 2010

Я изучаю STL и сделал проект win32 ..

Но я застрял в ошибке во время выполнения ..

Я пытался отладить его, но ..

(частичный код)

vector<Vertex> currPoly=polygons.back();
vector<Vertex>::iterator it;


for(it=currPoly.begin();it!=currPoly.end();++it){
    vector<Vertex>::iterator p1;
    vector<Vertex>::iterator n1;
    vector<Vertex>::iterator n2;

    if(         it==currPoly.begin()){
        p1=currPoly.end();
        n1=it+1;
        n2=it+2;
    }else if(   it==currPoly.end()-1){
        p1=it-1;
        n1=it+1;
        n2=currPoly.begin();
    }else if(   it==currPoly.end()){
        p1=it-1;
        n1=currPoly.begin();
        n2=currPoly.begin()+1;
    }else{
        p1=it-1;
        n1=it+1;
        n2=it+2;
    }
    int tmp;
    tmp=it->x;
    tmp=p1->x;

пожалуйста нажмите , чтобы увидеть отладочную картинку

это очень странно, потому что

в таблице часов,

n1, p1, оно определено, но n2 нет и тмп тоже не ..

Я не могу найти, что не так ...

помогите пожалуйста ..

Ответы [ 4 ]

1 голос
/ 03 апреля 2010

Вы должны быть немного более ясны в том, что именно ваш вопрос ...

Если вам интересно, почему значения для n1 и tmp не могут отображаться в отладчике, я думаю, это потому, что вы отлаживаете сборку релиза (или какую-то сборку оптимизации), и компилятор, вероятно, «оптимизировал» эти переменные к этому моменту в потоке выполнения (он решил, что они больше не используются или их значения могут быть получены в другом месте).

Попробуйте отладить неоптимизированную сборку.

Кстати, ошибка CXX0017 (то, что отладчик отображает для этих переменных) означает «Ошибка оценщика выражений».

0 голосов
/ 02 апреля 2010

Как примечание:

}else if(   it==currPoly.end()){
    p1=it-1;
    n1=currPoly.begin();
    n2=currPoly.begin()+1;
}

Этого никогда не должно быть.

int tmp;
tmp=it->x;
tmp=p1->x;

Это выглядит немного бессмысленно.

0 голосов
/ 02 апреля 2010

У вас все еще есть проблема с идеей, что currPoly.end () не указывает на допустимый элемент. end () указывает на один после последнего действительного элемента.

Поскольку вы используете вектор в качестве кольца, использование целочисленных индексов в векторе фактически будет лучшим способом написания вашего кода. Вы можете модифицировать индексы по размеру вектора вместо написания специального кода. Но так как вы делаете это для изучения STL, мы будем придерживаться итераторов. Вот как я думаю, правильный код должен выглядеть (я не скомпилировал его, чтобы посмотреть, работает ли он):

vector<Vertex> currPoly=polygons.back();
vector<Vertex>::iterator it;


for(it=currPoly.begin();it!=currPoly.end();++it){
    vector<Vertex>::iterator p1;
    vector<Vertex>::iterator n1;
    vector<Vertex>::iterator n2;

    if(it==currPoly.begin()){
        p1=currPoly.end()-1;
        n1=it+1;
        n2=it+2;
    }else if(it==currPoly.end()-1){
        p1=it-1;
        n1=currPoly.begin();
        n2=n1+1;
    }else if(it==currPoly.end()-2){
        p1=it-1;
        n1=it+1;
        n2=currPoly.begin();
    }else{
        p1=it-1;
        n1=it+1;
        n2=it+2;
    }
    int tmp;
    tmp=it->x;
    tmp=p1->x;
}

И вот что я думаю, что индексная версия будет выглядеть (опять же, не проверял это с помощью компилятора):

vector<Vertex> currPoly=polygons.back();


for(int i=0; i < currPoly.size(); ++i){
    int p1 = (i+currPoly.size()-1)%currPoly.size();
    int n1 = (i+1)%currPoly.size();
    int n2 = (i+2)%currPoly.size();

    int tmp;
    tmp=currPoly[i].x;
    tmp=currPoly[p1].x;
}
0 голосов
/ 02 апреля 2010

Гарантируется ли, что многоугольник всегда имеет как минимум 3 балла? Кроме того, внимательно посмотрите на ваш первый, если. Вы помните, что конец () один за концом? (В большинстве случаев, кажется, но могут быть / есть места, где с этим что-то не так ...)

...