Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15

Discussione: [C++] iteratore end()

  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2013
    Messaggi
    20

    [C++] iteratore end()

    Salve a tutti!
    Ho un problema con l'iteratore end() in un progetto, per l'università, non so come mai non viene mai caricato infatti mentre scorro la matrice arrivato alla fine mi si blocca segnalandomi un indirizzo non valido!
    Il codice:
    codice:
    iterator end() { 
    size_type size = (dz*dx*dy); 
    return iterator(g3d+size, dz, dy, dx); 
    }
    La classe è una matrice a 3 dimensioni...
    Vi ringrazio subito per la cortesia.

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Cos'è iterator? Una classe? Un typedef? Fornisci qualche dettaglio in più.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2013
    Messaggi
    20
    è una classe chiamata appunto iterator!

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Ok, ma non possiamo aiutarti se non mostri il codice della classe iterator (se l'hai fatta tu), della matrice e il codice che usi per il test.
    L'errore è dovuto a un accesso non valido, ma senza vedere il codice non è possibile stabilire ne dove ne quando.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2013
    Messaggi
    20
    Giusto hai ragione...
    codice:
    class iterator{
             	friend class grid3d;
             	friend class const_iterator;
    	    public:
    	        typedef std::forward_iterator_tag  iterator_category;
       	        typedef T value_type;
                	typedef ptrdiff_t difference_type;
       	        typedef T* pointer;
                	typedef T& reference;
    				
    		iterator() : ptr(0),diz(0),diy(0),dix(0), cy(0),cx(0) {}
    			
    		iterator(const iterator &other) : ptr(other.ptr) {}
    
    		iterator& operator=(const iterator &other) {
    			ptr = other.ptr;
    			diz = other.diz;
    			dix = other.dix;
    			diy = other.diy;
    			cy = other.cy;
    			cx = other.cx;
    			return *this;
    		}
    		~iterator() {} //distruttore iteratore
    		/**
     		* Operatore di dereferenziamento. 
     		*
     		* @return il dato "puntato" dall'iteratore.
     		*/
                    reference operator*() const {
    			return ***ptr;
    		}
    		/**
     		* Operatore freccia.
     		*
     		* @return il puntatore al dato "puntato" dall'iteratore.
     		*/
    		pointer operator->() const {
    			return ***ptr;
    		}
     	       /**
     		* Operatore di confronto (uguaglianza). 
     		* 
     		* @param other iteratore da confrontare
     		* @return true se i due iteratori "puntano" allo stesso dato
     		*/
    		bool operator==(const iterator &other) const {
    			return ptr == other.ptr;
    		}
     	       /**
     		* Operatore di confronto (disuguaglianza). 
     		* 
     		* @param other iteratore da confrontare
     		* @return true se i due iteratori "puntano" a dati diversi
     		*/
    		bool operator!=(const iterator &other) const {
    			return !(*this == other);
    		}
     	       /**
     		* Operatore di "elemento successivo". Versione pre-incremento. 
     		*
     		* @return l'iteratore che "punta" all'elemento successivo
     		*/
    		iterator &operator++() {
                            cx++;
                            if(cx == dix){
                                         **ptr = 0;
                                         cx = 0;
                                         cy++;
                                         if(cy == diy){
                                         *ptr = 0;
                                         cy=0;
                                         ++ptr;
                                         }else ++(*ptr);
                                         }else ++(**ptr);
                           return *this;
    		}
     	       /**
     		* Operatore di "elemento successivo". Versione post-incremento. 
     		* 
     		* @return l'iteratore che "punta" all'elemento successivo
     		*/
    		iterator operator++(int) {
    			iterator tmp(ptr,diz,diy,dix,cy,cx);
                            cx++;
                            if(cx == dix){
                                         **ptr = 0;
                                         cx = 0;
                                         cy++;
                                         if(cy == diy){
                                         *ptr = 0;
                                         cy=0;
                                         ++ptr;
                                         }else ++(*ptr);
                                         }else ++(**ptr);
                                   return tmp;
    		}
    	
            	private:
    		value_type ***ptr;
    		size_type diz;
    		size_type diy;
    		size_type dix;
    
    		size_type cy;
    		size_type cx;
    
     	       /**
     		* Costruttore di inizializzazione. Sarà usato anche da grid3d.
     		*
     		* @param p puntatore ai dati
     		*/
    		explicit iterator(value_type ***p, size_type dz, size_type dy, size_type dx) : ptr(p),diz(dz),diy(dy),dix(dx),cy(0),cx(0) {}
    		explicit iterator(value_type ***p, size_type dz, size_type dy, size_type dx, size_type dyo, size_type dxo) : ptr(p),diz(dz),diy(dy),dix(dx),cy(dyo),cx(dxo) {}
             };
    Il codice per il test:
    codice:
    grid3d<int> gi(2,2,2,3);
    grid3d<int> gi2(2,2,2,3);
    
    transform(gi.begin(),gi.end(),gi2.begin(), add());
    Il problema che mi sorge è molto semplice lui scorre TUTTA la matrice poi non so perché anzichè fermarsi all' end() va avanti!

  6. #6
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Se espliciti il costruttore di copia devi fare la copia di tutti i dati, invece fai la copia solo del puntatore interno.
    Tra l'altro il costruttore di copia e l'operatore di assegnamento non servono nemmeno. Puoi benissimo toglierli.
    operator++(int) puoi semplificarlo così:
    codice:
    iterator operator++(int) {
        iterator tmp(ptr,diz,diy,dix,cy,cx);
        ++(*this);
        return tmp;
    }
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2013
    Messaggi
    20
    Originariamente inviato da shodan
    Se espliciti il costruttore di copia devi fare la copia di tutti i dati, invece fai la copia solo del puntatore interno.
    Tra l'altro il costruttore di copia e l'operatore di assegnamento non servono nemmeno. Puoi benissimo toglierli.
    operator++(int) puoi semplificarlo così:
    codice:
    iterator operator++(int) {
        iterator tmp(ptr,diz,diy,dix,cy,cx);
        ++(*this);
        return tmp;
    }
    Con questa modifica mi crasha prima...
    Sostanzialmente mi scorre tutta la matrice ma poi mi si blocca perché va a controllare una posizione successiva all'ultimo valore ignorando l'end().
    Adesso mi si ferma praticamente subito...

  8. #8
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Il senso del post era porre l'attenzione sul costruttore di copia.
    Quel codice era solo un suggerimento di implementazione.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2013
    Messaggi
    20
    Originariamente inviato da shodan
    Il senso del post era un altro.
    A ok!!!

    Vediamo se lo implementassi così:

    codice:
    iterator(const iterator &other){ 
    diz = other.diz; 
    dix = other.dix; 
    diy = other.diy; 
    cy = other.cy; 
    cx = other.cx; 
    for(size_type i = 0; i<other.dix; ++i){ //mi muovo su asse x 
    for(size_type j = 0; j<other.diy; ++j){ //mi muovo su asse y 
    for(size_type z = 0; z<other.diz; ++z){ 
    ptr[z][j][i] = other.ptr[z][j][i]; 
    } } } }
    In modo da fargli fare la copia completa...

  10. #10
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Ricorda che quando espliciti un costruttore di copia e/o assegnamento il codice corretto lo devi scrivere tu per ogni dato membro, dato che stai bypassando i meccanismi interni del compilatore.
    Poiché hai un puntatore sempre valido (e di cui non fai mai il delete) e gli altri dati sono int, il costruttore di copia e l'operatore di assegnamento non servono.
    Faresti prima a toglierli che non a correggere eventuali errori.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.