pointer übergabe an andere klasse



  • hallo,

    ich bekomme eine fehler meldung wenn ich einen BYTE pointer aus meiner dialog klasse an eine generic wnd klasse übergeben möchte (per funktionsaufruf). Innerhalb der funktion kopier ich den inhalt des BYTE pointers auf eine membervariable der generic wnd klasse.

    der rücksprung funktioniert, jedoch bekomme ich dann beim rücksprung aus meiner dialogklassen funktion folgenden fehler:

    "DAMAGE: before normal block ... usw."

    was mache ich falsch?

    void CPreprocessDlg::LoadPictureFromFile(CString csFilePath, int nBufNum)
    {
    	CBitmap *pCBitmap;
    	CPic_Buffer pbPicBuffer;
    	BYTE *pBGRData;
    	int nWidth,nHeight;
    	if(csFilePath.Find(".BMP",0)!=-1 || csFilePath.Find(".bmp",0)!=-1) //wenn Dateiendung == *.bmp oder *.BMP
    	{
    		pCBitmap = CPicConvert::BMPFileToCBitmap(csFilePath,false); //false -> Bitmap mit 32Bit einlesen
    		CPicConvert::GetCBitmapDimension(pCBitmap,&nWidth,&nHeight);
    		pBGRData = CPicConvert::CBitmapToBGRData(pCBitmap,nWidth,nHeight,32);
    		pbPicBuffer.SetPicBuffer(pBGRData,nWidth,nHeight,32,nBufNum);
    	//delete[] pBGRData;
    	}
    	else
    	{
    		AfxMessageBox("Bitte wählen sie eine Bitmap aus!");
    	}
    }
    
    void CPic_Buffer::SetPicBuffer(BYTE *pBGRData, int nWidth, int nHeight, int nBitPerPixel,int nBufNum)
    {
    	int n, nBytePerPixel;
    	BYTE *pBGRDataAnf,*pBGRBufferAnf;
    	m_nWidth = nWidth;
    	m_nHeight = nHeight;
    	m_nBitPerPixel = nBitPerPixel;
    
    	nBytePerPixel = nBitPerPixel;
    
    	if(m_pBGRBuffer!=NULL)
    	{
    		delete[] m_pBGRBuffer;
    	}
    
    	m_pBGRBuffer[nBufNum] = new BYTE[nWidth*nHeight*nBytePerPixel];
    	pBGRBufferAnf = m_pBGRBuffer[nBufNum];
    	pBGRDataAnf = pBGRData;
    
    	for(n=0;n<m_nWidth*m_nHeight*nBytePerPixel;n=n+nBytePerPixel)
    	{
    		*m_pBGRBuffer[nBufNum] = *pBGRData;
    
    		pBGRData++;
    		m_pBGRBuffer[nBufNum]++;
    		*m_pBGRBuffer[nBufNum] = *pBGRData;
    
    		pBGRData++;
    		m_pBGRBuffer[nBufNum]++;
    
    		*m_pBGRBuffer[nBufNum] = *pBGRData;
    
    		pBGRData=pBGRData+2;
    		m_pBGRBuffer[nBufNum]=m_pBGRBuffer[nBufNum]+2;
    	}
    
    	m_pBGRBuffer[nBufNum] = pBGRBufferAnf;
    	pBGRData = pBGRDataAnf;
    }
    

    mfg, TFTS

    PS: ich nutze noch Visual C++ 6.0



  • es scheint wohl irgendwie damit zusammenzuhängen, dass ich membervariablen zu tun hab. Auch alle anderen werte zb m_nWidth, m_nHeight die ich als membervariablen speichern will, behalten ihre werte nicht. Beim nächsten funktionsaufruf sind sie wieder nicht definiert.

    mfg, TFTS



  • TFTomSun schrieb:

    if(m_pBGRBuffer!=NULL)
    	{
    		delete[] m_pBGRBuffer;
    	}
    
    	m_pBGRBuffer[nBufNum] = new BYTE[nWidth*nHeight*nBytePerPixel];
    

    Keine Ahnung was du da vorhast, aber das funktioniert so nicht. Egal ob m_pBGRBuffer ein Nullzeiger ist oder nicht, du erzeugst auf jeden Fall undefiniertes Verhalten.

    Ist m_pBGRBuffer ein Nullzeiger, dann fliegt dir hier das Programm um die Ohren:

    m_pBGRBuffer[nBufNum]
    

    Ist m_pBGRBuffer kein Nullzeiger, dann gibst du den Speicher mit delete[] frei. Danach steht zwar noch irgendein Adresswert in m_pBGRBuffer, der ist für dich aber mittlerweile gestorben, da ungültig. Demnach schickst du dein Programm mit m_pBGRBuffer[nBufNum] ebenfalls ins Nirvana.



  • vielen dank... das problem ist behoben... trotzdem behalten die membervariablen ihren wert nicht bis zum nächsten funktionsaufruf

    woran kann das liegen?

    und wie kann ich dann überprüfen ob für meinen membervariablen pointer schon mal speicher reserviert wurde... so dass ich dann den speicher freigebe bevor ich mit new wieder neuen speicher reserviere?

    mfg, TFTS



  • Deine Instanz von CPic_Buffer besteht ja nur in der LoadPictureFromFile Methode.
    Wurde die Funktion abgearbeitet, ist auch die Instanz dahin, also auch alle Member
    Variablen.
    Gruß charlie


Anmelden zum Antworten