我是C语言的新手,我正在尝试编写一个名为“ print_array”的函数,该函数可以打印出int,float和double类型的任何数组。我正在尝试通过函数重载来实现这一点(我在书中对此进行了阅读)。所以我想出了以下代码:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <math.h>
#define len(x) (sizeof(x) / sizeof((x)[0]))
#define print_array(array, length_array)_Generic((array), double: print_double, float: print_float, default: print_int)(array, length_array)
void print_int(int *array, size_t length_array) {
printf("{");
for (int i = 0; i < length_array-1; i = i+1) {
printf("%d, ", array[i]); }
printf("%d} \n", array[length_array-1]); }
void print_float(float *array, size_t length_array){
printf("{");
for (int i = 0; i < length_array-1; i = i+1) {
printf("%f, ", array[i]); }
printf("%f} \n", array[length_array-1]); }
void print_double(double *array, size_t length_array) {
printf("{");
for (int i = 0; i < length_array-1; i = i+1) {
printf("%f, ", array[i]); }
printf("%f} \n", array[length_array-1]); }
int main()
{
int A[3] = {1,2,3};
double B[4] = {1.2, 3, 4.5, 6.8};
float C[4] = {1.2, 3, 4.5, 6.8};
print_int(A, len(A));
print_double(B, len(B));
print_float(C, len(C));
printf("____________________________________________________ \n");
print_array(A, len(A));
print_array(B, len(B));
print_array(C, len(C));
return 0;
}
请注意,我定义了一个名为“ len”的宏来快速获取数组的长度。 函数“ print_int”,“ print_float”和“ print_double”是对应数组类型的简单打印函数。
我在主函数中测试了这些函数,它们按预期运行。但是我的函数“ print_array”为float和double类型打印了一些奇怪的值,但是对int类型有效。 这是我的输出:
{1, 2, 3}
{1.200000, 3.000000, 4.500000, 6.800000}
{1.200000, 3.000000, 4.500000, 6.800000}
____________________________________________________
{1, 2, 3}
{858993459, 1072902963, 0, 1074266112}
{1067030938, 1077936128, 1083179008, 1088002458}
Process returned 0 (0x0) execution time : 0.031 s
Press any key to continue.
你能告诉我我在做什么错吗?
答案 0 :(得分:3)
您正在使用 default
通用关联来编译每种情况,如果您将int
大小写分开放置,会发现它从未被选中。
问题在于您是根据数组类型而不是元素类型进行选择。尝试
_Generic((*array), ...)
实际上使用 array元素作为控制表达式。
使用此一字符修复程序,输出为
{1, 2, 3}
{1.200000, 3.000000, 4.500000, 6.800000}
{1.200000, 3.000000, 4.500000, 6.800000}
____________________________________________________
{1, 2, 3}
{1.200000, 3.000000, 4.500000, 6.800000}
{1.200000, 3.000000, 4.500000, 6.800000}
实际上,您应该会收到很多警告,例如:
warning: passing argument 1 of ‘print_int’ from incompatible pointer type [-Wincompatible-pointer-types]
print_array(B, len(B));
note: in definition of macro ‘print_array’
#define print_array(array, length_array)_Generic((array), double: print_double, float: print_float, default: print_int)(array, length_array)
^~~~~
111111.c:10:6: note: expected ‘int *’ but argument is of type ‘double *’
void print_int(int *array, size_t length_array) {
^~~~~~~~~