Lista di puntatori a vector (di puntatori)

di il
6 risposte

Lista di puntatori a vector (di puntatori)

Ciao a tutti mi sto incasinando con una cosa che mi sembrava banale ma invece non è...in pratica ho un metodo della classe CentralAuthority che deve riceve due vector...siccome non so come salvarmi sti vettori ho fatto cosi.... mi sono creato una

List* m_maps;


void
CentralAuthority::GetAllocationMapSmartAlgoAsymmLoad(vector<alloc_map_element*> prop_alloc_map)
{
	m_maps->enqueue(&prop_alloc_map);
	vector <alloc_map_element*> *map1;
	vector <alloc_map_element*> *map0;

	if(m_maps->len()==2){//se ho ricevuto due mappe allora posso fare i controlli sulle collisioni
		//prendo la prima mappa in coda
		map1=(vector <alloc_map_element*>*)m_maps->dequeue();
		//prendo la seconda mappa in testa
		map0=(vector <alloc_map_element*>*)m_maps->dequeue();

			for (unsigned int i=0;i<map0->size();i++){
				for(unsigned int j=0;j<map1->size();j++){
					//con questo if controllo se il canale i-esimo della mappa0, è presente nella posizione
					//j-esima della mappa1
					if(((map0[i]->subchannelID==(map1[j]->)->subchannelID){
						//se trova il canale uguale bisogna vedere se è occupato e condiviso da entrambe
						if((map0[i]->allocated==1 && map0[i]->priority==0) && (map1[j]->allocated==1 && map1[j]->priority==0)){
							//qui c'è un conflitto di allocazione su un canale condiviso
							//allora vado a riallocare l'ospite cioè
							//prima controllo a quale metà appartiene questa frequenza



la lista contiene due puntatori alle due mappe che devo ricevere .. quando la lista ha due elementi devo prelevare i due vector e confrontarli....il problema viene quando devo accedere agli elementi dei vector in quanto sono puntatori a struct alloc_map_elem

con il codice scritto nei for cioè

map0[i]->subchannelID
mi da errore del genere:

Description	Resource	Path	Location	Type
base operand of ‘->’ has non-pointer type ‘std::vector<ns3::alloc_map_element*, std::allocator<ns3::alloc_map_element*> >’	central-authority.cc	/SpectrumSharing/src/devices/lte	line 187	C/C++ Problem

help!
grazie in anticipo

6 Risposte

  • Re: Lista di puntatori a vector (di puntatori)

    A la struct è definita in questo modo..
    
    struct alloc_map_element{
    	int subchannelID;
    	char allocated;
    	char priority;
    	Mac48Address user;
    	int CQI;
    };
    
    
  • Re: Lista di puntatori a vector (di puntatori)

    Questa m_maps com'è definita?
  • Re: Lista di puntatori a vector (di puntatori)

    shodan ha scritto:


    Questa m_maps com'è definita?
    cosi...

    
    #ifndef LIST_H
    #define LIST_H
    
    namespace ns3{
    
    struct list_element{
    	void* object;
    	struct list_element* next;
    	struct list_element* prev;
    };
    
    class List{
    public:
    	List();
    	~List();
    public:
    	unsigned int len(){return len_;}
    	void* head(){return (head_)?head_->object:0; }
    	void* tail(){return (tail_)?tail_->object:0; }
    	void enqueue(void* obj);
    	void empty();
    	void put_position(void* obj, unsigned int pos); //add an element in a specific position
    	void start_scanning(){ curr_item = 0; }
    	void* next_item(); //allows to scan the list in sequential order
    	void remove_item(void*); //remove from the list a specific element
    	void* dequeue(); //remove the queue of the list
    private:
    	unsigned int len_;
    	struct list_element* curr_item; //used by the iterator for sequential scanning
    	struct list_element* head_;
    	struct list_element* tail_;
    };
    
    }
    #endif //LIST_H
    
    
  • Re: Lista di puntatori a vector (di puntatori)

    Non puoi usare l'operatore[] su dei puntatori. Devi usare at().
    Per cui avrai:
    
    map0->at(i)->subchannelID
    
    come modo di accesso.
    Più in generale, rileggendo meglio il thread, ho notato che la tua funzione riceve un parametro di tipo vector<alloc_map_element*>, per cui in realtà devi salvare solo uno dei vector che ti servono (magari come dato membro).
    Aggiungere prop_alloc_map alla tua m_maps la vedo solo come una inutile complicazione se non intendi salvarla per usarla in seguito.
    Nel primo caso m_maps sarà un semplice vector<alloc_map_element*> che memorizzi in un'altra funzione. In quella in esame ti basta confrontare prop_alloc_map con m_maps senza complicarti troppo la vita.
    In questo caso m_maps la puoi definire:
    
    std::vector<alloc_map_element*> m_maps;
    

    Se invece devi salvare prop_alloc_map in una struttura dati puoi salvarla usando una struttura dati standard (std::list<>, std::vector<>, std::deque<>), fermo restando che il confronto lo puoi sempre fare usando poi la prop_alloc_map senza bisogno di estrarla.
    In questo caso m_maps la puoi definire:
    
    std::xxxx<std::vector<alloc_map_element*>> m_maps;
    
    dove al posto di xxxx puoi mettere list,vector,deque.

    Se invece hai la garanzia di avere sempre e solo due vector<alloc_map_element*> e intendi sempre salvare prop_alloc_map, puoi pensare anche a una std::pair<>
    In tal caso m_maps sarà:
    
    std::pair<std::vector<alloc_map_element*>,std::vector<alloc_map_element*>> m_maps.
    
    il primo vector sarà in: m_maps.first, il secondo in m_maps.second.
    Soluzioni ce ne sono diverse, ma tutto dipende da cosa devi fare davvero.
  • Re: Lista di puntatori a vector (di puntatori)

    shodan ha scritto:


    Non puoi usare l'operatore[] su dei puntatori. Devi usare at().
    Per cui avrai:
    
    map0->at(i)->subchannelID
    
    come modo di accesso.
    Più in generale, rileggendo meglio il thread, ho notato che la tua funzione riceve un parametro di tipo vector<alloc_map_element*>, per cui in realtà devi salvare solo uno dei vector che ti servono (magari come dato membro).
    Aggiungere prop_alloc_map alla tua m_maps la vedo solo come una inutile complicazione se non intendi salvarla per usarla in seguito.
    Nel primo caso m_maps sarà un semplice vector<alloc_map_element*> che memorizzi in un'altra funzione. In quella in esame ti basta confrontare prop_alloc_map con m_maps senza complicarti troppo la vita.
    In questo caso m_maps la puoi definire:
    
    std::vector<alloc_map_element*> m_maps;
    

    Se invece devi salvare prop_alloc_map in una struttura dati puoi salvarla usando una struttura dati standard (std::list<>, std::vector<>, std::deque<>), fermo restando che il confronto lo puoi sempre fare usando poi la prop_alloc_map senza bisogno di estrarla.
    In questo caso m_maps la puoi definire:
    
    std::xxxx<std::vector<alloc_map_element*>> m_maps;
    
    dove al posto di xxxx puoi mettere list,vector,deque.

    Se invece hai la garanzia di avere sempre e solo due vector<alloc_map_element*> e intendi sempre salvare prop_alloc_map, puoi pensare anche a una std::pair<>
    In tal caso m_maps sarà:
    
    std::pair<std::vector<alloc_map_element*>,std::vector<alloc_map_element*>> m_maps.
    
    il primo vector sarà in: m_maps.first, il secondo in m_maps.second.
    Soluzioni ce ne sono diverse, ma tutto dipende da cosa devi fare davvero.
    allora le due mappe devono essere salvate per essere confrontate contemporaneamente solo quando la classe CentralAuthority ne riceve esattamente due....praticamente il metodo viene chiamato da due Antenne A e B che mandano al cervellone centrale le mappe di allocazione degli utenti...che però contengono dei conflitti e quindi devono essere confrontate. il metodo viene chiamato ogni milli secondo dallo scheduler di ogni antenna...

    con il pair devo aggiungere di volta in volta il parametro che ricevo dal metodo... oppure visto che le mappe le devo salvare mi conviene usare una list come hai detto tu....e accedere con map0->at(i)->subchannelID
  • Re: Lista di puntatori a vector (di puntatori)

    allora le due mappe devono essere salvate per essere confrontate contemporaneamente solo quando la classe CentralAuthority ne riceve esattamente due....praticamente il metodo viene chiamato da due Antenne A e B che mandano al cervellone centrale le mappe di allocazione degli utenti...che però contengono dei conflitti e quindi devono essere confrontate. il metodo viene chiamato ogni milli secondo dallo scheduler di ogni antenna...
    Ho capito. In questo caso std::pair<> non va bene.
    A questo punto io definirei m_maps come:
    
    std::vector<std::vector<alloc_map_element*>> m_maps;
    
    E modificherei la funzione così:
    
    void
    CentralAuthority::GetAllocationMapSmartAlgoAsymmLoad(vector<alloc_map_element*> prop_alloc_map)
    {
       m_maps.push_back(prop_alloc_map);
    
       if(m_maps.size()==2){//se ho ricevuto due mappe allora posso fare i controlli sulle collisioni
          vector <alloc_map_element*>::reverse_iterator it = m_maps.rbegin();
          // ultima mappa inserita;
          vector <alloc_map_element*> map1 = *it;
          ++it;
          // penultima mappa inserita
          vector <alloc_map_element*> map0 = *it;
             for (unsigned int i=0;i<map0.size();i++){
                for(unsigned int j=0;j<map1.size();j++){
                   //con questo if controllo se il canale i-esimo della mappa0, è presente nella posizione
                   //j-esima della mappa1
                   if(map0[i]->subchannelID==map1[j]->subchannelID){
                      //se trova il canale uguale bisogna vedere se è occupato e condiviso da entrambe
                      if((map0[i]->allocated==1 && map0[i]->priority==0) && (map1[j]->allocated==1 && map1[j]->priority==0)){
                         //qui c'è un conflitto di allocazione su un canale condiviso
                         //allora vado a riallocare l'ospite cioè
                         //prima controllo a quale metà appartiene questa frequenza
    
    // prima di uscire dal'if cancello i dati in m_maps;
                         m_maps.resize(0);
    
    Dato che hai solo due mappe questa linea:
    
    vector <alloc_map_element*>::reverse_iterator it = m_maps.rbegin();
    
    puoi anche modificarla così:
    
    vector <alloc_map_element*>::iterator it = m_maps.begin();
    
    Ho preferito la prima versione per coerenza con il thread precedente sulla pop_back().
Devi accedere o registrarti per scrivere nel forum
6 risposte