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.
Related Questions
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.