gpt4 book ai didi

c - 我想在 C 中为二维数组创建一个通用选择器

转载 作者:行者123 更新时间:2023-12-04 16:36:54 25 4
gpt4 key购买 nike

如果 2d 数组是 float 类型,我想调用第一个函数,否则调用第二个函数,我该如何实现?

 void printff(int n,float m[n][n])
{
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
printf("\t%f",m[i][j]);
printf("\n");
}
}

void printfi(int n,int m[n][n])
{
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
printf("\t%d",m[i][j]);
printf("\n");
}
}

#define print(a,b) _Generic(b,int*[sizeof(a)]:printfi,float*[sizeof(a)]:printff)(a,b)

最佳答案

宏应该是:

#define print(a,b) _Generic((b), int(*)[]: printfi, float(*)[]: printff)((a), (b))

b 的类型是 int(*)[a]float(*)[a],例如指向 a intfloat 数组的指针。

这段代码对我有用:

#include <stdio.h>

void printff(int n,float m[n][n])
{
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
printf("\t%f",m[i][j]);
printf("\n");
}
}

void printfi(int n,int m[n][n])
{
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
printf("\t%d",m[i][j]);
printf("\n");
}
}

#define print(a,b) _Generic((b), int(*)[]: printfi, float(*)[]: printff)((a), (b))

int main()
{
float a[5][5];
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
a[i][j] = i * 5 + j;
print(5, a);
int b[2][2];
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
b[i][j] = i * 2 + j;
print(2, b);
}

https://godbolt.org/z/zrP9TnEcP

如果你只使用方形二维数组,你可以使用这个宏:

#define print(a) _Generic((a), int(*)[]: printfi, float(*)[]: printff)(sizeof *(a) / sizeof **(a), a)

它会自己计算长度。用 print(a);print(b); 调用它。

https://godbolt.org/z/xP918sn1s

当你使用 **(a) 作为 _Generic 的第一个参数时,它会更容易:

#define print(a) _Generic(**(a), int: printfi, float: printff)(sizeof *(a) / sizeof **(a), (a))

https://godbolt.org/z/TzrY1G4ev

关于c - 我想在 C 中为二维数组创建一个通用选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68859344/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com