作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果 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
int
或 float
数组的指针。
这段代码对我有用:
#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))
关于c - 我想在 C 中为二维数组创建一个通用选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68859344/
使用登录后,我想吐出用户名。 但是,当我尝试单击登录按钮时, 它给了我力量。 我看着logcat,但是什么也没显示。 这种编码是在说。 它将根据我在登录屏幕中输入的名称来烘烤用户名。 不会有任何密码。
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎是题外话,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或include a min
我是一名优秀的程序员,十分优秀!