2016-06-20 6 views
2

Meine Strukturdeklaration:Ist eine Schleife erforderlich, um jedes Mitglied eines Arrays von Strukturen auf dem Heap zu setzen?

struct tileStruct 
{ 
    SDL_Rect * tilePixel; 
    Uint32 * tpColor; 
    int * tileNum; 
    int * xCoord; 
    int * yCoord; 
}; 

Hier ist meine Funktion, die ein Array von tileStructs initialisieren muss, aber jedes Mitglied der Struktur ist auf dem Heap.

void tileInit() 
{ 
    struct tileStruct * tileArr = (struct tileStruct *)malloc(NUM_TILES_IN_WINDOW * sizeof(struct tileStruct)); 

    tileArr->tilePixel = (SDL_Rect *) malloc(tPIXELS_PER_TILE * sizeof(SDL_Rect)); 

    tileArr->tpColor = (Uint32 *) malloc(tPIXELS_PER_TILE * sizeof(Uint32));   
    tileArr->xCoord = (int *) malloc(sizeof(int));         
    tileArr->yCoord = (int *) malloc(sizeof(int)); 
    tileArr->tileNum = (int *) malloc(sizeof(int)); 

    //rest of function 
} 

Also, meine Frage ist, muss ich das tun?

struct tileStruct * tileArr = (struct tileStruct *)malloc(NUM_TILES_IN_WINDOW * sizeof(struct tileStruct)); 

for(int i = 0; i < NUM_TILES_IN_WINDOW; i++) 
{ 
    tileArr[i].tilePixel = (SDL_Rect *) malloc(tPIXELS_PER_TILE * sizeof(SDL_Rect)); 

    tileArr[i].tpColor = (Uint32 *) malloc(tPIXELS_PER_TILE * sizeof(Uint32));   
    tileArr[i].xCoord = (int *) malloc(sizeof(int));         
    tileArr[i].yCoord = (int *) malloc(sizeof(int)); 
    tileArr[i].tileNum = (int *) malloc(sizeof(int)); 
} 
+0

Ja, Sie brauchen definitiv die Schleife für Arrays – CinCout

+1

Sie scheinen ein grundlegendes Missverständnis darüber zu haben, wann dynamischer Speicher geeignet ist. Warum definierst du deine Struktur so? Ist 'tPIXELS_PER_TILE' eine Konstante? Denken Sie daran, dass Sie gerade die dynamischen Mitglieder initialisieren, aber Sie initialisieren nicht, worauf sie hinweisen. Eine geeignetere Lösung wäre, keinen dynamischen Speicher in der Struktur zu haben, dann das gesamte Array mit einem Aufruf von "Calloc" zuzuweisen und zu initialisieren. – paddy

+0

Ich weiß, ich könnte es einfach in den Stapel legen, aber insgesamt instanziiere ich etwa 120.000 SDL_Rect-Strukturen, also dachte ich, ich würde es einfach auf den Haufen legen. Ja, tPIXELS_PER_TILE ist eine Konstante, die ich mit #define gesetzt habe. Es ist 256, und NUM_TILES_IN_WINDOW ist 475. –

Antwort

2

Ja, Sie sollten Schleife verwenden. Da Sie das Array struct tileStruct mit NUM_TILES_IN_WINDOW Elementen zugewiesen haben, müssen Sie alle Elemente durchlaufen. Und deine ehemalige tileInit() initialisiert nur das erste Element.

Und wahrscheinlich wäre es besser, Ihre Art in der nächsten Art und Weise neu zu definieren:

struct tileStruct 
{ 
    SDL_Rect tilePixel[tPIXELS_PER_TILE]; 
    Uint32 tpColor[tPIXELS_PER_TILE]; 
    int tileNum; 
    int xCoord; 
    int yCoord; 
}; 

Mit einer solchen Definition Sie eine Reihe von Hilfszuweisungen vermeiden. (Natürlich ist ein solcher Weg nur dann akzeptabel, wenn struct tileStruct die logische Eigentümerschaft an jedem seiner Elemente hat.)

+0

Danke, gelöst. –

Verwandte Themen