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 !!!