I've been experimenting with different types of "queues" of fixed size which I have shown in a previous thread. Now however, I want to design a proper queue of unspecified length that allocates and deallocates memory as members are pushed into the queue at the end or popped out of the queue at the start of it.
So inside each member of the pixelQueue I put a struct named Pixel that contains the all the data I need for that member and a pointer that is pointing to the next member of the queue.
The code that handles this part of the program looks like so:
Code:
...
bool **queuedArray;
int nRows, nCols;
char *inputRow;
typedef struct Pixel {
int x;
int y;
} Pixel;
...
typedef struct pixelQueue {
Pixel element;
struct pixelQueue *nextMember;
} pixelQueue;
int queueLength;
pixelQueue *firstMember = NULL, *lastMember = NULL;
int queueLength;
void pushQueue(Pixel element);
Pixel popQueue();
...
int main(int argc, const char * argv[]) {
if(scanf("%d%d", &nRows, &nCols) == 2) {
allocateMemory();
...
...
free(queuedArray[0]);
...
free(queuedArray);
return 0;
}
void allocateMemory() {
int NROWS = nRows + 2, NCOLS = nCols + 2;
...
queuedArray = malloc(NROWS * sizeof *queuedArray);
queuedArray[0] = calloc(NROWS * NCOLS, sizeof **queuedArray);
for(int i = 1; i < NROWS; ++i) {
...
queuedArray[i] = queuedArray[i - 1] + NCOLS;
}
}
...
...
...
void pushQueue(element) {
if(queuedArray[element.x][element.y])
return;
if(firstMember == NULL) {
firstMember = malloc(sizeof *firstMember);
lastMember = firstMember;
queueLength = 0;
} else {
lastMember->nextMember = malloc(sizeof *firstMember);
lastMember = lastMember->nextMember;
}
lastMember->element.x = element.x;
lastMember->element.y = element.y;
lastMember->nextMember = NULL;
++queueLength;
}
Pixel popQueue() {
Pixel element;
if(firstMember == NULL) {
printf("Empty queue, popQueue() abuse!\n");
element.x = -1;
element.y = -1;
return element;
}
element.x = *firstMember.element.x;
element.y = *firstMember.element.y;
if(firstMember == lastMember) {
free(firstMember);
firstMember = NULL;
queueLength = 0;
} else {
pixelQueue *interimCell;
interimCell = firstMember.nextMember;
free(firstMember);
firstMember = interimCell;
--queueLength;
}
return element;
}
...
The problem however is that I get the errors
Code:
traceCoastLine2c.c(...) : error C2224: left of '.x' must have struct/union type
traceCoastLine2c.c(...) : error C2224: left of '.y' must have struct/union type
at line 72,82 and 83. What's even stranger is that in the previous version of the program before I attempted implementing a dynamic queue the compiler never complained about line 72.
So what is wrong and what is the correct way of managing this?