Skocz do zawartości

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

P_aul

[C++] out_of_range exception przy dodawaniu do vectora

Polecane posty

Mam wybitnie kretyński problem. Im dłużej nad nim siedzę tym ciekawsze wyjątki się pojawiają... Do rzeczy:

Poniżej prezentuję fragment implementacji algorytmu A*:

//tworzę vectory otwartych i zamkniętych wierzchołków
vector<Cell*> *open = new vector<Cell*>();
vector<Cell*> *closed = new vector<Cell*>();
//ustawiam wierzchołek startowy
open->push_back(level->getCell(startX, startY));

while(true){

        //Warunki wyjścia - nie mam więcej otwartych wierzchołków lub doszedłem do końca
        if(open->empty()) break;
        for(int m=0;m<closed->size();m++){
            if(closed->at(m)->x==endX && closed->at(m)->y==endY) break;
        }


//Wybór aktualnego wierzchołka (najmniejsza suma koszt+heurystyka)
        int found = -1;
        for(int i = 0; i<open->size(); i++){
            if(found==-1) found=i;
            if(open->at(found)->getSum()>open->at(i)->getSum()) found=i;
        }
        Cell *c = open->at(found);
        if(c!=NULL){ //jeśli jakimś cudem dotarł do tego miejsca i c nadal jest null...
            closed->push_back(c);
            open->erase(open->begin()+found);
            cx=c->x;
            cy=c->y;
        }
        else
            break;

/*Tu zaczynają się zabawy kolejnymi wierzchołkami*/

w momencie gdy próbuje dodać do closed znaleziony wierzchołek (closed->push_back( c ) ) wyrzuca mi błąd out_of_range. Debugger twierdzi, że c w tym momencie istnieje i ma się dobrze, natomiast zrzut na konsole rozmiaru vectora przed wejściem do krytycznej instrukcji wykazuje 0, ale jeśli się nie mylę to vector powinien sam zmieniać swój rozmiar (po to go do diablo używam, żeby się nie męczyć z alokacją, aye?)

Jakieś pomysły?

EDIT: Zapomniałem dopisać - to NIE wina pętli, przed rzuceniem wyjątku wchodzi do niej dokładnie raz, więc nie zapycham sobie niechcący pamięci ;)

EDIT2: Właśnie zauważyłem jeden kretyński błąd - break wyjdzie mi z for, nie z while, poprawiłem ;]

Link do komentarza
Udostępnij na innych stronach

To jest dziwny zapis

if(found==-1) found=i;

Znaczy kumam co to robi, dziwi mnie jednak użycie takiej konstrukcji.

Może od razu ustaw found na 0 ?

Skoro korzystasz z vectora, i masz problemy z przekroczeniem rozmiaru tablicy, to może użyj iteratorów?

Popracuj nad formatowaniem kodu.

Link do komentarza
Udostępnij na innych stronach

Szybkie info - problem znalazłem, po prostu po tysięcznej przeróbce czasem próbowałem czytać z pustego open. Jednak 8 godzin programowania mi nie służy. Swoją drogą dobra rada Mormegil, czasem przekombinowuje =)

Link do komentarza
Udostępnij na innych stronach

Gość
Temat jest zablokowany i nie można w nim pisać.


  • Kto przegląda   0 użytkowników

    • Brak zalogowanych użytkowników przeglądających tę stronę.
×
×
  • Utwórz nowe...