Array in Struct trotz Initialisierung leer/size 0



  • ^ Hm, wie sieht es dann hiermit aus?:

    Die Structs:

    #ifndef TILESET_H
    #define TILESET_H
    #include <gb\gb.h>
    
    typedef struct tileCollision
    {
    	UBYTE tileID;
    	UBYTE collisionType;
    }TileCollision;
    typedef struct tileset
    {
    	UBYTE *tileArray;
    	TileCollision *tileCollision;
    }Tileset;
    #endif
    
    #include "C:\Users\nilsg\Dropbox\GameboyDev\jnr\tileset.h"
    /*
    	General Tiles
    */
    const UBYTE mainTiles[] =
    {
      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
      0xFF,0xFF,0xC0,0x80,0xBF,0x80,0xBF,0x80,
      0xBF,0x80,0xBF,0x80,0xA0,0xDF,0xFF,0xFF,
      0xFF,0xFF,0xF1,0x03,0x0D,0x01,0xFD,0x01,
      0xF5,0x09,0xFD,0x01,0x8D,0x73,0xFF,0xFF,
      0xFF,0xFF,0xF1,0x03,0x0D,0x01,0xFD,0x01,
      0xF5,0x09,0xFD,0x01,0x3D,0xC3,0xFF,0xFF,
      0xFF,0xFF,0x80,0xC0,0xBF,0x80,0xBF,0x80,
      0xAF,0x90,0xBF,0x80,0xB0,0xCF,0xFF,0xFF,
      0xFF,0xFF,0xC1,0xFF,0x90,0xFF,0x80,0xFF,
      0x82,0xFF,0x80,0xFF,0xC0,0xFF,0xFF,0xFF,
      0xFF,0xFF,0x03,0xFF,0x01,0xFF,0x01,0xFF,
      0x21,0xFF,0x01,0xFF,0x03,0xFF,0xFF,0xFF,
      0xFF,0xFF,0x83,0xFF,0x01,0xFF,0x05,0xFF,
      0x01,0xFF,0x11,0xFF,0x03,0xFF,0xFF,0xFF,
      0xFF,0xFF,0xC0,0xFF,0x80,0xFF,0x88,0xFF,
      0x80,0xFF,0x80,0xFF,0xC0,0xFF,0xFF,0xFF,
      0xFF,0xFF,0x02,0xFF,0x7F,0xFF,0x7F,0xFF,
      0xFF,0xFF,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,
      0xFF,0xFF,0x86,0xFF,0xFE,0xFF,0xFE,0xFF,
      0xFE,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,
      0xFF,0xFF,0x2F,0xFF,0xFF,0xFF,0xFF,0xFF,
      0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
      0xFF,0xFF,0xCB,0xFF,0xFF,0xFF,0xFF,0xFF,
      0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
      0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
      0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
      0xFF,0xFF,0x86,0xFF,0xFE,0xFF,0xFE,0xFF,
      0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,
      0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
      0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
      0xFF,0xFF,0xCB,0xFF,0xFF,0xFF,0xFF,0xFF,
      0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
      0xFF,0xFF,0x01,0x01,0x38,0x00,0xFF,0x00,
      0xFF,0xFF,0xC4,0x3B,0x00,0xFF,0xFF,0xFF,
      0x91,0x7E,0x10,0xFF,0xFF,0xFF,0xF8,0x07,
      0x00,0xFF,0xFF,0xFF,0x93,0x7C,0x10,0xFF,
      0xFF,0xFF,0xC0,0xC0,0x14,0x00,0xFF,0x00,
      0xFF,0xFF,0x96,0xE9,0x80,0xFF,0xFF,0xFF,
      0xE5,0x1E,0x04,0xFF,0xFF,0xFF,0x9C,0xE3,
      0x80,0xFF,0xFF,0xFF,0x86,0x7D,0x04,0xFF,
      0xFF,0xFF,0x01,0x01,0x38,0x00,0xFF,0x00,
      0xFF,0xFF,0xC4,0x3B,0x00,0xFF,0xFF,0xFF,
      0x91,0x7E,0x10,0xFF,0xFF,0xFF,0xF8,0x07,
      0x00,0xFF,0xFF,0xFF,0x93,0x7C,0x10,0xFF,
      0xFF,0xFF,0xC1,0xC1,0x15,0x01,0xFF,0x01,
      0xFF,0xFF,0x97,0xE9,0x81,0xFF,0xFF,0xFF,
      0xE4,0x1C,0x04,0xFC,0xFF,0xFF,0x9D,0xE3,
      0x81,0xFF,0xFF,0xFF,0x84,0x7C,0x04,0xFC,
      0xFF,0xFF,0x81,0x81,0xB8,0x80,0xFF,0x80,
      0xFF,0xFF,0xC4,0xBB,0x80,0xFF,0xFF,0xFF,
      0x11,0x1E,0x10,0x1F,0xFF,0xFF,0xF8,0x87,
      0x80,0xFF,0xFF,0xFF,0x13,0x1C,0x10,0x1F,
      0xFF,0xFF,0xC0,0xC0,0x14,0x00,0xFF,0x00,
      0xFF,0xFF,0x96,0xE9,0x80,0xFF,0xFF,0xFF,
      0xE5,0x1E,0x04,0xFF,0xFF,0xFF,0x9C,0xE3,
      0x80,0xFF,0xFF,0xFF,0x86,0x7D,0x04,0xFF,
      0x5E,0x01,0x0C,0x03,0x2C,0x03,0x1C,0x03,
      0x2E,0x01,0x2A,0x05,0x1A,0x05,0x5C,0x03,
      0x4E,0x01,0x0E,0x01,0x5A,0x05,0x0A,0x05,
      0x28,0x07,0x2C,0x03,0x1E,0x01,0x5E,0x01,
      0x7A,0x80,0x30,0xC0,0x34,0xC0,0x38,0xC0,
      0x74,0x80,0x54,0xA0,0x58,0xA0,0x3A,0xC0,
      0x72,0x80,0x70,0x80,0x5A,0xA0,0x50,0xA0,
      0x14,0xE0,0x34,0xC0,0x78,0x80,0x7A,0x80,
      0x70,0x80,0x54,0xA0,0x5C,0xA0,0x18,0xE0,
      0x10,0xE0,0x31,0xC0,0x35,0xC0,0x75,0x80,
      0x54,0xA0,0x5C,0xA0,0x58,0xA0,0x18,0xE0,
      0x10,0xE0,0x34,0xC0,0x3D,0xC0,0x78,0x80,
      0x0E,0x01,0x8A,0x05,0xA8,0x07,0x3C,0x03,
      0x1C,0x03,0x0C,0x03,0x2E,0x01,0x3E,0x01,
      0xBA,0x05,0x9A,0x05,0x8A,0x05,0xA8,0x07,
      0x2C,0x03,0x3C,0x03,0x3C,0x03,0x9E,0x01,
      0x00,0x00,0x00,0x00,0x1D,0x00,0x33,0x08,
      0x73,0x08,0x6E,0x11,0xEE,0x11,0xEE,0x11,
      0x00,0x00,0x40,0x20,0xC0,0x00,0x8C,0x42,
      0x18,0x84,0x36,0x89,0xF5,0x0A,0xEA,0x14,
      0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,
      0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,
      0xFA,0x05,0xF2,0x0D,0xF4,0x0A,0xE4,0x1A,
      0x88,0x74,0x30,0xC8,0xC0,0x30,0x00,0xC0,
      0x7F,0x80,0x7F,0x80,0x3F,0x40,0x3F,0x40,
      0x1F,0x20,0x0F,0x10,0x03,0x0C,0x00,0x03,
      0x00,0x03,0x03,0x0C,0x0F,0x10,0x13,0x20,
      0x23,0x40,0x27,0x40,0x7F,0x80,0x7F,0x80,
      0x00,0xC0,0xC0,0x30,0xF0,0x08,0xF8,0x04,
      0xFC,0x02,0xFC,0x02,0xFE,0x01,0xFE,0x01,
      0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,
      0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,
      0xFA,0x05,0xF2,0x0D,0xF4,0x0B,0xE4,0x1B,
      0x88,0x77,0x30,0xCF,0xC0,0x3F,0x00,0xFF,
      0x7F,0x80,0x7F,0x80,0x3F,0xC0,0x3F,0xC0,
      0x1F,0xE0,0x0F,0xF0,0x03,0xFC,0x00,0xFF,
      0x00,0xFF,0x00,0xFF,0x04,0xFA,0x04,0xFA,
      0x08,0xF4,0x30,0xC8,0xC0,0x30,0x00,0xC0,
      0x00,0xFF,0x00,0xFF,0x00,0x7F,0x00,0x7F,
      0x00,0x3F,0x00,0x1F,0x00,0x0F,0x00,0x03,
      0x00,0xFF,0x04,0xFB,0x19,0xE6,0x33,0xCC,
      0x6F,0x90,0x5F,0xA0,0xDE,0x21,0xBD,0x42,
      0x00,0x00,0x04,0x00,0x19,0x00,0x33,0x08,
      0x6F,0x10,0x5F,0x20,0xDE,0x21,0xBD,0x42,
      0xBD,0x42,0xB9,0x46,0xBB,0x44,0xBB,0x44,
      0xBB,0x44,0xBB,0x44,0x7B,0x84,0xFF,0x00,
      0x22,0x00,0xCC,0x00,0x98,0x44,0xF0,0x08,
      0x51,0xA8,0x6A,0x91,0xE5,0x12,0xED,0x12,
      0xEB,0x14,0xE3,0x1C,0xDB,0x24,0xDF,0x20,
      0xDF,0x20,0xFF,0x00,0xFF,0x00,0xFF,0x00,
      0x22,0xDD,0xCC,0x33,0x98,0x67,0xF0,0x0F,
      0x51,0xAE,0x6A,0x95,0xE5,0x1A,0xED,0x12,
      0x00,0xFF,0x00,0x00,0xFF,0x00,0x39,0xC6,
      0xD4,0xEF,0x02,0xFF,0x29,0xDF,0x10,0xFF,
      0x82,0x7D,0x80,0x7F,0x22,0xDD,0xFF,0x00,
      0xDF,0x20,0xFF,0x00,0x7E,0x81,0x1C,0xE3,
      0x00,0xFF,0x00,0x00,0xFF,0x00,0xA7,0x58,
      0x56,0xF9,0x89,0xFF,0x24,0xFF,0x02,0xFF,
      0x00,0xFF,0x24,0xDB,0x6E,0x91,0xFF,0x00,
      0xFF,0x00,0xFF,0x00,0x7C,0x83,0x54,0xAB,
      0x00,0xF8,0x00,0x06,0xFC,0x01,0xA6,0x59,
      0x56,0xF9,0x89,0xFF,0x25,0xFF,0x03,0xFF,
      0x01,0xFF,0x59,0xA7,0x3F,0xC1,0xEF,0x11,
      0xFF,0x01,0xFF,0x01,0xDD,0x23,0x09,0xF7,
      0x00,0x7F,0x00,0x80,0x7F,0x80,0xB9,0xC6,
      0xD4,0xEF,0x82,0xFF,0xA9,0xDF,0x90,0xFF,
      0x82,0xFD,0x80,0xFF,0xA2,0xDD,0xFF,0x80,
      0xDF,0xA0,0xFF,0x80,0xFE,0x81,0x9C,0xE3,
      0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xC6,
      0x00,0xEF,0xC4,0x3B,0xE6,0x19,0xEF,0x10,
      0x7D,0x00,0x7F,0x00,0xDD,0x00,0x00,0x00,
      0x20,0x00,0x00,0x00,0x81,0x00,0xE3,0x00,
      0x00,0xFF,0x00,0x00,0xFF,0x00,0xA7,0x58,
      0x06,0xF9,0x50,0xAF,0xD9,0x26,0xFD,0x02,
      0xFF,0x00,0xDB,0x00,0x91,0x00,0x00,0x00,
      0x00,0x00,0x00,0x00,0x83,0x00,0xAB,0x00,
      0x00,0xF8,0x00,0x06,0xFC,0x01,0xA6,0x59,
      0x06,0xF9,0x50,0xAF,0xD8,0x27,0xFC,0x03,
      0xFE,0x01,0xA6,0x01,0xC0,0x01,0x10,0x01,
      0x00,0x01,0x00,0x01,0x22,0x01,0xF6,0x01,
      0x00,0x7F,0x00,0x80,0x7F,0x80,0x39,0xC6,
      0x10,0xEF,0x64,0x9B,0x46,0x99,0x6F,0x90,
      0x7D,0x80,0x7F,0x80,0x5D,0x80,0x00,0x80,
      0x20,0x80,0x00,0x80,0x01,0x80,0x63,0x80,
      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
      0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
    };
    
    const TileCollision generalTileColl[]=
    {
    	{1,1},
    	{2,1},
    	{3,1},
    	{4,1},
    	{17,1},
    	{18,1},
    	{19,1},
    	{20,1},
    	{21,1},
    	{22,1},
    	{23,1},
    	{24,1},
    	{25,1},
    	{26,1},
    	{27,1},
    	{28,1},
    	{55,1},
    	{56,1},
    	{57,1},
    	{58,1},
    	{59,1},
    	{60,1},
    	{61,1},
    	{62,1},
    	{63,55},
    	{65,55},
    	{67,55},
    	{69,55}
    };
    
    const Tileset generalTileset =
    {
    	mainTiles,
    	generalTileColl
    };
    

    bin mir gerade nicht sicher, ob das so richtig ist, was die Initialisierung ganz unten angeht.
    Jedenfalls kriege ich den Fehler:

    tileset.c(190):warning *** Initializer different levels of indirections



  • Das eine ist const-qualified (globale Variablen) und das andere nicht (struct member). Entweder beide oder keines.



  • Das heißt also, ich muss sowohl die Members im Struct als "const" sowie die Deklarationen dieser mit "const" versehen?

    Ich kriege allerdings noch immer den gleichen Fehler.

    typedef const struct tileCollision
    {
    	const UBYTE tileID;
    	const UBYTE collisionType;
    }TileCollision;
    typedef const struct tileset
    {
    	const UBYTE *tileArray;
    	const TileCollision *tileCollision;
    }Tileset;
    
    const UBYTE mainTiles[] =
    {
     [...]
    };
    
    const TileCollision generalTileColl[]=
    {
    	[...]
    };
    
    const Tileset generalTileset =
    {
    	mainTiles,
    	generalTileColl
    };
    


  • Von Deklaration schrieb ich doch nichts. Ich meinte:

    typedef struct tileCollision
    {
        UBYTE tileID;
        UBYTE collisionType;
    }TileCollision;
    typedef struct tileset
    {
        const UBYTE *tileArray;
        const TileCollision *tileCollision;
    }Tileset;
    

    Daran liegt es jedoch anscheinend nicht. Die Warnung passt auch irgendwie nicht dazu (Zeile 190!?). Dein Compiler beherrscht anscheined kein ANSI bzw. ISO C. Ansonsten probiere doch mal const ganz weg zu lassen (wenn du das willst) oder explizite Casts:

    const Tileset generalTileset =
    {
        (const UBYTE *)mainTiles,
        (const TileCollision *)generalTileColl
    };
    

    Ignorieren, da es nur eine (wahrscheinlich falsche) Warnung ist, wäre auch noch eine Lösung.



  • Ich denke mir auch, dass die Warnung eventuell falsch ist.

    Das Ding ist aber, dass

    printf("%u",(unsigned int)generalTileset.tileCollision[1].tileID);
    

    bspw. immer 0 ausgibt, egal was ich als Index angebe.



  • Rail schrieb:

    Ich denke mir auch, dass die Warnung eventuell falsch ist.

    Quatsch.
    Der Compiler gibt keine falschen Warnungen.
    Er warnt vor Unsinn, und ein (const...) Cast ist z.B. solch ein Unsinn, den Anfänger häufig machen um Warnungen zu unterdrücken.



  • Dann sag doch mal, wo der Fehler liegt. Der verwendete Compiler kann anscheinend nicht const type * mit einem Ausdruck vom Typ const type [n] initialisieren. Das sollte doch möglich sein?

    Folgendes fällt mir noch ein.

    const Tileset generalTileset =
    {
        mainTiles + 0,
        generalTileColl + 0
    };
    

    Ansonsten mal Compiler aktualisieren, falls möglich.



  • Den Compiler kann ich leider nicht aktualisieren 😕

    const Tileset generalTileset =
    {
        mainTiles + 0,
        generalTileColl + 0
    };
    

    Hilft leider auch nicht ...

    Dann muss ich wohl eine andere Lösung finden.

    Trotzdem vielen Dank für eure Hilfen!



  • Ich kann mir das noch nicht so recht vorstellen...

    Nur damit wir mal eine gemeinsame Basis haben:
    Was sagt denn Dein Compiler zur folgenden Minimalversion?

    #include <stdio.h>
    
    typedef unsigned char UBYTE;
    
    typedef struct tileCollision
    {
      UBYTE tileID;
      UBYTE collisionType;
    }TileCollision;
    
    typedef struct tileset
    {
      UBYTE *tileArray;
      TileCollision *tileCollision;
    }Tileset;
    
    UBYTE mainTiles[] =
      { 0,1,2,3,4,5,6,7,8,9 };
    
    TileCollision generalTileColl[]=
      {
        {1,1}, {1,2}, {2,1}, {2,2},
      };
    
    Tileset generalTileset =
      {
        mainTiles,
        generalTileColl
      };
    
    int main(void){
      TileCollision *tc;
      tc=&generalTileset.tileCollision[1];
      printf("%u %u\n",tc->tileID, tc->collisionType); /* 1 2 */
      return 0;
    }
    

    Die Warnungen werden ja wieder kommen...Und die Ausgabe ist dann was?



  • Er gibt

    1 2

    aus, wie du sagtest...

    Okay, gerade was herausgefunden:
    Wenn ich das "const" wegmache, also alles im RAM ist, funktioniert es.
    Wenn ich das ganze mit "const" also in den ROM packe, geht es schief.


Anmelden zum Antworten