Vector bleibt Leer



  • dreht alle bits um, hab grad das fachwort für vergessen, die crc methode liefert nen DWORD ( unsigned long ).

    #include <bitset>
    #include <iostream>
    using namespace std;
    int main(int argc, char* argv[])
    {
      int N = 0xFF00FF00;
      cout << bitset < 32 >(N) << endl;
      cout << bitset < 32 >(~N) << endl;
    
      return 0;
    }
    

    pseudo beispiel code.

    edit: bitwise not... ja, so einfach kanns sein. http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=163



  • Oh Mein gott :|

    vector < STRING_INFO * > * CRC = new vector < STRING_INFO * >( );
    CRC->reserve ( Size );
    

    löst das problem, ist da der positions zeiger im vektor verschoben oder wie oO?



  • Benutz in Zeile 5 doch ne Initialisierungsliste, dann kannste CRC und StringPos const machen.



  • Schurke schrieb:

    löst das problem, ist da der positions zeiger im vektor verschoben oder wie oO?

    Wenn du vorher schon einen Vektor mit hinreichenden vielen Elementen erzeugst, brauchst du hinterher nicht mehr mit push_back anzuhängen, sondern kannst gleich mit [] auf die Elemente zugreifen. Wenn du aber sowieso später hinten anhängst, reicht ein zu Anfang leerer Vektor.

    Ich möchte aber noch anmerken, dass du meiner Meinung nach unnötig viele Zeiger benutzt. Du könntest in diesem Beispielcode komplett auf Zeiger verzichten. Dann wärst du auch das Speicherleck los 😉



  • Kóyaánasqatsi schrieb:

    Benutz in Zeile 5 doch ne Initialisierungsliste, dann kannste CRC und StringPos const machen.

    stimmt, werd ich.

    MFK schrieb:

    Schurke schrieb:

    löst das problem, ist da der positions zeiger im vektor verschoben oder wie oO?

    Wenn du vorher schon einen Vektor mit hinreichenden vielen Elementen erzeugst, brauchst du hinterher nicht mehr mit push_back anzuhängen, sondern kannst gleich mit [] auf die Elemente zugreifen. Wenn du aber sowieso später hinten anhängst, reicht ein zu Anfang leerer Vektor.

    danke, jetzt machts auch Sinn wieso es nicht geht !...

    Aber das mit dem speicherleck, das ist noch da weil ich mich erstmal mit dem einem fehler rumplagen musste 😛



  • Schurke schrieb:

    dreht alle bits um, hab grad das fachwort für vergessen

    Komplement? 😃



  • Geh mitm Debugger durch und schau was an den Stellen passiert wo er eigentlich den Vetor befüllen sollte.



  • Du hast auch noch ein ganz anderes Problem. Wenn du ein Element löschst, verschieben sich ja alle restlichen in "String". Dann stimmen deine "StringPos" in den STRING_INFOs (je nach Position) nicht mehr.



  • Stimmt, darauf sitze ich gerade, würde ich aber gerne versuchen erst selbst zu lösen 🙂



  • Ohne dir jetzt nahetreten zu wollen, aber das ist Code für daily WTF. Es geht wesentlich einfacher, wenn du eine map verwendest.
    Bei der Lösung mit der Map fügst du jeden String mit seinem CRC Wert als Key ein, und danach kopierst du den Value aller Tupel zurück in den Ergebnisvector. Vorher merkst du dir noch die Länge des Eingabevektors, wenn Ergebnis- und Eingabevektor unterschiedliche Längen haben wurde der Ergebnisvektor verändert.

    bool RemoveDuplicates( vector<wstring>& data )
    {
       map<DWORD,wstring> tmp;
       for( vector<wstring>::const_iterator it = Data.begin(); it != Data.end(); ++it )
       {
          DWORD CRC = calc_crc( *it );
          tmp[CRC] = *it;
       }
       vector<wstring> unique;
       Unique.reserve( tmp.size() );
       for( map<DWORD,wstring>::const_iterator it = tmp.begin(); it != tmp.end(); ++it )
       {
          unique.push_back( it->second );
       }
       if( unique.size() != data.size() )
       {
          data = unique;
          return true;
       }
       return false;
    }
    

    PS:
    Es ginge ebenfalls mit deiner STRING_INFO Struktur, dann musst du deinen Vektor nach den CRC Werten sortieren (eigener Funktor/Funktion), und anschliessend alle Duplikate mit std::unique und std::vector::erase aus dem Vektor löschen.



  • xDD danke, das sieht wirklich leichter aus, das wäre meine lösung gewesen, bin gerade fertig geworden.

    //------------------------------------------------------
    //-----------------Slightly edited find-----------------
    
    // TEMPLATE FUNCTION find
    template<class _InIt, class _Ty>
    inline
    	_InIt _Find_P(_InIt _First, _InIt _Last, const _Ty& _Val)
    	{	// find first matching _Val
    	//_DEBUG_RANGE(_First, _Last);
    	for (; _First != _Last; ++_First)
    		if (*(*_First) == *_Val)// only line changed ^.^
    			break;
    	return (_First);
    	}
    
    template<class _InIt, class _Ty>
    inline
    	_InIt find_p(_InIt _First, _InIt _Last, const _Ty& _Val)
    	{	// find first matching _Val
    	_ASSIGN_FROM_BASE(_First, _Find_P(_CHECKED_BASE(_First), _CHECKED_BASE(_Last), _Val));// ah and the _P
    	return (_First);
    }
    
    //------------------------------------------------------
    //------------------------------------------------------
    
    bool CleanDuplicates( vector < wstring > * Strings ){
    	// returns -> Strings altered ? Y / N
    	// Usage : v32 = ~crc32_calc (msg, len, ~0U);
    	struct STRING_INFO{
    		explicit STRING_INFO( DWORD C, unsigned int SP ):StringPos(SP),CRC(C){
    			// crc's are correct.
    			//cout << hex << C << endl;
    		}
    
    		bool operator == ( STRING_INFO const& R )
        {
          return (this->CRC == R.CRC);
        }
    
    		const DWORD CRC;
    		const unsigned int StringPos;
    	};
    
    	bool RetVal = false;
    	vector < STRING_INFO * > * CRC = new vector < STRING_INFO * >( Strings->size() );
    
    	for ( unsigned int i = 0; i < Strings->size(); i++ )
    		(*CRC)[i] = new STRING_INFO( ~crc32_calc( reinterpret_cast < const BYTE * >( (*Strings)[i].c_str() ), (*Strings)[i].size(), ~0U ), i );
    
    	for ( vector < STRING_INFO * >::iterator It = CRC->begin(); It < CRC->end(); It++ ){
    		vector < STRING_INFO * >::iterator Beg = CRC->begin();
    		vector < STRING_INFO * >::iterator Pos;
    		for ( ;; ){
    			Pos = find_p( Beg, CRC->end(), *It );
    			if ( Pos == CRC->end() || Pos == CRC->end() - 1)
    				break;// 2ter loop
    			if ( Pos == It ){
    				Beg = It + 1;
    				continue;// 1ster loop
    			}
    			RetVal = true;
    			// Relocate It
    			STRING_INFO * Temp = *It;
    			(*Strings)[(*Pos)->StringPos] = L"";
    			delete *Pos;
    			CRC->erase( Pos );
    			Beg = CRC->begin();
    			It = find_p( Beg, CRC->end(), Temp );
    		}
    	}
    
    	for ( unsigned int i = 0; i < CRC->size(); i++ )
    		delete (*CRC)[i];
    
    	for ( int i = 0, n = Strings->size(); i < n; i++ ){
    		if ( !(*Strings)[i].compare(L"") ){
    			Strings->erase( Strings->begin() + i );
    			n = Strings->size();
    			--i;
    		}
    	}
    
    	return RetVal;
    }
    

Anmelden zum Antworten