You can't sum the array values if you don't know what type they are. Relying on the bytes
parameter alone is not enough, since int
and float
are commonly the same size in many compilers, but they are very different types. You lose type information when operating with void*
.
If you must use void*
, the only way to solve this is to pass in a parameter that specifies what type the array actually holds, and then cast the void*
accordingly.
I suggest writing a separate function for each type, eg:
enum dataType {dtInt, dtFloat, dtDouble};
double averageInt(int *arr, int length)
{
double sum = 0;
for (int i = 0; i < length; ++i)
sum += arr[i];
return sum / length;
}
double averageFloat(float *arr, int length)
{
double sum = 0;
for (int i = 0; i < length; ++i)
sum += arr[i];
return sum / length;
}
double averageDouble(double *arr, int length)
{
double sum = 0;
for (int i = 0; i < length; ++i)
sum += arr[i];
return sum / length;
}
double average(void *arr, int length, enum dataType arrType)
{
switch (arrType)
{
case dtInt: return averageInt((int*)arr, length);
case dtFloat: return averageFloat((float*)arr, length);
case dtDouble: return averageDouble((double*)arr, length);
}
return 0;
}
Alternatively:
enum dataType {dtInt, dtFloat, dtDouble};
double sumInt(int *arr, int length)
{
double sum = 0;
for (int i = 0; i < length; ++i)
sum += arr[i];
return sum;
}
double sumFloat(float *arr, int length)
{
double sum = 0;
for (int i = 0; i < length; ++i)
sum += arr[i];
return sum;
}
double sumDouble(double *arr, int length)
{
double sum = 0;
for (int i = 0; i < length; ++i)
sum += arr[i];
return sum;
}
double average(void *arr, int length, enum dataType arrType)
{
double sum;
switch (arrType)
{
case dtInt: sum = sumInt((int*)arr, length); break;
case dtFloat: sum = sumFloat((float*)arr, length); break;
case dtDouble: sum = sumDouble((double*)arr, length); break;
default: sum = 0; break;
}
return sum / length;
}