Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

prekid programa sa greskom "signal 11"

[es] :: C/C++ programiranje :: prekid programa sa greskom "signal 11"

[ Pregleda: 2153 | Odgovora: 15 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Alexe
Beograd

Član broj: 172465
Poruke: 37
77.243.16.*



Profil

icon prekid programa sa greskom "signal 11"29.03.2010. u 19:05 - pre 170 meseci
Pokusavam da prepravim neki kod koji ce, umesto dosadasnje jedne promenjive nekog tipa, porediti listu pokazivaca tog tipa sa drugom promenjivom (istog tipa) i dalje izvrsavati program u zavisnosti od rezultata uslovne petlje. Kod je dat ispod sa definicijom tri metode koje pozivaju jedna drugu. Ono sto dobijam u trenutku kada program treba da poredi elemente (novoformirane) liste sa nekom promenjivom je "program terminated with signal 11". Ok, recimo da razumem znacenje ove poruke, da li neko vidi gresku u kodu? Dodao sam neke test metode i asserte u kodu pre ovog poredjenja na osnovu kojih vidim da su mi oba operanda razlicita od nule. Takodje, kompajliranje prolazi bez greske, sto znaci da su tipovi koji se porede isti.
Code:

template<class A>
int
DecisionTable<A>::add_route(InternalMessage<A> &rtmsg, 
                BGPRouteTable<A> *caller) {
    //find the alternative routes, and the old winner if there was one.
    list<RouteData<A>* > old_winner;  //promenjeno u listu pokazivaca na dati tip. Pre ovoga je bila jedna promenjiva tog tipa
    list<RouteData<A> > alternatives;
    old_winner = find_alternative_routes_new(caller, rtmsg.net(), alternatives); //ova metoda je definisana ispod i vraca listu pokazivaca tipa RouteData 
    RouteData<A> *new_winner = NULL;
    RouteData<A> new_route(rtmsg.route(), rtmsg.attributes(), caller,  //inicijalizacija new_route 
               rtmsg.origin_peer(), rtmsg.genid());
    if (!alternatives.empty()) {       //lista alternatives se formira metodom find_alternative_routes_new (ispod) 
        //add the new route to the pool of possible winners.
    alternatives.push_back(new_route);
    new_winner = find_winner(alternatives); //metoda find_winner vraca pobednika iz liste alternativa 
    } else {  
    //the new route wins by default
    new_winner = &new_route; 
    }
    if (!old_winner.empty()) {                       
       typename list<RouteData<A>* >::iterator it;                                               
       typename list<RouteData<A>* >::iterator j;                                               
       for (it = old_winner.begin(); it != old_winner.end(); it++)     //prolaz kroz listu alternativa                                                               
    if ((*it)->route() == new_winner->route()) {   //program ovde puca (signal 11) iako su oba operanda razlicita od nule (testirano!) 
        //the winner didn't change.
        XLOG_ASSERT(!old_winner.empty());                                                    
            for (j = old_winner.begin(); j != old_winner.end(); j++)                               
          delete *j;                                                                         
        return ADD_UNUSED;
        }        
    }         
//neki irelevantan kod u nastavku

template<class A>
list<RouteData<A>* >                                                            
DecisionTable<A>::find_alternative_routes_new(
    const BGPRouteTable<A> *caller,
    const IPNet<A>& net,
    list <RouteData<A> >& alternatives) const 
{
    list<RouteData<A>* > previous_winner;  //promenjeno u listu pokazivaca na dati tip. Pre ovoga je bila jedna promenjiva tog tipa                                         
    typename map<BGPRouteTable<A>*, PeerTableInfo<A>* >::const_iterator i;
    const SubnetRoute<A>* found_route;
    for (i = _parents.begin();  i != _parents.end();  i++) { 
    //We don't need to lookup the route in the parent that the new
    //route came from - if this route replaced an earlier route
    //from the same parent we'd see it as a replace, not an add
     if (i->first != caller) {
        uint32_t found_genid;
        FPAListRef found_attributes;
        found_route = i->first->lookup_route(net, found_genid,     //metoda definisana ispod 
                         found_attributes); 
        if (found_route != NULL) {
        PeerTableInfo<A> *pti = i->second;
        alternatives.push_back(RouteData<A>(found_route,           //popunjava listu alternativa 
                            found_attributes,
                            pti->route_table(),
                            pti->peer_handler(),
                            found_genid)); 
        if (found_route->is_winner()) {
            previous_winner.push_back(&(alternatives.back()));     //popunjava listu prethodnih pobednika
            }
          }
        }
    }
    return previous_winner;              //..i vraca listu prethodnih pobednika

template<class A>
const SubnetRoute<A>*
DecisionTable<A>::lookup_route(const IPNet<A> &net,
                   uint32_t& genid,
                   FPAListRef& pa_list) const
{
    list <RouteData<A> > alternatives;
    RouteData<A>* winner = find_alternative_routes(NULL, net, alternatives);
    if (winner == NULL) {
    return NULL;
     }
    else { 
    genid = winner->genid();
    pa_list = winner->attributes();
    return winner->route(); 
    }
    XLOG_UNREACHABLE(); 
    return NULL;
}


Hvala!
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: prekid programa sa greskom "signal 11"29.03.2010. u 19:25 - pre 170 meseci
Ti obrišeš objekte na koje se pokazuje iz old_winner, ali ne očistiš sam old_winner. Pointeri u njemu postaju nevalidni.
 
Odgovor na temu

Alexe
Beograd

Član broj: 172465
Poruke: 37
77.243.16.*



Profil

icon Re: prekid programa sa greskom "signal 11"29.03.2010. u 19:48 - pre 170 meseci
Aha...shvatam. Ali kako to da program ne prodje ni jednom kroz petlju? Trebao bi barem prvi put dok ne dodje do brisanja objekata na koje pokazuju pokazivaci u old_winner, zar ne? Ovo znam (to da ne prolazi) zato sto sam dodao neku logging funkciju odmah posle uslovne petlje i vidim da on uopste nije ni jednom prosao (i izbacio logging) kroz petlju. Mislio sam da na ovaj nacin brisem jedan po jedan objekat liste old_winner (koji ispunjava uslov u petlji) tako da moze ponovo da udje petlju...Neki predlog kako ovo moze da se resi? Hvala
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: prekid programa sa greskom "signal 11"29.03.2010. u 20:40 - pre 170 meseci
Pa pazi, možda nije to razlog zbog kog program puca :-). Možeš li ti to da debaguješ? Stavi jedan log u funkciju RouteData<A>::route(), pa tu ispisuj sadržaj tog objekta. Mnogo bi zgodnije bilo kad bi mogao da debaguješ.

Možda imaš brisanje tih pointera još negde u kodu, pa je old_winner loš od početka. Pre if-a ispiši vrednosti od *it i new_winner, možda primetiš nešto neobično.

Ne razumem problem za koji u poslednjoj rečenici tražiš predlog rešenja.
 
Odgovor na temu

Alexe
Beograd

Član broj: 172465
Poruke: 37
77.243.16.*



Profil

icon Re: prekid programa sa greskom "signal 11"29.03.2010. u 22:17 - pre 170 meseci
Ono sto bi mozda pomoglo (i sto se odnosi na moje pitanje) da se zastitim od eventualnog "preranog" brisanja je da kreiram (dinamicki sa new) novu listu npr old_winner_dyn i sa njom da baratam, odnosno poredim new_winner sa elementima ove nove liste. Medjutim, nisam bas siguran kako ovo da izvedem. Ima li neki dobar primer kako da listu pokazivaca jednog tipa dinamicki inicijalizujem drugom listom pokazivaca tog tipa i da, nakon testova u if petlji sa tom dinamickom listom, obrisem celu dinamicku listu? Pokusavao sam nesto slicno (npr neki tip type):
Code:

list<type *> prvalista
list<type *> drugalista = new list<type>(*prvalista) //ovde kompajler javlja gresku
list<type *> drugalista = new list<type *>(prvalista) //i ovako javlja gresku
//probao sam i list<type *> drugalista (prvalista) medjutim i ovo pravi problem

// ...
delete drugalista   //javlja "expected pointer" a kad stavim delete *drugalista kaze nesto "no match for operator*" 


Inace, pointeri iz old_winner se ne koriste niti brisu bilo gde u programu osim u tom delu koda.
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: prekid programa sa greskom "signal 11"29.03.2010. u 22:39 - pre 170 meseci
Ja još uvek ne znam šta ti je pitanje. Ponovi pitanje, i to tako da meni bude jasno. Zamisli da sam se sad probudio. Nemoj da te mrzi, jer često se dešava da ti sine rešenje problema upravo dok definišeš problem.

A što se tiče greške oko kopiranja liste to je zato što objektu pokušavaš da dodeliš vrednost pointera na taj objekat. Ukloni new. Stavi u kodu list<type *> drugalista (prvalista), i stavi ovde tekst greške koju kompajler javlja. Možda su ti dve liste ipak različitih tipova.
 
Odgovor na temu

Alexe
Beograd

Član broj: 172465
Poruke: 37
*.adsl.eunet.rs.



Profil

icon Re: prekid programa sa greskom "signal 11"29.03.2010. u 23:30 - pre 170 meseci
Naravno da me ne mrzi:) Evo konkretnog koda i greske koju dobijam. Ovde je samo deo metode add_route sa pocetka ove teme ( da ne bi ponavljao ne promenjeni kod).
Code:

    list<RouteData<A>* > old_winner;  
    list<RouteData<A>* > old_winner_clone;    //ovo je nova lista sa kojom zelim da baratam 
    list<RouteData<A> > alternatives; 
    old_winner = find_alternative_routes_new(caller, rtmsg.net(), alternatives);  //dodeljujem list alternativnih ruta old_winner-u 
    debug_msg("there are %d alternatives\n", (int)alternatives.size());
     if (!old_winner.empty()) {   //proveravam listu
         old_winner_clone (old_winner);   // i ovde pokusavam da kopiram listu old_winner u old_winner_clone. 
    } 
    RouteData<A> *new_winner = NULL;
    RouteData<A> new_route(rtmsg.route(), rtmsg.attributes(), caller, 
               rtmsg.origin_peer(), rtmsg.genid());
    if (!alternatives.empty()) {
        //add the new route to the pool of possible winners.
    alternatives.push_back(new_route);
    new_winner = find_winner(alternatives);
    } else {  
    //the new route wins by default
    new_winner = &new_route;     //dobio new_winner 
    }
    if (!old_winner_clone.empty()) {                     //proveravam da li mi je klonirana lista prazna 
       typename list<RouteData<A>* >::iterator it;                                              
    // typename list<RouteData<A>* >::iterator j;               //ovo sam izbacio posto hocu da obrisem celu listu a ne elemente liste                          
       for (it = old_winner_clone.begin(); it != old_winner_clone.end(); it++)           //petlja                                                          
    if ((*it)->route() == new_winner->route()) {                                                // ovde je program "pucao"  ranije
        //the winner didn't change.
           // for (j = old_winner.begin(); j != old_winner.end(); j++)                         //ne elemente ....  
       delete old_winner_clone;                                                                   //vec brisi celu listu. Mada, nisam siguran da je ovo korektno posto je nisam prethodno kreirao sa new!
                                                                               


Greske koje mi komajler javlja su:

gp/route_table_decision.cc: In member function ‘int DecisionTable<A>::add_route(InternalMessage<A>&, BGPRouteTable<A>*) [with A = IPv4]’:
bgp/route_table_decision.cc:1009: instantiated from here
bgp/route_table_decision.cc:129: error: no match for call to ‘(std::list<RouteData<IPv4>*, std::allocator<RouteData<IPv4>*> >) (std::list<RouteData<IPv4>*, std::allocator<RouteData<IPv4>*> >&)’ (//ovo se odnosi na old_winner_clone (old_winner)
bgp/route_table_decision.cc:1009: instantiated from here
bgp/route_table_decision.cc:159: error: type ‘class std::list<RouteData<IPv4>*, std::allocator<RouteData<IPv4>*> >’ argument given to ‘delete’, expected pointer (//...a ovo ne delete)
bgp/route_table_decision.cc: In member function ‘int DecisionTable<A>::add_route(InternalMessage<A>&, BGPRouteTable<A>*) [with A = IPv6]’:
bgp/route_table_decision.cc:1010: instantiated from here
bgp/route_table_decision.cc:129: error: no match for call to ‘(std::list<RouteData<IPv6>*, std::allocator<RouteData<IPv6>*> >) (std::list<RouteData<IPv6>*, std::allocator<RouteData<IPv6>*> >&)’
bgp/route_table_decision.cc:1010: instantiated from here
bgp/route_table_decision.cc:159: error: type ‘class std::list<RouteData<IPv6>*, std::allocator<RouteData<IPv6>*> >’ argument given to ‘delete’, expected pointer
scons: *** [obj/i686-pc-linux-gnu/bgp/route_table_decision.o] Error 1
scons: building terminated because of errors.
root@aleks:~/xorp#

 
Odgovor na temu

kiklop74
Darko Miletić
Buenos Aires

Član broj: 78422
Poruke: 569
*.fibertel.com.ar.

Sajt: ar.linkedin.com/pub/darko..


+13 Profil

icon Re: prekid programa sa greskom "signal 11"30.03.2010. u 02:49 - pre 170 meseci
Ovo je bas neko tesko komplikovanje. Je'l mozes ti jednostavno da objasnis zasto radis celu ovu skalameriju? Mozda je vreme da se kompletno revidira pristup problemu. BTW moze li se videti kako izgleda klasa RouteData?
Tko leti vrijedi
 
Odgovor na temu

kiklop74
Darko Miletić
Buenos Aires

Član broj: 78422
Poruke: 569
*.fibertel.com.ar.

Sajt: ar.linkedin.com/pub/darko..


+13 Profil

icon Re: prekid programa sa greskom "signal 11"30.03.2010. u 02:58 - pre 170 meseci
Code:

    RouteData<A> *new_winner = NULL;
...................
    new_winner = &new_route;     //dobio new_winner 


Ovakav kod je generalno trazenje djavola. Cini mi se da je bolje ovo raditi sa nekim smart pointerima, npr. boost:shared_ptr.

a tek ovo... ovo je veoma los kod...

Code:

    if (!old_winner.empty()) {
       typename list<RouteData<A>* >::iterator it;
       typename list<RouteData<A>* >::iterator j;
       for (it = old_winner.begin(); it != old_winner.end(); it++)     //prolaz kroz listu alternativa
    if ((*it)->route() == new_winner->route()) {   
        //the winner didn't change.
        XLOG_ASSERT(!old_winner.empty());
            for (j = old_winner.begin(); j != old_winner.end(); j++)
          delete *j;
        return ADD_UNUSED;
        }
    }


Kao prvo optimalna petlja za iteratore bi trebalo da izgleda ovako (pod uslovom da samo jedan thread pristupa listi):

Code:

   typedef std::list<RouteData<A>* > listType;
   typedef listType::iterator iterlistType;
   listType old_winner;
   for (iterlistType it = old_winner.begin(); it != old_winner.end(); ++it) {
        for (iterlistType j = old_winner.begin(),jend=old_winner.end(); j != jend; ++j) {
            delete *j;
        }
   }


Ali ono sto je besmisleno u gornjem primeru je da ti zapocnes setnju po listi pa zatim unutar te setnje krenes da brises pointere bez npr. njihovog postavljanja na NULL ili cak brisanja ovih elementa iz liste, nije ni cudo da ti sve puca, i naravno to brisanje ponavljas N^2 puta ... kao sto rekoh opet ne radi ovo rucno uzmi smart pointere.

Takodje ne koristi nikada
Code:

using namespace std;


To se smatra losom praksom. Uvek treba navoditi namespace. Ako se toga nakupi onda se koriste typedefovi kao sto sam vec pokazao.


[Ovu poruku je menjao kiklop74 dana 30.03.2010. u 04:27 GMT+1]
Tko leti vrijedi
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: prekid programa sa greskom "signal 11"30.03.2010. u 08:44 - pre 170 meseci
Moguće da dvostruka iteracija ipak nije problem, jer ako uđe u unutrašnju petlju onda se posle nje odmah radi i return, tako da nema brljanja iteratora.

Alexe, greška u liniji 129 je što pokušavaš da upotrebiš sintaksu za konstrukciju objekta pošto je objekat već stvoren. Na tom mestu to nije sintaksa za kreiranje objekta nego sintaksa za operator(), koji ne postoji, i to je ono što se kompajler žali. Ali sve to nije bitno, pogledao sam kod malo pažljivije. Ne treba ti old_winner_clone, niti treba išta da brišeš pre nego što izađeš iz funkcije. old_winner je lista pointera na elemente u alternatives. Kad nestane alternatives nestaće i elementi, tako da nema tu šta da se briše. Kad se funkcija završi na bilo kom mestu onda automatski nestaju i alternatives i old_winner, i ti tu nemaš šta da brišeš. Znači (polazeći od koda u prvom postu), ne treba ti unutrašnja petlja, niti ikakvo delete, nego prosto uradi return.
 
Odgovor na temu

Alexe
Beograd

Član broj: 172465
Poruke: 37
77.243.16.*



Profil

icon Re: prekid programa sa greskom "signal 11"30.03.2010. u 11:42 - pre 170 meseci
Citat:

Ovo je bas neko tesko komplikovanje. Je'l mozes ti jednostavno da objasnis zasto radis celu ovu skalameriju? Mozda je vreme da se kompletno revidira pristup problemu. BTW moze li se videti kako izgleda klasa RouteData?

Ova "skalamerija" radi tako da se u metodi add_route sa pocetka teme nova ruta (u vidu atributa rtmsg) poredi sa prethodnom najboljom rutom old_winner (ako postoji) koja je jedna od ruta u listi alternatives. Do sada je ovo radilo tako da je metoda find_alternative_routes vracala samo jednog previous_winner-a koji je bio pokazivac na jedan RouteData iz alternatives i on se dodeljivao old_winner-u. Sada mi treba da nova metoda find_alternative_routes_new vraca vise previous_winner-a (tj. listu) iz liste alternatives i da to dodeljuje old_winner-u (kojih moze biti vise pa je lista). Na kraju, new_winner je potrebno porediti sa svim clanovima old_winner za sta mi sluzi petlja kroz old_winner. Dakle, ovo je radilo tako sto je bio jedan old_winner kojem je metoda find_alternative_routes dodeljivala vrednost i ta vrednost se poredila sa new_winnerom. Potrebne izmene sam opisao (nadam se jasno:)). Sto se tice RouteData....

Code:

template<class A>
class RouteData {
public:
    RouteData(const SubnetRoute<A>* route, 
          FPAListRef pa_list,
          BGPRouteTable<A>* parent_table,
          const PeerHandler* peer_handler,
          uint32_t genid) 
    : _route(route), _pa_list(pa_list), _parent_table(parent_table), 
      _peer_handler(peer_handler), _genid(genid) {}

    /* main reason for defining operator= is to keep the refcount
       correct on _pa_list */
    RouteData<A>& operator=(const RouteData<A>& him) {
    _route = him._route;
    _pa_list = him._pa_list;
    _parent_table = him._parent_table;
    _peer_handler = him.peer_handler;
    _genid = him._genid;
    }

    void set_is_not_winner() {
    _parent_table->route_used(_route, false);
    _route->set_is_not_winner();
    }
    void set_is_winner(int igp_distance) {
    _parent_table->route_used(_route, true);
    _route->set_is_winner(igp_distance);
    }
    const SubnetRoute<A>* route() const { return _route; }
    const FPAListRef& attributes() const { return _pa_list; }
    const PeerHandler* peer_handler() const { return _peer_handler; }
    BGPRouteTable<A>* parent_table() const { return _parent_table; }
    uint32_t genid() const { return _genid; }
private:
    const SubnetRoute<A>* _route;
    FPAListRef _pa_list;
    BGPRouteTable<A>* _parent_table;
    const PeerHandler* _peer_handler;
    uint32_t _genid;
};

Citat:

Moguće da dvostruka iteracija ipak nije problem, jer ako uđe u unutrašnju petlju onda se posle nje odmah radi i return, tako da nema brljanja iteratora.
Alexe, greška u liniji 129 je što pokušavaš da upotrebiš sintaksu za konstrukciju objekta pošto je objekat već stvoren. Na tom mestu to nije sintaksa za kreiranje objekta nego sintaksa za operator(), koji ne postoji, i to je ono što se kompajler žali. Ali sve to nije bitno, pogledao sam kod malo pažljivije. Ne treba ti old_winner_clone, niti treba išta da brišeš pre nego što izađeš iz funkcije. old_winner je lista pointera na elemente u alternatives. Kad nestane alternatives nestaće i elementi, tako da nema tu šta da se briše. Kad se funkcija završi na bilo kom mestu onda automatski nestaju i alternatives i old_winner, i ti tu nemaš šta da brišeš. Znači (polazeći od koda u prvom postu), ne treba ti unutrašnja petlja, niti ikakvo delete, nego prosto uradi return.

Ok, ovo cu pokusati veceras.

Pod pretpostavkom da dvostruka iteracija pravi problem i dalje mi nije jasno kako to da on uopste ne udje u petlju ni prvi put pre nego sto obrise prvi objekat liste. Ono na sta sam ja sumnjao je da metoda find_alternative_routes_new (u prvom postu) koja popunjava dve liste (alternatives i previous_winner) ne radi to korektno, odnosno da ne popunjava listu previous_winner korektno. Kazem, probacu potpuno da izbacim old_winner_clone (koje nije ni bilo na pocetku teme) i unutrasnju petlju ali mi se cini da je problem negde ranije.


 
Odgovor na temu

Alexe
Beograd

Član broj: 172465
Poruke: 37
77.243.16.*



Profil

icon Re: prekid programa sa greskom "signal 11"30.03.2010. u 20:41 - pre 170 meseci
Izbacio sam old_winner_clone i delete old_winner, program se lepo kompajlira, medjutim opet prekida (sa porukom signal 11) kod if petlje:
Code:
  if ((*it)->route() == new_winner->route()) { 
         // itd

Editovao sam celu funkciju find_alternative_routes_new logging porukama koje mi program izbacuje kako prolazi kroz nju i lepo se vidi da metoda popunjava listu alternativa i vraca previous_winner. Slicno sam uradio i za add_route i sve prolazi ocekivano do uslovne petlje.
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: prekid programa sa greskom "signal 11"30.03.2010. u 20:57 - pre 170 meseci
Stavi log u funkciju route().
 
Odgovor na temu

Alexe
Beograd

Član broj: 172465
Poruke: 37
77.243.16.*



Profil

icon Re: prekid programa sa greskom "signal 11"30.03.2010. u 21:46 - pre 170 meseci
Interesantno. Metoda route() je jednostavna i ima u sebi samo return _route. Medjutim, program kroz nju prolazi samo jednom, sto ce reci poziva je samo za levu stranu operatora == ali (izgleda) ne i za new_winner-a. Editovao sam metodu find_winner koja vraca vrednost new_winner-u i ona se ponasa ocekivano, tj. new_winner dobija jednu vrednost iz alternatives.
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: prekid programa sa greskom "signal 11"30.03.2010. u 22:02 - pre 170 meseci
Nije potpuno sigurno da se leva strana operatora == računa pre desne. Promeni kod tako da se (*it)->route() dodeljuje jednoj privemenoj promenljivoj, a new_winner->route() drugoj (i to u dve posebne linije), pa onda poredi te promenljive. Testiraj jednom, zatim obrni redosled stvaranja promenljivih, pa testiraj ponovo. Ispiši i vrednosti *it i new_winner, kao i vrednosti te dve privremene promenljive.
 
Odgovor na temu

Alexe
Beograd

Član broj: 172465
Poruke: 37
77.243.16.*



Profil

icon Re: prekid programa sa greskom "signal 11"02.04.2010. u 21:09 - pre 170 meseci
Citat:
Nije potpuno sigurno da se leva strana operatora == računa pre desne. Promeni kod tako da se (*it)->route() dodeljuje jednoj privemenoj promenljivoj, a new_winner->route() drugoj (i to u dve posebne linije), pa onda poredi te promenljive. Testiraj jednom, zatim obrni redosled stvaranja promenljivih, pa testiraj ponovo. Ispiši i vrednosti *it i new_winner, kao i vrednosti te dve privremene promenljive.


Posto sam utvrdio da su oba dodeljivanja radila a petlja iz nekog razloga nije, pobrisao sam sve izmene pa krenuo od pocetka. Sada program prolazi kroz petlju i ovaj deo radi ocekivano, mada i dalje nisam sasvim siguran gde je bio problem. Idemo dalje:). Hvala na savetima!
 
Odgovor na temu

[es] :: C/C++ programiranje :: prekid programa sa greskom "signal 11"

[ Pregleda: 2153 | Odgovora: 15 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.