THIS IS CODE IN C ASSIGNMENT: ** I KNOW THIS CODE WORKS, BUT IT NEEDS TO BE MORE
ID: 3854839 • Letter: T
Question
THIS IS CODE IN C
ASSIGNMENT:
** I KNOW THIS CODE WORKS, BUT IT NEEDS TO BE MORE EFFICIENT***
1.What does the function calculate_modified do?
2.What problems/issue DO YOU SEE WITH TTHE CODE?
3. Modified it to BE MORE EFFICIENT .
4.improvements and the benefits?
#include
#include
#include
#include
#include
typedef int int32;
typedef char int8;
static void unite_arrays(int8 *output, int8 *input_1, const int8 *input_2, int32 length)
{
int32 i = 0;
for(i=0; i
{
output[i] = (int8)(input_1[i] ^ input_2[i]);
}
return;
}
static void itoa( int32 num, int8 *alpha, int32 radix )
{
if( radix == 10 )
{
sprintf(alpha, "%i", num);
}
else if( radix == 16 )
{
sprintf(alpha, "%X", num);
}
}
int8 *calculate_modified(int8 modifier, const int8 *input_1, int32 length)
{
int8 leading[3];
int32 i_leading;
int8 * temp_string = NULL;
int8 * ret;
int32 i = 0;
itoa(modifier/2, leading, 10);
//atoi converts string to integer
i_leading = atoi(leading);
temp_string = (int8 *) malloc(8);
//malloc allocates memory block returns to pointer at begginning of block
ret = (int8 *) malloc(length);
//memset fills block of memory
memset(temp_string, 0, 8);
temp_string[0] = 0;
if( (modifier+1)%2 == 0 ) {
temp_string[0] = (int8)((i_leading<<4) + 8);
}
else {
temp_string[0] = (int8)(i_leading<<4);
}
for(i=0; i<(length>>3); i++)
{
unite_arrays(ret+i*8, temp_string, input_1+i*8, 8);
}
free(temp_string);
return ret;
}
// Do not change anything in main
// main only contains example input
// Change anything else
int main(int argc, char **argv)
{
int8 data[] = {0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57};
int8 *resp = calculate_modified(0x10, data, sizeof(data));
free(resp);
return 0;
}
Explanation / Answer
Actual program given in question was not getting complied due to one loop in which condition and increment factor was not added.Please check the loop in unite_arrays method. I have added the same and please find the updated code below.
-----------------------------------------------------
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef int int32;
typedef char int8;
static void unite_arrays(int8 *output, int8 *input_1, const int8 *input_2, int32 length)
{
int32 i = 0;
for(i=0; i < length ; i++)
{
output[i] = (int8)(input_1[i] ^ input_2[i]);
printf(" Values %d ",output[i]);
}
return;
}
static void itoa( int32 num, int8 *alpha, int32 radix )
{
if( radix == 10 ){
sprintf(alpha, "%i", num);
//printf(" 10 case------ %s", alpha);
}else if( radix == 16 ){
sprintf(alpha, "%X", num);
//printf(" 16 case ----- %s", alpha);
}
}
int8 *calculate_modified(int8 modifier, const int8 *input_1, int32 length)
{
int8 leading[3];
int32 i_leading;
int8 * temp_string = NULL;
int8 * ret;
int32 i = 0;
printf("%d",modifier);
itoa(modifier/2, leading, 10);
//atoi converts string to integer
i_leading = atoi(leading);
printf("i_leading----%d ",i_leading);
temp_string = (int8 *) malloc(8);
//malloc allocates memory block returns to pointer at begginning of block
ret = (int8 *) malloc(length);
//memset fills block of memory
memset(temp_string, 0, 8);
temp_string[0] = 0;
if( (modifier+1)%2 == 0 ) {
temp_string[0] = (int8)((i_leading<<4) + 8);
}else {
temp_string[0] = (int8)(i_leading<<4);
}
for(i=0; i<(length>>3); i++){
printf(" loop run %d ",i);
unite_arrays(ret+i*8, temp_string, input_1+i*8, 8);
}
free(temp_string);
return ret;
}
// Do not change anything in main
// main only contains example input
// Change anything else
int main(int argc, char **argv)
{
int8 data[] = {0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57};
int temp = (int)0X10;
printf("%d",temp);
printf("%d",sizeof(data)>>3);
int8 *resp = calculate_modified(0x10, data, sizeof(data));
free(resp);
return 0;
}
--------------------------------- End ----------------------------------------------
Before understanding the above given program we need to understand the below c programming terminology which is being used in our program.
1. (int)0X10 - this statement is written to make use of Hexadecimal number instead of decimal in program.
The above statement converts 10 decimal number to hexadecimal number which is equivalent to 16 ( hexadecinal equl value).
so in our program integer 16 ( hex converted value) will be using.
2. int8 data[] = {0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57};
We have 24 length array which holds 24 integer value using concept given in point 1.
3. const int8 *input_1 = it is pointer type varaible which is holding starting address of array and the same is being passed in calculate_modified method.
4. atoi - c statndard fuction used for converting string to integer value. becacuse we are using sprintf fuction
which fruther responsible for storing string buffer.
5. (int8 *) malloc(8) - malloc fuction is used for providing memory space of byte size ( in our case 8 would be the value).
(int8 *) here means conversion of memory space type to int8 explicitly by complier. by default it is void* type ( any type)
6. free - c standard fuction which free the memory space which got occupied by malloc function.
7. length>>3 - >> is right shift operator in c which converts the binary number. let us see the example
suppose i have int value 24 ( actual array size in our case). we binary number equilent to 24 is 00011000. now if we shift 3 binary digit from right then we would have 00000011 ( equilent to 3 ) .
so we can say 24>>3 would be 3 integer value.
Now our program is doing nothing but stroing values in int8 data types which says it is unsigned 8-bit integer type data which meaning to say it accepts the values of 0-255 without overflowing.Now we have array ( data[] ) of 24 length and
we passing this array to method calculate_modified. in calculate_modified pointer type valraible is used to hold the starting address so that we fruther using loop iterate it. input_1+i*8 statement is used for the same
beacuse once we got the satreing address then we can move to another integer value in array by adding 8 byte and so on.
Please run the following above given program and take a look on above given terms then you will find the excatly below given output.
i have added printf( debug statement ) so that you can see each varaible value at each place.
Output
--------------
Conversion example --- 16
Right shift bitwise operator --- 3
16i_leading----8
loop run 0
Values -64
Values 65
Values 66
Values 67
Values 68
Values 69
Values 70
Values 71
loop run 1
Values -56
Values 73
Values 74
Values 75
Values 76
Values 77
Values 78
Values 79
loop run 2
Values -48
Values 81
Values 82
Values 83
Values 84
Values 85
Values 86
Values 87
Please let me know you still face any problem to make understanding on above given program.