Answer T30
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int x, y;
} Point;
void printPoint( Point *p )
{
printf("(%d, %d) ", p->x, p->y );
}
Point *newPoint()
{
Point *p = (Point *)malloc( sizeof( Point ) );
p->x=0;
p->y=0;
return p;
}
void setPoint( Point *p, int x, int y )
{
p->x = x; p->y = y;
}
typedef struct
{
int red, green, blue;
} Color;
Color *newColor()
{
Color *c = (Color *)malloc( sizeof( Color ) );
c->red=0;
c->green=0;
c->blue=0;
return c;
}
/* function to set a Color */
void setColor( Color *c, int r, int g, int b )
{
if ( r<0 || r>255 ) r = 0;
if ( g<0 || g>255 ) g = 0;
if ( b<0 || b>255 ) b = 0;
c->red = r;
c->green = g;
c->blue = b;
}
void printColor( Color *c )
{
printf("%3d red, %3d grn, %3d blu", c->red, c->green, c->blue );
}
typedef struct
{
Point *p0, *p1, *p2;
Color *color;
} TriangleMod;
void printTriangleMod( TriangleMod *t )
{
printf("Points: ");
printPoint( t->p0 ); printPoint( t->p1 ); printPoint( t->p2 );
printf(" Color: ");
printColor( t->color );
printf("\n");
}
TriangleMod *newTriangleMod()
{
TriangleMod *tm;
tm = (TriangleMod *)malloc( sizeof( TriangleMod ) );
tm->p0 = newPoint();
tm->p1 = newPoint();
tm->p2 = newPoint();
tm->color = newColor();
return tm;
}
void freeTriangleMod( TriangleMod *t )
{
free( t->color);
free( t->p0);
free( t->p1);
free( t->p2);
free( t );
}
void setTriangleModPoint( TriangleMod *tri, int num, int x, int y)
{
if ( num==0 ) setPoint( tri->p0, x, y );
if ( num==1 ) setPoint( tri->p1, x, y );
if ( num==2 ) setPoint( tri->p2, x, y );
}
void setTriangleModColor( TriangleMod *tri, int r, int g, int b)
{
setColor( tri->color, r, g, b );
}
typedef struct
{
int length;
TriangleMod **array;
} TriCollection;
TriCollection *newTriCollection( int len )
{
int j;
TriCollection *coll = (TriCollection *)malloc( sizeof(TriCollection) );
coll->length = len;
coll->array = (TriangleMod**)malloc( len*sizeof( TriangleMod* ) );
for ( j=0; j<len; j++ )
coll->array[j] = NULL;
return coll;
}
void freeTriCollection( TriCollection *col )
{
int j;
for ( j=0; j<col->length; j++ )
if ( col->array[j] ) freeTriangleMod( col->array[j] );
free( col->array );
free( col );
}
int main()
{
const int length = 8;
int j;
TriCollection *triarray = newTriCollection( 8 );
/* Create several array elements here */
triarray->array[0] = newTriangleMod();
setTriangleModPoint( triarray->array[0], 0, 245, 148 );
setTriangleModPoint( triarray->array[0], 1, -97, 32 );
setTriangleModPoint( triarray->array[0], 2, 12, -34 );
setTriangleModColor( triarray->array[0], 200, 160, 100);
triarray->array[3] = newTriangleMod();
setTriangleModPoint( triarray->array[3], 0, 0, 0 );
setTriangleModPoint( triarray->array[3], 1, 100, 0 );
setTriangleModPoint( triarray->array[3], 2, 100, 100 );
setTriangleModColor( triarray->array[3], 0, 150, 150);
triarray->array[5] = newTriangleMod();
setTriangleModPoint( triarray->array[5], 0, 99, 65 );
setTriangleModPoint( triarray->array[5], 1, 123, 300 );
setTriangleModPoint( triarray->array[5], 2, 134, -12 );
setTriangleModColor( triarray->array[5], 100, 250, 200 );
/* Print out the array here. Print "null" for empty cells. */
for ( j=0; j<length; j++ )
{
printf("%d: ", j );
if ( !triarray->array[j] )
printf("null\n");
else
printTriangleMod( triarray->array[j] );
}
/* Deallocate memory */
freeTriCollection( triarray );
}