[C++] Array problem



  • Eigentlich wollte ich euch folgendes fragen:

    Ich versuche in dieser Funktion ein Array um einen Eintrag zu erweitern.
    Funktioniert aber leider nicht so ganz, wie ich es mir erhofft hab.

    Anscheinend funktioniert der Teil mit dem Kopieren nicht Richtig.

    Aber da ich bemerkt habe, das die deletes ( mit -> markiert ) die Fehlerquelle waren, würde ich nun gern Folgendes wissen:

    Wo platziere ich die deletes am Besten/Sinnvollsten ?
    Oder, wie lösche ich einzelne Indizies eines Arrays ?
    Oder, wie verwende ich die delete Funktion richtig ?

    int c_sprite::addFrame ( char *bitmapPath )
    {
    	c_bitmap bitmap;
    
    	if ( !bitmap.loadBitmap ( bitmapPath ) )
    	{
    		return false;
    	}
    
    	long pixels								= bitmap.bitmapData.infoheader.bitmapWidth * bitmap.bitmapData.infoheader.bitmapHeight;
    	int newSize								= spriteData.header.spriteFrames + 1;
    
    	// Temporäre Framedaten Initialisieren und Kopieren.
    
    	spriteData.temp							= new struct c_sprite::d_sprite::d_frame[newSize];
    
    	// Ist ein Frame Vorhanden ? Nein ? Dann eins hinzufügen. Ansonsten Kopieren.
    	if ( spriteData.header.spriteFrames == 0 )
    	{
    		spriteData.temp[0].frameType		= SINGLEFRAME;
    		spriteData.temp[0].frameOriginX		= NULL;
    		spriteData.temp[0].frameOriginY		= NULL;
    		spriteData.temp[0].frameWidth		= bitmap.bitmapData.infoheader.bitmapWidth;
    		spriteData.temp[0].frameHeight		= bitmap.bitmapData.infoheader.bitmapHeight;
    
    		int z = spriteData.temp[0].frameWidth * spriteData.temp[0].frameHeight;
    
    		spriteData.temp[0].p_frameData = new unsigned char[z];
    
    		for ( int d = 0; d < z; d++ )
    		{
    			spriteData.temp[0].p_frameData[d]	= bitmap.bitmapData.p_pixelmap[d].pixel8Bit;
    		}
    
    		// Ist das neue Frame größer als die Angabe im Header ? Ja, dann Header Updaten.
    		if ( spriteData.header.spriteWidth < bitmap.bitmapData.infoheader.bitmapWidth )
    			spriteData.header.spriteWidth = bitmap.bitmapData.infoheader.bitmapWidth;
    		if ( spriteData.header.spriteHeight < bitmap.bitmapData.infoheader.bitmapHeight )
    			spriteData.header.spriteHeight = bitmap.bitmapData.infoheader.bitmapHeight;
    		// Frameanzahl im Header Updaten.
    
    		spriteData.header.spriteFrames ++;
    	}
    
    	else
    	{
    		for ( int f = 0; f < spriteData.header.spriteFrames; f++ )
    		{
    			if ( spriteData.frame[f].frameType == SINGLEFRAME )
    			{
    				spriteData.temp[f].frameType		= spriteData.frame[f].frameType;
    				spriteData.temp[f].frameOriginX		= spriteData.frame[f].frameOriginX;
    				spriteData.temp[f].frameOriginY		= spriteData.frame[f].frameOriginY;
    				spriteData.temp[f].frameWidth		= spriteData.frame[f].frameWidth;
    				spriteData.temp[f].frameHeight		= spriteData.frame[f].frameHeight;
    
    				int z = spriteData.temp[f].frameWidth * spriteData.temp[f].frameHeight;
    
    				spriteData.temp[f].p_frameData = new unsigned char[z];
    
    				for ( int d = 0; d < z; d++ )
    				{
    					spriteData.temp[f].p_frameData[d]	= spriteData.frame[f].p_frameData[d];
    				}
    
    				// Altes FrAy löschen.
    
    // ->				delete [f] spriteData.frame;
    			}
    			else if ( spriteData.frame[f].frameType == GROUPFRAME )
    			{
    				return -1;
    			}
    		}
    		// Neues Frame hinzufügen
    		spriteData.temp[newSize-1].frameType		= SINGLEFRAME;
    		spriteData.temp[newSize-1].frameOriginX		= NULL;
    		spriteData.temp[newSize-1].frameOriginY		= NULL;
    		spriteData.temp[newSize-1].frameWidth		= bitmap.bitmapData.infoheader.bitmapWidth;
    		spriteData.temp[newSize-1].frameHeight		= bitmap.bitmapData.infoheader.bitmapHeight;
    
    		int z = bitmap.bitmapData.infoheader.bitmapWidth * bitmap.bitmapData.infoheader.bitmapHeight;
    
    		spriteData.temp[newSize-1].p_frameData = new unsigned char[z];
    
    		for ( int d = 0; d < z; d++ )
    		{
    			spriteData.temp[newSize-1].p_frameData[d]	= bitmap.bitmapData.p_pixelmap[d].pixel8Bit;
    		}
    
    		// Ist das neue Frame größer als die Angabe im Header ? Ja, dann Header Updaten.
    		if ( spriteData.header.spriteWidth < bitmap.bitmapData.infoheader.bitmapWidth )
    			spriteData.header.spriteWidth = bitmap.bitmapData.infoheader.bitmapWidth;
    		if ( spriteData.header.spriteHeight < bitmap.bitmapData.infoheader.bitmapHeight )
    			spriteData.header.spriteHeight = bitmap.bitmapData.infoheader.bitmapHeight;
    		// Frameanzahl im Header Updaten.
    
    		spriteData.header.spriteFrames ++;
    	}
    
    	// Neues FrameArray beantragen und Temporäre Daten hineinkopieren.
    
    	spriteData.frame = new struct c_sprite::d_sprite::d_frame[spriteData.header.spriteFrames];
    
    	for ( int f = 0; f < spriteData.header.spriteFrames; f++ )
    	{
    		spriteData.frame[f].frameType			= spriteData.temp[f].frameType;
    		spriteData.frame[f].frameOriginX		= spriteData.temp[f].frameOriginX;
    		spriteData.frame[f].frameOriginY		= spriteData.temp[f].frameOriginY;
    		spriteData.frame[f].frameWidth			= spriteData.temp[f].frameWidth;
    		spriteData.frame[f].frameHeight			= spriteData.temp[f].frameHeight;
    
    		int z = spriteData.frame[f].frameWidth * spriteData.frame[f].frameHeight;
    
    		spriteData.frame[f].p_frameData = new unsigned char[z];
    
    		for ( int d = 0; d < z; d++ )
    		{
    			spriteData.frame[f].p_frameData[d]	= spriteData.temp[f].p_frameData[d];
    		}
    		// Temporäres Fray löschen.
    
    // ->		delete [f] spriteData.temp;
    	}
    
    	return true;
    };
    


  • Du legst oft Zeiger an die noch auf was aufm Heap zeigen ... kann net gut gehen ^^



  • (D)Evil schrieb:

    Du legst oft Zeiger an die noch auf was aufm Heap zeigen ... kann net gut gehen ^^

    😕 Hä?
    Wenn mans richtig mach kann ein Zeiger überall hinzeigen und es geht gut.

    Was du mit new anlegst wird mit delete gelöscht.
    Was du mit new ...[] anlegst wir dmit delete [] ... gelöscht.
    also

    spriteData.temp[0].p_frameData = new unsigned char[z];
    ...
    delete [] spriteData.temp[0].p_frameData;
    


  • Ahso ...

    schade ... ich dachte, ich könnte mit

    nen bestimmten array eintrag löschen.

    aber das ging ned so recht



  • Dafür nimmst du std::vector (www.cppreference.com zum nachschlagen)


Anmelden zum Antworten