Reputation: 45
Hi I am trying to create a structure inside a structure, the first structure will contain details for a number of students, the second structure will contain details of a number of modules from each student. Each time asking the user to input details for each student. I was able to create an instance of student structure called data and each time loop through each instance of data and scan in information for each student once only that worked for me. I am now trying to create another inside loop that will scan in a number of different modules that will assign these to each student. I am having problems with the second loop and would appreciate some guidance.
struct module{
char moduleid[5];
int credit;
float grade;
};
//create structure student at includes a datatype
//module
struct student{
char id[10];
char fname[15];
char lname[15];
struct module results;
};
int main()
{
int i;
int j;
int numStuds;
int numMods = 10;
printf("Enter number of students\n");
scanf("%d",&numStuds);
struct student data[numStuds]; //create an instance of structure student called data
struct data.results mods[numMods];
//input data
for (i=0; i<numStuds; i++){
printf("PLEASE ENTER STUDENT DATA :\n\nID, FNAME AND LNAME\n");
scanf("%s%s%s",data[i].id,data[i].fname,data[i].lname);
for (j=0; j<numMods; j++){
printf("\nENTER MODULE DATA: \nMODULEID, CREDIT, GRADE :\n");
scanf("%s%d%f",data[i].results.mods[j].moduleid,&data[i].result.smods[j].credit,&data[i].results.mods[j].grade);
}
}
Upvotes: 3
Views: 1831
Reputation: 406
Okay. I will just show you creation and deletion macros, you can do expansion, inserting, and deleting with realloc
and memmove
; it would take me too long to write them all out.
#include <stdint.h>
#define ARRAY_DECL(name, type) struct { uint32_t count; type *array } name;
#define ARRAY_DESTROY(name) free(name.array);
These macros create what is called an anonymous structure
; this means that it is a one-of-a-kind struct
, in this case called name
. ARRAY_DESTROY
then frees the array inside the struct.
Upvotes: 1
Reputation: 406
Like acostela said, you might want a pointer to a dynamic array. However, I do not see why each student needs multiple results. So when you have the number of students entered, you would just know that each student had one module, referred to as data.result
or data->result
if you used malloc
. If you really need dynamic arrays, I can show you some macros to do this easily.
Upvotes: 1
Reputation: 2727
I think that your main problem is that in the way you have declared "results" inside your student struct you can only have one result for each student. Try to use an static array (if you know how many results you have) or a dynamic one if you want to declare its size during runtime.
e.g
struct student{
char id[10];
char fname[15];
char lname[15];
struct module *results; //Pointer to declare a dynamic array
};
For static declaration
struct student{
char id[10];
char fname[15];
char lname[15];
struct module results[size]; //Pointer to declare a dynamic array
};
If you use the pointer solution remember to access that attribute using "->" operator
Upvotes: 3