Struktur Pointer auf NULL zeigen lassen



  • Hi!

    Ich glaube nicht das es daran liegt, aber ich habe es in C89 so gelernt das man explizit castet ((foo)0). Vielleicht macht er es ja dann.

    Wie lautet die Fehlermeldung?

    Code-Hacker



  • Ich benutzte VC6.0
    also im Detai ich will eine Klasse für eine "Tile-Engine" schreiben dabei hab, dabei will ich offen lassen wie groß die Map, ein Tile ist, sowie wo sie im Spiel einsetzt
    Hier mein Header:

    #ifndef __Tiles_H__
    #define __Tiles_H__
    
    struct Pixel
    {
    	int x;
    	int y;
    };
    
    struct Tile
    {
    	Pixel Pixel;	//Die Koordinaten des Pixels der Linken Oberen Ecke des Tiles
    	int tile_x;		//Die Koordinaten des Tiles
    	int tile_y;		//in der Tilearray
    	bool passable;  //Durchässig? ja=1 nein=0;
    };
    
    class Tiles
    {
    	private:
    		int SizeOfTile_w;
    		int SizeOfTile_h;
    
    		int SizeOfMap_w;
    		int SizeOfMap_h;
    		int NumberOfTilesInX;
    		int NumberOfTilesInY;
    		int FirstTileX;
    		int FirstTileY;
    		Tile *pTileArray;
    		Pixel PixelForWork;
    		Tile TileForWork;
    	public:
    		Pixel *Tiles_TileToPixel(int Tile_x, int Tile_y);
    		Tile* PixelToTile(int Pixel_x, int Pixel_y);
    		int Tiles_SetTileSizeandMapSize(int FirstTile_x, int FirstTile_y,int Tile_w, int Tile_h,int Map_w,int Map_h); 
    		void Tiles_InitTileArray(void);
    		//Tiles_SetActionTile(); //Funktion noch nicht implimentiert
    		Tile* Tiles_TestforActionTile(int Tile_x, int Tile_y);
    		~Tiles();
    };
    
    #endif
    

    und hier die Funktion die das das Feld erzeugt:

    // Reserviert eine Dynamische Array für die Tiles, wenn ein Fehler auftritt wird 1 zurückgegeben
    // auserdem initialisiert er die TileArray noch mit NULL
    //Achtung nur gerade Tiles- und MapSizes möglich
    
    int Tiles::Tiles_SetTileSizeandMapSize(int FirstTile_x,int FirstTile_y,int Tile_w, int Tile_h,int Map_w,int Map_h)
    {
    	SizeOfTile_w=Tile_w;
    	SizeOfTile_h=Tile_h;
    	SizeOfMap_w=Map_w;
    	SizeOfMap_h=Map_h;
    
    	NumberOfTilesInX=SizeOfMap_w/SizeOfTile_w;
    	NumberOfTilesInY=SizeOfMap_h/SizeOfTile_h;
    
    	FirstTileX=FirstTile_x;
    	FirstTileY=FirstTile_y;
    	pTileArray= new Tile[NumberOfTilesInX*NumberOfTilesInY];
    	if(pTileArray==0)
    		return 1;
    	else
    		return 0;
    
    }
    

    Danach soll die Funktion aufgerufen werden und genau hier macht er den Fehler:

    void Tiles::Tiles_InitTileArray(void)
    {
    	for(int i=0; i<(NumberOfTilesInX*NumberOfTilesInY); i++)
    		pTileArray[i]=0;
    }
    

    Fehlermeldung:
    C:\dominik programmi9eren\sdl\Fensterinitialisierung\Tiles.cpp(61) : error C2679: Binaerer Operator '=' : Kein Operator definiert, der einen rechtsseitigen Operator vom Typ 'const int' akzeptiert (oder keine geeignete Konvertierung moeglich)
    C:\dominik programmi9eren\sdl\Fensterinitialisierung\Tiles.cpp(72) : error C2676: Binaerer Operator '==' : 'struct Tile' definiert diesen Operator oder eine Konvertierung in einen fuer den vordefinierten Operator geeigneten Typ nicht
    Fehler beim Ausführen von cl.exe.

    Also realisieren will ích das in SDL,n ich hab mir das so gedacht das ich nur den Tiles der Array einen Pointer auf eine Struktur gehb die auch wirklich eine funktion haben, die die nichts auslösen sollen einfach auf NULL zeigen, damit ich schnell abfragen kann ob das Feld etwas ausllöst oder nicht. Ich weiß es sieht furchtbar aus aber es soll ja funktionieren und nicht als bild dienen 😃



  • alles relativ schrieb:

    Danach soll die Funktion aufgerufen werden und genau hier macht er den Fehler:

    void Tiles::Tiles_InitTileArray(void)
    {
    	for(int i=0; i<(NumberOfTilesInX*NumberOfTilesInY); i++)
    		pTileArray[i]=0;
    }
    

    Fehlermeldung:
    C:\dominik programmi9eren\sdl\Fensterinitialisierung\Tiles.cpp(61) : error C2679: Binaerer Operator '=' : Kein Operator definiert, der einen rechtsseitigen Operator vom Typ 'const int' akzeptiert (oder keine geeignete Konvertierung moeglich)

    pTileArray ist ein Array aus Tile-Objekten. pTileArray[i] ist dann logischerweise ein Tile-Objekt. Einem Tile kannst du aber nicht 0 zuweisen, weil der Compiler nichts damit anzufangen weiß. Das ist dasselbe wie:

    Tile a;
    a = 0;
    

    btw:

    #ifndef __Tiles_H__
    #define __Tiles_H__
    /* */
    #endif
    

    Lass die Unterstriche am Anfang weg. Führende Unterstriche sind dem Compiler reserviert.



  • Nochwas:

    alles relativ schrieb:

    pTileArray= new Tile[NumberOfTilesInX*NumberOfTilesInY];
    	if(pTileArray==0)
    		return 1;
    	else
    		return 0;
    

    Dieses if ergibt niemals true. new wirft eine Exception, wenn ein Fehler beim Speicherbeschaffen auftritt. Es liefert keinen Nullzeiger.



  • außerdem lässt sich so etwas wenn

    if(a)
      return 1;
    else
      return 0;
    

    auch einfach durch

    return a;
    

    ersetzen 🙄

    Lass die Unterstriche am Anfang weg. Führende Unterstriche sind dem Compiler reserviert.

    Doppelte Unterstriche erst recht, egal wo sie stehen. In der FAQ steht mehr dazu



  • kingruedi schrieb:

    außerdem lässt sich so etwas wenn

    if(a)
      return 1;
    else
      return 0;
    

    auch einfach durch

    return a;
    

    ersetzen 🙄

    Das ist nicht dasselbe!



  • Die Funktion Tiles_SetTileSizeandMapSize() sollte IMHO sogar den Rückgabetyp void haben, nicht int oder bool.
    Wenn etwas schiefgeht (was nur bei new passieren kann) wird eine Exception geworfen. Dafür braucht man keinen Rückgabewert.



  • @interpreter
    doch, weil hier ja int als bool missbraucht wird.



  • kingruedi schrieb:

    @interpreter
    doch, weil hier ja int als bool missbraucht wird.

    Unter diesem Gesichtspunkt ja - hab mir den Thread nicht durchgelesen. Allgemein betrachtet geben deine 2 Sourcefragmente aber nicht das selbe zurück.



  • cd9000 schrieb:

    Dieses if ergibt niemals true. new wirft eine Exception, wenn ein Fehler beim Speicherbeschaffen auftritt. Es liefert keinen Nullzeiger.

    ist schon shit wenn das dann einem in zwei verschiedenen Standard c++ werken sowie in so manchem Tut eingetrichtert wirt, danke lfür den hinweis werd ich mir merken 🙂

    [quote="cd9000]pTileArray ist ein Array aus Tile-Objekten. pTileArray[i] ist dann logischerweise ein Tile-Objekt. Einem Tile kannst du aber nicht 0 zuweisen, weil der Compiler nichts damit anzufangen weiß. Das ist dasselbe wie:

    Tile a;
    a = 0;
    

    [/quote]
    Ups war wohl ein "kleiner" logikfehler meinerseits tja das passiert bei schlafmangel bei mir öfters 😉

    #ifndef __Tiles_H__
    #define __Tiles_H__
    /* */
    #endif
    

    Lass die Unterstriche am Anfang weg. Führende Unterstriche sind dem Compiler reserviert.[/quote]

    Ich hab mich jetzt mal schlau gemacht -> auch guter tipp

    Ich liebe kritik bei der ich was lernen kann 😉
    Vielen Dank, aber was schlagt ihr dann bei meinem Problem vor, ich möcht net zu viel speicher verschwenden und für jedes Tile ob es was auswirkt oder nicht ein eigene Sturktur bereitstellen?



  • Ach genau das noch:

    kingruedi schrieb:

    außerdem lässt sich so etwas wenn

    if(a)
      return 1;
    else
      return 0;
    

    auch einfach durch

    return a;
    

    ersetzen 🙄

    Lass die Unterstriche am Anfang weg. Führende Unterstriche sind dem Compiler reserviert.

    Doppelte Unterstriche erst recht, egal wo sie stehen. In der FAQ steht mehr dazu

    Das habe ich nur benutz um später mehr verschiedene Fehlermeldungen ausgeben zu können, etwa wenn llllungültige Parametern nübergeben wurden (Falsche Mapgröße ect.) Trotzdem danke

    *lefts* Mehr Kritik ich will lernen !!! 😉


Anmelden zum Antworten