Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    79

    [C++] Utilizzo di iteratori

    Salve, ho una funzioncina che genera il seguente errore a runtime:
    "vector iterator not dereferencable"

    (la funzione non ha senso, ma è solo per capire il perché dell'errore)
    codice:
        void encode() {
    
    
            string enc;
            string enc_save;
    
    
            while (_buffer.size()) {
    
    
                enc = _buffer.front();
                _buffer.erase(_buffer.begin());
    
    
                if (_dict.find(enc) == _dict.end()) {
                    while (true) {
                        enc_save = enc;
                        enc += _buffer.front();
                        break;
                    }
                }
            }
    buffer e dict sono dichiarati in questo modo:

    codice:
        vector <uint8_t> _buffer;
        map <string, size_t> _dict;
    Il problema è generato dalla seconda istruzione nel while più interno, ma non riesco a capire perché ..

    grazie

  2. #2
    Uhm, facendo una prova al volo con gcc non vedo problemi... puoi postare un esempio completo compilabile, magari c'è qualche casino sugli include... Inoltre: che compilatore stai usando?
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    79
    grazie mille, allora il codice completo è questo:

    codice:
    #pragma once
    #include <map>
    #include <vector>
    #include <string>
    
    
    using namespace std;
    
    
    struct lz78 {
    private:
    	/* massimo numero di elementi memorizzabili nel dizionario */
    	size_t _max_dict;
    	size_t _max_bits;
    	size_t _num_dict;
    	/* definisce il look-ahead dell'algoritmo */
    	vector <pair<size_t, uint8_t>> _tuple;
    	vector <uint8_t> _buffer;
    	/* dizionario */
    	map <string, size_t> _dict;
    
    
    public:
    	lz78(size_t max_bits, ifstream & is) :
    		_max_bits(max_bits){
    
    
    		_num_dict = 0;
    		_max_dict = 1 << max_bits;
    
    
    		cout << "max_bits: " << _max_bits << endl;
    		cout << "max_dict: " << _max_dict << endl;
    
    
    		uint8_t buff;
    		while (is.read(reinterpret_cast<char *>(&buff), 1)) {
    			_buffer.push_back(buff);
    		}
    	}
    
    
    	void encode() {
    
    
    
    
    		string enc;
    		string enc_save;
    
    
    
    
    		while (_buffer.size()) {
    
    
    
    
    			enc = _buffer.front();
    			_buffer.erase(_buffer.begin());
    
    
    
    
    			if (_dict.find(enc) == _dict.end()) {
    				while (true) {
    					enc_save = enc;
    					enc += _buffer.front();
    					break;
    				}
    			}
    		}
    	}
    };
    codice:
    #include <iostream>
    #include <fstream>
    #include <cstdlib>
    #include <cstdint>
    
    
    #include "lz78.h"
    
    
    using namespace std;
    
    
    
    
    int main(int argc, char **argv) {
    
    
    	ifstream is(argv[2], ios::binary);
    	ofstream os(argv[3], ios::binary);
    
    
    	lz78 lz78_enc = lz78(atoi(argv[1]), is);
    
    
    	lz78_enc.encode();
    
    
    	is.close();
    	os.close();
    
    
    	system("pause");
    
    
    	return EXIT_SUCCESS;
    }
    mentre come compilatore utilizzo quello di visual studio

  4. #4
    Ah scusa non avevo letto che l'errore è a runtime... be', quel messaggio lì significa che stai cercando di leggere il front() di un vettore vuoto.

    Ad occhio direi che sei nel caso in cui entri con _buffer di dimensione 1, cancelli l'unico carattere che c'è dentro con _buffer.erase(_buffer.begin()) e entri nell'if, dove cerchi di nuovo di leggere _buffer.front() (che però adesso si rompe, dato che non ci sono più aratteri in _buffer).
    Amaro C++, il gusto pieno dell'undefined behavior.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.