Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 错误:无法转换';字符(*)[a]';至';字符(*)[2]';。我不知道';我不明白为什么会有';这是个错误_C_Arrays_Dev C++ - Fatal编程技术网

C 错误:无法转换';字符(*)[a]';至';字符(*)[2]';。我不知道';我不明白为什么会有';这是个错误

C 错误:无法转换';字符(*)[a]';至';字符(*)[2]';。我不知道';我不明白为什么会有';这是个错误,c,arrays,dev-c++,C,Arrays,Dev C++,在下面的代码中,如果我使用一个数字而不是aI,它就可以正常工作。但是如果我使用a它会产生以下错误: 无法将参数“2”的“char(*)[a]'转换为“char(*)[2]”转换为“void displayNumber(int,char(*)[2])” #包括 void displayNumbers(int,charnum[2][2]); int main() { INTA=2; char num[a][a];//如果我写的是2而不是a,那么效果很好! 显示数字(a,num); 返回0; } vo

在下面的代码中,如果我使用一个数字而不是
a
I,它就可以正常工作。但是如果我使用
a
它会产生以下错误:

无法将参数“2”的“char(*)[a]'转换为“char(*)[2]”转换为“void displayNumber(int,char(*)[2])”

#包括
void displayNumbers(int,charnum[2][2]);
int main()
{
INTA=2;
char num[a][a];//如果我写的是2而不是a,那么效果很好!
显示数字(a,num);
返回0;
}
void displayNumber(int a,char num[2][2])
{
printf(“%c\n”,a+num[1][1]);
}

为什么使用
a
2
在这里会有所不同?我有一种感觉,原因可能是微不足道的,但如果有人帮助,那将是非常棒的。我使用的IDE是DEV C++。

< p>您有三个主要问题。 首先,声明
displayNumber
硬代码
num[2][2]
违背了使用可变长度数组的目的(名称的可变部分存在争议)。虽然
num[2][2]
有效,但最好将其写成
num[a][a]
,或者最好写成
(num*)[a]
(指向字符[a]数组的指针)

接下来,
num
完全未初始化。你希望打印什么?尝试读取未初始化的值会调用未定义的行为

最后,您的格式字符串位于
printf(“%c\n”,a+num[1][1])可疑。函数名为
displayNumber
,但您正在尝试打印字符。此外,如果该值低于
(空格,例如0x20,32),则不会打印任何内容,您将处于不可打印的范围内。如果要打印数字,请使用
“%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]);
}
仔细检查一下,如果你还有其他问题,请告诉我


在TDM-GCC 4.9.2上编译和使用示例

我在Win7机器上安装了TDM-GCC4.9.2。它很好用。以下是在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
),您就可以从任何地方编译)

@YaatSuka这不是问题所在。我的计划实际上是不同的。为了理解我的错误,我简化了在Mac上编译我的方法。你得到的错误是因为你使用C++编译器编译C程序。@ SoC不是C++的子集。C不是C++的子集。这两种语言有着共同的历史和共同的子集,但每种语言都有另一种语言所缺乏的特性。此外,还有一些简单的结构在两种语言中都有效,但在每种语言中都有不同的含义。因此,用C++编译器编译C代码是愚蠢的,除非它是故意写的。除非我已经尝试过你的代码,仍然会产生错误,它说“A”和“num”在这个范围内没有声明。我不知道为什么会出现这个错误。你的代码看起来不错。可能是编译器的问题。(如果您复制并粘贴它,并使用支持VLA扩展的C编译器,我保证它会工作——不会出现警告或错误)您如何以及使用什么来编译它?在gcc上,使用
gcc-Wall-Wextra-pedantic-Ofast-o dispnum dispnum.c
或VS-use
cl.exe/Wall/Ox/Fedispnum/Tcdispnum.c
。如果您需要,我必须查找
clang
字符串。我想您是对的,您是在windows还是Linux上?(如果您在Linux上,则可以使用命令行编译器下载免费的VS社区)如果您在Linux上,则应安装
gcc
。我将查看DeV C++,看看是否能为你找到一些东西。网站说它可以下载<代码> TDMGCC 4.92这是普通的旧代码> GCC < /代码>。您在编译它时所做的工作有些奇怪。您可能有本身没有VLA扩展的
std=c89
集。我真的,真的建议只打开
cmd.exe
(确保编译器的路径设置在
path
变量中),然后使用命令行学习如何构建小程序。很多时候,IDE会对你隐藏一些会让你感到不适的东西。那么学习C(或任何语言)最好的办法就是暂时忘记IDE,只需使用
cmd.exe
了解你需要什么编译器选项。IDE中有大量对话框设置编译器选项,其中许多对话框并不明显。从命令行中学习什么都不会隐藏,它将为编译器如何实际工作提供坚实的基础(你可以告诉IDE你想要它做什么,而不是希望它做正确的事情)。只需确保
gcc.exe
在您的路径中(可能在
/program files/DevC++/MinGW/bin中)
。祝你好运
$ ./bin/dispnum
4
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