用C

时间:2018-10-28 17:02:31

标签: c printing

我是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.

你能告诉我我在做什么错吗?

1 个答案:

答案 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) {
      ^~~~~~~~~