Error: Cannot convert 'char(*)[a]' to 'char(*)[2]'. I don't understand why there's an error
Error: Cannot convert 'char(*)[a]' to 'char(*)[2]'. I don't understand why there's an error
在下面的代码中,如果我使用一个数字而不是 a
,它就可以正常工作。但是如果我使用 a
它会给出以下错误:
Cannot convert 'char(*)[a]' to 'char(*)[2]' for argument '2' to 'void displayNumbers(int, char(*)[2])'
#include <stdio.h>
void displayNumbers(int,char num[2][2]);
int main()
{
int a=2;
char num[a][a];// if i write 2 instead of a, it works fine!
displayNumbers(a,num);
return 0;
}
void displayNumbers(int a,char num[2][2])
{
printf("%c\n",a+ num[1][1]);
}
为什么使用 a
或 2
会有所不同?我有一种感觉,原因可能微不足道,但如果有人提供帮助,那就太好了。 IDE 我使用的是 Dev C++。
你有三个主要问题。
首先声明 displayNumber
硬编码 num[2][2]
违背了使用 可变长度数组 的目的(变量 部分名称有问题)。虽然 num[2][2]
有效,但最好写成 num[a][a]
,或者最好写成 (num*)[a]
(指向 char [a] 数组的指针)
接下来,num
完全未初始化。您希望打印什么?尝试读取未初始化的值会调用 Undefined Behavior.
最后,printf ("%c\n", a + num[1][1]);
中的格式字符串值得怀疑。函数名称是 displayNumber
,但您正试图打印一个 字符 。此外,如果该值低于 ' '
(space,例如 0x20、32),则不会打印任何内容,您将处于 Non-Printiable 范围内。如果要打印数字,请使用 "%d"
格式说明符 .
总而言之,您可以执行类似以下操作:
#include <stdio.h>
void displayNumbers (int a, char (*num)[a]);
int main (void) {
int a=2;
char num[a][a];
for (int i = 0; i < a; i++)
for (int j = 0; j < a; j++)
num[i][j] = i + j;
displayNumbers (a, num);
return 0;
}
void displayNumbers (int a, char (*num)[a])
{
printf ("%d\n", a + num[1][1]);
}
例子Use/Output
$ ./bin/dispnum
4
检查一下,如果您还有其他问题,请告诉我。
在 TDM-GCC 4.9.2 上编译和使用的示例
我在 Win7 机器上安装了 TDM-GCC 4.9.2。它工作正常。这是版本,编译和 运行 on Windows 7:
C:\Users\david\Documents\dev\src-c\tmp>gcc --version
gcc (tdm-1) 4.9.2
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
C:\Users\david\Documents\dev\src-c\tmp>gcc -Wall -Wextra -pedantic -Ofast -std=gnu11 -o bin\dispnum dispnum.c
C:\Users\david\Documents\dev\src-c\tmp>bin\dispnum
4
(我留下了完整的目录和路径信息作为示例,只要 gcc.exe
在您的路径中,您就可以从任何地方编译)
在下面的代码中,如果我使用一个数字而不是 a
,它就可以正常工作。但是如果我使用 a
它会给出以下错误:
Cannot convert 'char(*)[a]' to 'char(*)[2]' for argument '2' to 'void displayNumbers(int, char(*)[2])'
#include <stdio.h>
void displayNumbers(int,char num[2][2]);
int main()
{
int a=2;
char num[a][a];// if i write 2 instead of a, it works fine!
displayNumbers(a,num);
return 0;
}
void displayNumbers(int a,char num[2][2])
{
printf("%c\n",a+ num[1][1]);
}
为什么使用 a
或 2
会有所不同?我有一种感觉,原因可能微不足道,但如果有人提供帮助,那就太好了。 IDE 我使用的是 Dev C++。
你有三个主要问题。
首先声明 displayNumber
硬编码 num[2][2]
违背了使用 可变长度数组 的目的(变量 部分名称有问题)。虽然 num[2][2]
有效,但最好写成 num[a][a]
,或者最好写成 (num*)[a]
(指向 char [a] 数组的指针)
接下来,num
完全未初始化。您希望打印什么?尝试读取未初始化的值会调用 Undefined Behavior.
最后,printf ("%c\n", a + num[1][1]);
中的格式字符串值得怀疑。函数名称是 displayNumber
,但您正试图打印一个 字符 。此外,如果该值低于 ' '
(space,例如 0x20、32),则不会打印任何内容,您将处于 Non-Printiable 范围内。如果要打印数字,请使用 "%d"
格式说明符 .
总而言之,您可以执行类似以下操作:
#include <stdio.h>
void displayNumbers (int a, char (*num)[a]);
int main (void) {
int a=2;
char num[a][a];
for (int i = 0; i < a; i++)
for (int j = 0; j < a; j++)
num[i][j] = i + j;
displayNumbers (a, num);
return 0;
}
void displayNumbers (int a, char (*num)[a])
{
printf ("%d\n", a + num[1][1]);
}
例子Use/Output
$ ./bin/dispnum
4
检查一下,如果您还有其他问题,请告诉我。
在 TDM-GCC 4.9.2 上编译和使用的示例
我在 Win7 机器上安装了 TDM-GCC 4.9.2。它工作正常。这是版本,编译和 运行 on Windows 7:
C:\Users\david\Documents\dev\src-c\tmp>gcc --version
gcc (tdm-1) 4.9.2
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
C:\Users\david\Documents\dev\src-c\tmp>gcc -Wall -Wextra -pedantic -Ofast -std=gnu11 -o bin\dispnum dispnum.c
C:\Users\david\Documents\dev\src-c\tmp>bin\dispnum
4
(我留下了完整的目录和路径信息作为示例,只要 gcc.exe
在您的路径中,您就可以从任何地方编译)