Findet ihr spontan n Fehler...amverzweifeln



  • Hi

    der Titel sagt alles...hier der Code:

    /* ============================================================ */
    // AddNewEntry: Fügt ein neuen Eintrag ein.
    //
    bool CPlaylist::AddNewEntry(char* pszEntryName, PENTRYDATA pedData)
    {	
    	if(pszEntryName == NULL || pedData == NULL)
    		return (false);
    
    	if(this->IsEmpty())
    	{
    		this->_dbEntryArray = new CListEntry*;
    
    		this->_dbEntryArray[0] = new CListEntry;
    		this->_dbEntryArray[0]->SetEntryName(pszEntryName);
    		this->_dbEntryArray[0]->SetEntryData(pedData);
    
    		this->_ulTotalEntries += 1;
    		return (true);
    	}
    	else
    	{
    		unsigned long ulCount;		
    		CListEntry** dpTemp = new CListEntry*[this->_ulTotalEntries];
    
    		for(ulCount = 0L; ulCount < this->_ulTotalEntries; ulCount++)
    			dpTemp[ulCount] = this->_dbEntryArray[ulCount];
    
    		delete [] this->_dbEntryArray;
    
    		std::cout << this->_dbEntryArray << std::endl;
    
    		this->_dbEntryArray = new CListEntry*[this->_ulTotalEntries + 1];
    		MessageBox(0,0,0,0);
    
    		for(ulCount = 0L; ulCount < this->_ulTotalEntries; ulCount++)
    			this->_dbEntryArray[ulCount] = dpTemp[ulCount];
    
    		delete [] dpTemp;
    
    		this->_dbEntryArray[ulCount + 1] = new CListEntry;
    		this->_dbEntryArray[ulCount + 1]->SetEntryName(pszEntryName);
    		this->_dbEntryArray[ulCount + 1]->SetEntryData(pedData);
    
    		this->_ulTotalEntries += 1;		
    		return (true);
    	}
    }
    

    THX a lot!



  • Oha! schrieb:

    this->_dbEntryArray[ulCount] = new CListEntry;
    		this->_dbEntryArray[ulCount]->SetEntryName(pszEntryName);
    		this->_dbEntryArray[ulCount]->SetEntryData(pedData);
    


  • Muhahah mir fällt grad auf, das ich totale scheiße 😃 gepostet hab: Also hier n bissl Hintergrundwissen^^:

    - WinXP
    - Mircrsoft Visual C++ 6.0

    - Der Debug Modus meint, das hier:

    this->_dbEntryArray = new CListEntry*[this->_ulTotalEntries + 1];
    

    n Speicherfehlgriff statt findet... ("Access Violation")

    - also es geht wie vll schon ersichtlich um eine Klasse die ein Zeiger Array enthält (ListenKlasse, aufbauend auf Array, keine verkettete Liste), die auf Objekten der Klasse CListEntry (ein Eintrag in der Liste) besteht...die Methode fügt einen neuen EIntrag in die Liste ein...beim ersten Aufruf funzt das auch, beim 2. schon nicht mehr

    - der konstruktor init. die elemente so:

    CPlaylist::CPlaylist(void)
    {
    	this->_dbEntryArray		= NULL;
    	this->_ulTotalEntries	= 0;
    }
    

    so nochmal sry wg. meinem schlechten Code...peinlich... 🙄
    wär nett wenn nochmal jmd. drauf gucken könnte... 😉



  • Muhahah mir fällt grad auf, das ich totale scheiße 😃 gepostet hab: Also hier n bissl Hintergrundwissen^^:

    - WinXP
    - Mircrsoft Visual C++ 6.0

    - Der Debug Modus meint, das hier:

    this->_dbEntryArray = new CListEntry*[this->_ulTotalEntries + 1];
    

    n Speicherfehlgriff statt findet... ("Access Violation")

    - also es geht wie vll schon ersichtlich um eine Klasse die ein Zeiger Array enthält (ListenKlasse, aufbauend auf Array, keine verkettete Liste), die auf Objekten der Klasse CListEntry (ein Eintrag in der Liste) besteht...die Methode fügt einen neuen EIntrag in die Liste ein...beim ersten Aufruf funzt das auch, beim 2. schon nicht mehr

    - der konstruktor init. die elemente so:

    CPlaylist::CPlaylist(void)
    {
    	this->_dbEntryArray		= NULL;
    	this->_ulTotalEntries	= 0;
    }
    

    so nochmal sry wg. meinem schlechten Code...peinlich... 🙄
    wär nett wenn nochmal jmd. drauf gucken könnte... 😉



  • Oha! schrieb:

    Muhahah mir fällt grad auf, das ich totale scheiße 😃 gepostet hab: Also hier n bissl Hintergrundwissen^^:

    - WinXP
    - Mircrsoft Visual C++ 6.0

    - Der Debug Modus meint, das hier:

    this->_dbEntryArray = new CListEntry*[this->_ulTotalEntries + 1];
    

    n Speicherfehlgriff statt findet... ("Access Violation")

    Du machst es dir sowieso etwas zu schwer 😉 (es reicht aus, deine gesamten Daten einmal zu kopieren:

    temp = new CListEntry*[_ulTotalEntries+1];
    for(i=i;i<_ulTotalEntries;++i)
      temp[i]=_dbEntryArray[i];
    temp [_ulTotal_Entries] = new CListEntry;
    //neues Element füllen
    delete[]_dbEntryArray;
    _dbEntryArray = temp;
    

    PS: Und wozu gibst du eigentlich einen Zeiger aus, den du direkt vorher freigegeben hast?

    - also es geht wie vll schon ersichtlich um eine Klasse die ein Zeiger Array enthält (ListenKlasse, aufbauend auf Array, keine verkettete Liste), die auf Objekten der Klasse CListEntry (ein Eintrag in der Liste) besteht...die Methode fügt einen neuen EIntrag in die Liste ein...beim ersten Aufruf funzt das auch, beim 2. schon nicht mehr

    Statt dir selber etwas zusammenzubauen, solltest du lieber auf vorgefertigte Methoden zurückgreifen: std::vector<> oder std::deque<> wären womöglich passend.

    PS: Und ob es gut geht, einen per new angelegten Pointer mit delete[] freizugeben, ist auch Glückssache.



  • PS: Und ob es gut geht, einen per new angelegten Pointer mit delete[] freizugeben, ist auch Glückssache.

    em wo denn ?

    thX schonmal ^^

    PS: die Ausgabe war nur n Test...für was anderes ... vergessen weg zu machen



  • Er meint sicher dieses delete

    delete [] this->_dbEntryArray;
    

    weiter oben steht das hier

    this->_dbEntryArray = new CListEntry*;
    


  • ok soweit so gut CStolls Tipps waren gut *THUMPSUP* funzt!!

    nochmal ne Frage: Ich organisier ja alle Einträge in einem Array in Form eines Pointer Array...
    Wenn ich jetzt Zugriffmethoden implementiere, die dann bspw. das erste Element ermitteln sollen...geht folgendes NICHT bzw. ist 'unzureichend' bezogen auf den Return Wert:

    Mit Zeigern:
    Positiv:
    - Wenn Liste leer, dann wird Error durch Return Wert NULL gekennz.
    Negativ:
    - Zeiger kann überschrieben werden, Zeiger Array enthält dann Fehler!
    - mit einer const CListEntry* lässt sich dann die Methoden der Klasse nicht mehr aufrufen...er meckert wg. nem Const-Objekt

    CListEntry* CPlaylist::GetFirstEntry(void)
    {
    	if(this->IsEmpty())
    		return (NULL);
    
    	return (this->_dbEntryArray[0]);
    }
    

    Mit Referenzen:
    Positiv:
    - Adresse kann nicht überschrieben werden
    Negativ:
    - keine Kennzeichnung eines Errors...durch eine leere Liste bswp.

    CListEntry& CPlaylist::GetFirstEntry(void)
    {
    	if(this->IsEmpty())
    		return (NULL);
    
    	return (*(this->_dbEntryArray[0]));
    }
    

    Habt ihr vll. n' Vorschlag, wie ich das lösen könnte ... oder vll. n' Fehler gefunden 🙄 ... ??

    THX schon mal 😉

    PS: Hier nochmal mein Beispielaufruf mit const-Zeiger:

    // ...
    // cPlaylist ist Objekt der Klasse CPlaylist und wurde vorher KORREKT
    // initialisiert.
    // ...
    char buf[100];
    const CListEntry* ptr = cPlaylist.GetLastEntry();
    if(ptr != NULL)
       ptr->GetEntryName(buf, 100); // Hier tritt der Fehler auf!
    
    cout << buf << endl;
    

    ...hier die Fehlermeldung des Compilers:

    error C2662: 'GetEntryName' : this-Zeiger kann nicht von 'const class CListEntry' in 'class CListEntry &' konvertiert werden
            Durch die Konvertierung gehen Qualifizierer verloren
    CListEntry.cpp
    

    danke nochmal für hlp! 🙂



  • Mach alle Funktionen, die nicht schreibend zugreifen (also alle get und is Methoden) const:

    bool isEmpty () const
    // bei allen
    


  • und was ist mit denen die schreibend darauf zugreifen...die sollen ja auch verfügbar sein...!!!

    der schreibschutz soll sich lediglich auf den ptr im Array beziehen!

    DANKE !


Anmelden zum Antworten