# Thread: Help with MultiDimensional Array (I think)

1. ## Help with MultiDimensional Array (I think)

I am working on a Binary Heap implementation of a Priority Queue. So far, I have the queue working for a single element. Here is some of the code:
Code:
```[...headers and constants...]

struct HeapStruct {
int Capacity;
int Size;
ElementType *Elements;
};

PriorityQueue Initialize(int MaxElements) {
PriorityQueue H;

if (MaxElements < MinPQSize)
printf("Priority queue size is too small.\n");

H = malloc(sizeof ( struct HeapStruct));
if (H == NULL)    printf("Out of space!\n");

/* Allocate the array plus one extra for sentinel */
H->Elements = malloc((MaxElements + 1) * sizeof ( ElementType));
if (H->Elements == NULL)
printf("Out of space!\n");

H->Capacity = MaxElements;
H->Size = 0;
H->Elements[ 0 ] = MinData;

return H;
}

void Insert(ElementType X, PriorityQueue H) {
int i;

if (IsFull(H)) {
printf("Priority queue is full.\n");
return;
}
for (i = ++H->Size; H->Elements[ i / 2 ] > X; i /= 2)
H->Elements[ i ] = H->Elements[ i / 2 ];
H->Elements[ i ] = X;
}

ElementType FindMin(PriorityQueue H) {
if (!IsEmpty(H))
return H->Elements[ 1 ];
printf("Priority Queue is Empty.\n");
return H->Elements[ 0 ];
}

[...the rest of the priority queue methods...]```
Now, I'm working on a discrete event simulation and I want my queue to store events with the following data:
Code:
```int id; //To store a process id.
int event_type; //Could be 1 or 0.
double event_time; //Stores the time an event occurs.
double run_time; //Stores the run time of an event.```
The priorities would be based on the event_time variable, so I would always dequeue the event with the smallest time.

So, that's where I'm stuck. How should I go about modifying my original priority queue implementation to work with the above-mentioned variables and so that it prioritizes based on event_time?

I feel like it's something very simple to do, but I just don't have enough experience in C to do so. I don't know if I can create an array of objects or something like what I could do in Java or Python. I hope I was clear enough.

Help is much appreciated.

PS: BTW, I know that ANSI-C is not object oriented at all. I was just saying that if it were Java, I would simply create an array of objects, but I don't know how to proceed here.

2. In C, objects are usually replaced with structs. So an array of your structs might be what you want.

In C, objects are usually replaced with structs. So an array of your structs might be what you want.
Can you provide me with some sample code or a link where I can read on how to implement an array of a struct?

4. Sure, standby - horribly basic, but you get the idea. You define a struct with global scope, (generally a good practice), and then create the array of it, in the main function and send it around to where you want, from there. Of course, any function can then create an instance of that same struct, as needed.

Code:
```//basics of using array of structs w/o dynamic memory allocation/pointers

#include <stdio.h>
#include <math.h>

#define studNum 4

struct student {
char name[25];
float mark1;
float mark2;
float gpa;
int c1;
int c2;
int no_stud;
};

float compute(struct student*, int i );
void input_data(struct student*, int num_stud);
void printIt(struct student*);

static void force_fpf()  //just forces floating point linkage
{
float x, *y; /* Just declares two variables */
y = &x;      /* Forces linkage of FP formats */
x = *y;      /* Suppress warning message about x */
}

int main(void) {
int i, num_stud;
struct student stud[studNum];

for(i = 1; i < studNum; ++i)
stud[i].no_stud = i; //stud[0] isn't used

for(i = 1; i < studNum; ++i) {
input_data(stud, i);
}

for(i = 1; i < studNum; ++i)
stud[i].gpa = compute(stud, i);

printIt(stud);

while((i = getchar()) != '\n');    //holds the text window openi
i = getchar();
return 0;
}
void input_data(struct student *stud, int num)  {
printf("\n Enter students name [24 letters]: ");
scanf("%s", stud[num].name) ; //strings need no addresses
printf("\n Enter students first mark [0-100]: ");
scanf("%f", &stud[num].mark1);
printf("\n Enter students second mark [0-100]: ");
scanf("%f", &stud[num].mark2);
printf("\n Enter students first course score [0-100]: ");
scanf("%d", &stud[num].c1);
printf("\n Enter students second course score [0-100]: ");
scanf("%d", &stud[num].c2);
printf("\n Enter students ID number [1-32000]: ");
scanf("%d", &stud[num].no_stud);

}
float compute(struct student* stud, int i) {
return ((stud[i].mark1 + stud[i].mark2 + stud[i].c1 + stud[i].c2)/4.00);
}
void printIt(struct student* stud) {
int i;
for(i = 1; i < studNum; ++i) {
printf("\n Name: %s  mark1: %.2f  mark2: %.2f", stud[i].name, stud[i].mark1, stud[i].mark2);
printf("\n GPA: %.2f  C1: %d  C2: %d Student No: %d", stud[i].gpa, stud[i].c1, stud[i].c2, stud[i].no_stud);
}
}```

5. Code:
```struct structname
{
...members...
};

struct structname astruct;
struct structname anarrayofstructs[ SIZE ];
struct structname *aptrtostruct = & astruct;
...

astruct.foo = x;
anarrayofstructs[ y ].foo = z;
aptrtostruct->foo = x;```

Quzah.

6. @Adak: Thanks. Your example showed me how to get it working.

Should I post the working code? It's not very elegant, but I wonder if that would be the polite thing to do.