Answers/Solutions to Exercises in Chapter 9, Exercise 3

E3: Write a program that compacts a structure that has an int array, a float, a double, and a  char, relativizes the segment where the structure iscompacted. Write access functions that can access (store or retrieve) the relativized compacted form of the structure.

S3: A sample solution program is below.

struct MYSTRUCT_STRUCT {
	int array[7];
	float f;
	char c;
	double d;
};
typedef struct MYSTRUCT_STRUCT MYSTRUCT;

float get_float(void* a)
{
	float v;
	char* to = (char*) &v;
	char* from = (char*) a;
	for(int i=0; i<sizeof(float); i++)
		*to++=*from++;
	return v;
}

void set_float(float f,void* a)
{
	float v=f;
	char* to = (char*) a;
	char* from = (char*) &v;
	for(int i=0; i<sizeof(float); i++)
		*to++=*from++;
}

double get_double(void* a)
{
	double v;
	char* to = (char*) &v;
	char* from = (char*) a;
	for(int i=0; i<sizeof(double); i++)
		*to++=*from++;
	return v;
}

void set_double(double f,void* a)
{
	double v=f;
	char* to = (char*) a;
	char* from = (char*) &v;
	for(int i=0; i<sizeof(double); i++)
		*to++=*from++;
}

int get_int(void* a)
{
	int v;
	char* to = (char*) &v;
	char* from = (char*) a;
	for(int i=0; i<sizeof(int); i++)
		*to++=*from++;
	return v;
}

void set_int(int f,void* a)
{
	int v=f;
	char* to = (char*) a;
	char* from = (char*) &v;
	for(int i=0; i<sizeof(int); i++)
		*to++=*from++;
}

int GetArray(int i,void* segment)
{
	char* p=(char*) segment;
	p += i*sizeof(int);
	return get_int(p);
}

void SetArray(int value,int i,void* segment)
{
	char* p=(char*) segment;
	p += i*sizeof(int);
	set_int(value,p);
}

float Get_f(void* segment)
{
	char* p=(char*) segment;
	p += (7*sizeof(int));
	return get_float(p);
}

void Set_f(float value,void* segment)
{
	char* p=(char*) segment;
	p += (7*sizeof(int));
	set_float(value,p);
}

char Get_c(void* segment)
{
	char* p=(char*) segment;
	p += (7*sizeof(int)+sizeof(float));
	return *p;
}

void Set_c(char value,void* segment)
{
	char* p=(char*) segment;
	p += (7*sizeof(int)+sizeof(float));
	*p=value;
}

double Get_d(void* segment)
{
	char* p=(char*) segment;
	p += (7*sizeof(int)+sizeof(float)+1);
	return get_double(p);
}

void Set_d(double value,void* segment)
{
	char* p=(char*) segment;
	p += (7*sizeof(int)+sizeof(float)+1);
	set_double(value,p);
}

int main()
{
	MYSTRUCT my;
	for(int i=0; i<7; i++)
		my.array[i]=10*i;
	my.f=(float) 2.35;
	my.c='A';
	my.d= 3.21;

	void* segment = (void*) malloc(7*sizeof(int)+sizeof(float)+1+sizeof(double));
	for(i=0; i<7; i++)
		SetArray(my.array[i],i,segment);
	Set_f(my.f,segment);
	Set_c(my.c,segment);
	Set_d(my.d,segment);

	for(i=0; i<7; i++)
		printf("array[%d]=%d\n",i,GetArray(i,segment));
	printf("f=%f\n",Get_f(segment));
	printf("c=%c\n",Get_c(segment));
	printf("d=%f\n",Get_d(segment));

	return 0;
}

Back to Answers/Solutions Index                          Back to Answers/Solutions for Chapter 9 Index