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

popunjavanje liste pokazivaca

[es] :: C/C++ programiranje :: popunjavanje liste pokazivaca

[ Pregleda: 1755 | Odgovora: 4 ] > 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 popunjavanje liste pokazivaca06.03.2010. u 17:53 - pre 172 meseci
Potrebna mi je pomoc oko izmene odredjenog koda. Naime, imam sledeci (postojeci) kod:
Code:

 RouteData<A> *old_winner = NULL, *old_winner_clone = NULL;                       //neki korisnicki (templatizovani) tip RouteData
 list<RouteData<A> > alternatives;                                                             //lista istog tipa 
 old_winner = find_alternative_routes(caller, rtmsg.net(), alternatives);            //funkcija koja vraca pokazivac na element liste "alternatives"                

Implementacija funkcije find_alternative_routes izgleda ovako:
Code:

template<class A>
RouteData<A>*
DecisionTable<A>::find_alternative_routes(
    const BGPRouteTable<A> *caller,
    const IPNet<A>& net,
    list <RouteData<A> >& alternatives) const 
{
    RouteData<A>* previous_winner = NULL;
    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, 
                         found_attributes);
        if (found_route != NULL) {
        PeerTableInfo<A> *pti = i->second;
        alternatives.push_back(RouteData<A>(found_route, 
                            found_attributes,
                            pti->route_table(),
                            pti->peer_handler(),
                            found_genid));
        if (found_route->is_winner()) {
            XLOG_ASSERT(previous_winner == NULL);
            previous_winner = &(alternatives.back());
        }
        }
    }
    }
    return previous_winner;
}


Dakle, funkcija find_alternative routes vraca pokazivac (previous_winner) na element liste "alternatives" koji zadovoljava uslov if (found_route->is_winner()), i povratna vrednost se dodeljuje promenjivoj (pokazivacu) old_winner sa pocetka code-a. Sada treba prosiriti ovaj model tako da old_winner sa pocetka moze da prihvati vise vrednosti tj. vise pokazivaca na listu "alternatives" koje bi funkcija find_alternative_routes trebala da vrati pod istim if uslovom. Moje razumevanje je da old_winner sada treba deklarisati kao listu pokazivaca na elemente liste "alternatives" (koji su takodje tipa RouteData) i da funkcija find_alternative_routes sada treba da vrati tu listu pokazivaca. Kako bi se ovo realizovalo na konkretnom primeru? Hvala

[Ovu poruku je menjao X Files dana 06.03.2010. u 19:50 GMT+1]
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: popunjavanje liste pokazivaca06.03.2010. u 22:10 - pre 172 meseci
Nemam pojma šta se u ovom kodu dešava, ali to me neće sprečiti da se pravim pametan. Ti hoćeš da se ovaj kod modifikuje tako da dobiješ listu pokazivača, umesto samo jedan pokazivač. Fino. Napravi tu listu kao unutrašnju promenljivu funkcije, popuni je kako ti odgovara, i vrati je sa return. To bi valjda trebalo da radi, std::list ima copy constructor.
 
Odgovor na temu

Alexe
Beograd

Član broj: 172465
Poruke: 37
77.243.16.*



Profil

icon Re: popunjavanje liste pokazivaca06.03.2010. u 22:44 - pre 172 meseci
U tom slucaju bi morao da promenim i tip f-je koja ce sada vracati listu pokazivaca a ne jedan pokazivac, zar ne? E ja sam tako i uradio i to na sledeci nacin:
Code:

template<class A>
list<RouteData<A>* >                                      //changed type to list of pointers 
DecisionTable<A>::find_alternative_routes(
    const BGPRouteTable<A> *caller,
    const IPNet<A>& net,
    list <RouteData<A> >& alternatives) const 
{
    list<RouteData<A>* > previous_winner;          //lokalna lista pokazivaca tipa RouteData

//nepromenjeni deo koda ....

if (found_route->is_winner()) {
            XLOG_ASSERT(previous_winner == NULL);
            previous_winner.push_back(RouteData<A> &(found_route,            //nisam siguran da li je ok da se listi pokazivaca ovako dedeljuju adrese obj.
                                                        found_attributes,       //...na koje ukazuju 
                                                        pti->route_table(),
                                                        pti->peer_handler(),
                                                        found_genid));
        }
        }
    }
    }
    return previous_winner;                           //vrati listu pokazivaca 
}

Slicno sam promenjivoj old_winner koja prihvata ovaj return promenio tip u list<RouteData<A>* >. Medjutim, kompajler javlja greske. Izmedju ostalog:

bgp/route_table_decision.cc:466: error: prototype for ‘std::list<RouteData<A>*, std::allocator<RouteData<A>*> > DecisionTable<A>::find_alternative_routes(const BGPRouteTable<A>*, const IPNet<A>&, std::list<RouteData<A>, std::allocator<RouteData<A> > >&) const’ does not match any in class ‘DecisionTable<A>’
bgp/route_table_decision.hh:163: error: candidate is: RouteData<A>* DecisionTable<A>::find_alternative_routes(const BGPRouteTable<A>*, const IPNet<A>&, std::list<RouteData<A>, std::allocator<RouteData<A> > >&) const

Neka ideja sta ne valja ovde?
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: popunjavanje liste pokazivaca07.03.2010. u 08:54 - pre 172 meseci
Povratna vrednost funkcije je lista pointera na elemente u listi alternativa. To znači da prvo taj element treba da ubaciš u listu alternativa, pa tek onda da uzmeš pointer na element i ubaciš ga u povratnu listu. Što će reći, previous_winner.push_back(&(alternatives.back()));
 
Odgovor na temu

Alexe
Beograd

Član broj: 172465
Poruke: 37
77.243.16.*



Profil

icon Re: popunjavanje liste pokazivaca07.03.2010. u 09:56 - pre 172 meseci
Mislim da je to ono sto mi treba ovde, mada se javljaju problemi na drugoj strani. Ok, bice nova tema:). Hvala!
 
Odgovor na temu

[es] :: C/C++ programiranje :: popunjavanje liste pokazivaca

[ Pregleda: 1755 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

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