C: 2D arrays with structs and pointers

AI Thread Summary
The discussion revolves around optimizing player representation in a 2D map by using a 2D array filled with NULL pointers instead of separate x and y variables. The user is implementing a player struct and a general struct for character pointers, aiming to manage character locations effectively. The main question concerns accessing and modifying the struct members within the array. Key points include the need to correctly allocate memory for the `charLoc` array and the proper syntax for accessing struct members. It is clarified that instead of using `charLoc[i][j].CharPointers.pPointer`, the correct approach is to directly reference the pointer as `charLoc[i][j].pPointer`. Additionally, suggestions are made to simplify memory allocation by removing unnecessary type casts and ensuring the correct data types are used for pointers. The user successfully implements these changes and confirms that the solution works.
Peter P.
Messages
23
Reaction score
0
I wanted to make a variant on having a player just walking around a small 2d map. Instead of having 2 variables to store the current x and y values of the player position in a certain array, I want to make a 2d array that is filled with NULL pointers. Then the player would be represented as a struct and instead of changing the x and y variables around, I would change the pointers around. I just want to know how you access something like this. Here is my current code:

Code:
#include <curses.h>
#include <stdlib.h>

#define NUM_ROWS 20
#define NUM_COLS 20

#define WALL 0
#define FLOOR 1
#define PASS 1
#define NOT_PASS 0

typedef struct playerChar {
    int HP;
} PlayerChar;

//General struct with pointers to every type of 'creature' that can be shown on map
typedef struct charPointers {
    PlayerChar * pPointer;
} CharPointers;

int main (void) {
    initscr();
    noecho();
    curs_set(0);
    resize_term (NUM_ROWS, NUM_COLS);

    int i, j;
    int ** mapArray = (int **) malloc (NUM_ROWS * sizeof (int *));
    int ** passableArray = (int **) malloc (NUM_ROWS * sizeof (int *));
    int ** charLoc = (int **) malloc (NUM_ROWS * sizeof (int *));


    for (i = 0; i < NUM_ROWS; i++) {
        mapArray [i] = (int *) malloc (NUM_COLS * sizeof (int));
        passableArray [i] = (int *) malloc (NUM_COLS * sizeof (int));
        charLoc [i] = (int *) malloc (NUM_COLS * sizeof (CharPointers));
        for (j = 0; j < NUM_COLS; j++) {
            if (i == 0) {
                mapArray [i][j] = WALL;
                passableArray [i][j] = NOT_PASS;
            }
            else if (i == (NUM_ROWS - 1)) {
                mapArray [i][j] = WALL;
                passableArray [i][j] = NOT_PASS;
            }
            else if (j == 0) {
                mapArray [i][j] = WALL;
                passableArray [i][j] = NOT_PASS;
            }
            else if (j == (NUM_COLS - 1)) {
                mapArray [i][j] = WALL;
                passableArray [i][j] = NOT_PASS;
            }
            else {
                mapArray [i][j] = FLOOR;
                passableArray [i][j] = PASS;
            }
            charLoc[i][j].CharPointers.pPointer = NULL;
        }
    }
The second struct I have there currently is just to use to hold all of the possible "monster" pointers. Doesn't really do much right now, but that's its intended purpose in the future.

My question deals with the line: "charLoc[j].CharPointers.pPointer = NULL;". I don't know how I would access something like the struct from a certain position in the array, and then from the struct to the other structs.

Thanks in advance.
 
Technology news on Phys.org
When referencing a member of a pointer to a struct use the -> operator.
 
But how would i use that in this context? I know that i can do that for when I'm going from pointers to structs, but what would I do for the from an int array to a pointer part?
 
Well for one thing charLoc is an array of pointers to INT and you allocate it with structs make them arrays of pointers to structs
 
So, if I get what you are saying, would I change this:
Code:
charLoc [i] = (int *) malloc (NUM_COLS * sizeof (CharPointers));
to this:
Code:
charLoc [i] = (int *) malloc (NUM_COLS * sizeof (CharPointers *));

and if the above is correct, do you know what I would need to change to make this:
Code:
charLoc[i][j].CharPointers.pPointer = NULL;
work?
 
Drop the type casts from malloc, you don't need it, and more like this
Code:
CharPointers ** charLoc =malloc (NUM_ROWS * sizeof (CharPointers*));

Code:
charLoc [i] = malloc (NUM_COLS * sizeof (CharPointers));

Now when you are trying to reference it you are trying to reference a data type instead of the variable name itself example

Code:
charLoc[i][j].CharPointers.pPointer = NULL;

CharPointers is a struct what you want is the variable so drop the Charpointers part and call it like this

Code:
charLoc[i][j].pPointer = NULL;
 
Last edited:
Yes, it's working. Thanks for the help.
 

Similar threads

Back
Top