如果您想使用函数来实现此操作,并且想要传递一个arrayType变量来确定如何访问数组(而不是使用typeof),那么可以尝试以下代码:
#include <stdio.h>
#include <stdint.h>
enum type_v {
UINT8,
UINT16,
UINT32,
UINT64,
FLOAT,
DOUBLE
};
union type_t {
uint8_t* uint8Array;
uint16_t* uint16Array;
uint32_t* uint32Array;
uint64_t* uint64Array;
float* floatArray;
double* doubleArray;
};
double sum(void* voidArray, size_t arrayLength, int arrayType)
{
union type_t arrays;
switch(arrayType) {
case UINT8: arrays.uint8Array = voidArray; break;
case UINT16: arrays.uint16Array = voidArray; break;
case UINT32: arrays.uint32Array = voidArray; break;
case UINT64: arrays.uint64Array = voidArray; break;
case FLOAT: arrays.floatArray = voidArray; break;
case DOUBLE: arrays.doubleArray = voidArray; break;
}
int i;
double result = 0;
for(i = 0; i < arrayLength; i++){
switch(arrayType) {
case UINT8: result += arrays.uint8Array [i]; break;
case UINT16: result += arrays.uint16Array[i]; break;
case UINT32: result += arrays.uint32Array[i]; break;
case UINT64: result += arrays.uint64Array[i]; break;
case FLOAT: result += arrays.floatArray [i]; break;
case DOUBLE: result += arrays.doubleArray[i]; break;
}
}
return result;
}
int main()
{
uint16_t array[] = {1,2,3,4};
double result = sum(array, 4, UINT16);
printf("Sum = %f\n", result);
return 0;
}
在这里尝试:https://onlinegdb.com/1rjNYJGzg
请注意,虽然它是可扩展的到新类型,但它并不是真正的通用,因此您可以轻松地将其扩展到对数组中的结构体的单个成员求和。例如:
#include <stdio.h>
#include <stdint.h>
struct player {
char name[32];
int score;
};
enum type_v {
UINT8,
UINT16,
UINT32,
UINT64,
FLOAT,
DOUBLE,
PLAYER
};
union type_t {
uint8_t* uint8Array;
uint16_t* uint16Array;
uint32_t* uint32Array;
uint64_t* uint64Array;
float* floatArray;
double* doubleArray;
struct player* playerArray;
};
double sum(void* voidArray, size_t arrayLength, int arrayType)
{
union type_t arrays;
switch(arrayType) {
case UINT8: arrays.uint8Array = voidArray; break;
case UINT16: arrays.uint16Array = voidArray; break;
case UINT32: arrays.uint32Array = voidArray; break;
case UINT64: arrays.uint64Array = voidArray; break;
case FLOAT: arrays.floatArray = voidArray; break;
case DOUBLE: arrays.doubleArray = voidArray; break;
case PLAYER: arrays.playerArray = voidArray; break;
}
int i;
double result = 0;
for(i = 0; i < arrayLength; i++){
switch(arrayType) {
case UINT8: result += arrays.uint8Array [i]; break;
case UINT16: result += arrays.uint16Array[i]; break;
case UINT32: result += arrays.uint32Array[i]; break;
case UINT64: result += arrays.uint64Array[i]; break;
case FLOAT: result += arrays.floatArray [i]; break;
case DOUBLE: result += arrays.doubleArray[i]; break;
case PLAYER: result += arrays.playerArray[i].score; break;
}
}
return result;
}
int main()
{
struct player array[] = {{"Bob",1},{"MEl",2},{"Jim",3},{"Ann",4}};
double result = sum(array, 4, PLAYER);
printf("Sum = %f\n", result);
return 0;
}
在这里尝试:https://onlinegdb.com/YfdFwKj0I
+
运算符。 - Eugene Sh.