I'm stuck with memory allocation for a couple of hours now. Basically, I have to add a new Graphic Element to the Vector Graphic for which initialization of VectorGraphic
is necessary.
First problem is with memory allocation inside the InitVectorGraphic
method which is fixed? (I think) Now the second problem I'm stuck with is that even though memory is allocated from InitVectorGraphic
method, pElements
has no memory inside the AddGraphicElement
method. (i.e, even after initializing it in one method (InitVectorGraphic
method), changes won't reflect in other methods)
Here is my full code:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
enum{
RUNNING = 1
};
struct Point
{
int x, y;
};
struct Line
{
Point start;
Point end;
};
struct GraphicElement
{
enum{
SIZE = 256
};
unsigned int numLines;
Line* pLines;
char name[SIZE];
};
typedef struct
{
unsigned int numGraphicElements;
GraphicElement* pElements;
}VectorGraphic;
void InitVectorGraphic(VectorGraphic* image){
image = (VectorGraphic*)malloc(sizeof(VectorGraphic));
(*image).pElements = (GraphicElement*)malloc(sizeof(GraphicElement)* 256);
//Problem part 1
};
void AddGraphicElement(VectorGraphic* image){
printf("\nADDING A Graphic Element"); //Problem part 2
int index = (*image).numGraphicElements;
printf("\nPlease enter the name of the new GraphicElement(<256 characters): ");
scanf("%s", &(*image).pElements[index].name);
printf("How many lines are there in the new GraphicElement? ");
scanf("%d", &(*image).pElements[index].numLines);
(*image).pElements[index].pLines = (Line*)malloc(sizeof(Line)* (*image).pElements[index].numLines);
for (int i = 0; i < (*image).pElements[index].numLines; i++){
Line line;
printf("Please enter the x coord of the start point of line index %d: ", i);
scanf("%d", &line.start.x);
printf("Please enter the y coord of the start point of line index %d: ", i);
scanf("%d", &line.start.y);
printf("Please enter the x coord of the end point of line index %d: ", i);
scanf("%d", &line.end.x);
printf("Please enter the y coord of the end point of line index %d: ", i);
scanf("%d", &line.end.y);
(*image).pElements[index].pLines[i] = line;
}
(*image).numGraphicElements = (*image).numGraphicElements + 1;
printf("Added");
//add graphicElement to Image
};
void ReportVectorGraphic(VectorGraphic* image){
printf("\nVectorGraphic Report");
for (int i = 0; i < (*image).numGraphicElements; i++){
printf("\nReporting Graphic Element #%d", i);
printf("\nGraphic Element name: %s", (*image).pElements[i].name);
for (int j = 0; j < (*image).pElements[i].numLines; j++){
printf("\nLine #%d start x: %d", j, (*image).pElements[i].pLines[j].start.x);
printf("\nLine #%d start y: %d", j, (*image).pElements[i].pLines[j].start.y);
printf("\nLine #%d end x: %d", j, (*image).pElements[i].pLines[j].end.x);
printf("\nLine #%d end y: %d", j, (*image).pElements[i].pLines[j].end.y);
}
}
};
void CleanUpVectorGraphic(VectorGraphic* image){
free(image);
};
VectorGraphic Image;
int main()
{
char response;
InitVectorGraphic(&Image);
while (RUNNING)
{
printf("\nPlease select an option:\n");
printf("1. Add a Graphic Element\n");
printf("2. List the Graphic Elements\n");
printf("q. Quit\n"); printf("CHOICE: ");
fflush(stdin);
scanf("%c", &response);
switch (response)
{
case '1':AddGraphicElement(&Image);
break;
case '2':ReportVectorGraphic(&Image);
break;
case 'q':CleanUpVectorGraphic(&Image);
return 0;
default:printf("Please enter a valid option\n");
}
printf("\n");
}
}
What is the solution?