C: 2D arrays with structs and pointers

Click For Summary

Discussion Overview

The discussion revolves around implementing a 2D array in C that utilizes structs and pointers to represent a player character on a map. Participants explore how to properly access and manipulate these structures within the context of a game-like environment.

Discussion Character

  • Technical explanation
  • Exploratory
  • Debate/contested

Main Points Raised

  • One participant proposes using a 2D array filled with NULL pointers to represent player positions instead of using separate x and y variables.
  • Another participant suggests using the "->" operator to access members of a pointer to a struct.
  • A participant questions how to access struct members when transitioning from an int array to a pointer.
  • One participant points out that the charLoc array is incorrectly allocated as an array of pointers to int instead of pointers to structs.
  • A suggestion is made to change the allocation of charLoc to correctly allocate memory for pointers to CharPointers structs.
  • Another participant advises dropping type casts from malloc and correcting the way to reference struct members.
  • A later reply confirms that the suggested changes resolved the initial issues.

Areas of Agreement / Disagreement

Participants generally agree on the need to correctly allocate and access struct pointers, but there are varying opinions on the best approach to achieve this, indicating some unresolved nuances in the implementation details.

Contextual Notes

There are limitations regarding the initial allocation of the charLoc array and the correct syntax for accessing struct members, which remain partially unresolved in terms of broader implications for struct usage in C.

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

  • · Replies 3 ·
Replies
3
Views
2K
  • · Replies 17 ·
Replies
17
Views
3K
  • · Replies 3 ·
Replies
3
Views
2K
  • · Replies 8 ·
Replies
8
Views
5K
  • · Replies 23 ·
Replies
23
Views
2K
  • · Replies 17 ·
Replies
17
Views
3K
  • · Replies 22 ·
Replies
22
Views
3K
Replies
1
Views
2K
  • · Replies 1 ·
Replies
1
Views
11K
  • · Replies 4 ·
Replies
4
Views
2K