【问题标题】:Error: Cannot convert 'char(*)[a]' to 'char(*)[2]'. I don't understand why there's an error错误:无法将“char(*)[a]”转换为“char(*)[2]”。我不明白为什么会出现错误
【发布时间】:2018-03-15 09:26:30
【问题描述】:

在下面的代码中,如果我使用数字而不是 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]);
}

为什么在这里使用a2 会有所不同?我有一种感觉,原因可能是微不足道的,但如果有人提供帮助,那就太好了。我使用的 IDE 是 Dev C++。

【问题讨论】:

  • @YaatSuka 这不是问题。我的程序实际上是不同的。为了了解我哪里出错了,我正在简化它
  • 它在 Mac 上编译得很好。
  • 您收到错误是因为您正在使用 C++ 编译器来编译 C 程序。
  • @Soc C 不是 C++ 的子集。
  • C 不是 C++ 的子集。这两种语言共享历史和一个共同的子集,但每种语言都具有另一种语言所缺乏的功能。此外,存在在两种语言中都有效但在每种语言中具有不同含义的简单结构。因此,用 C++ 编译器编译 C 代码是愚蠢的,除非它是有意编写的。

标签: c arrays dev-c++


【解决方案1】:

你有三个主要问题。

首先声明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,但您正试图打印一个字符。此外,如果该值低于 ' '(空格,例如 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]);
}

使用/输出示例

$ ./bin/dispnum
4

查看一下,如果您还有其他问题,请告诉我。


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

我在 Win7 机器上安装了 TDM-GCC 4.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 在您的路径中,您就可以从任何地方编译)

【讨论】:

  • 好吧,我试过你的代码,仍然产生错误,它说'a'和'num'没有在这个范围内声明。我不知道为什么会出现这个错误。你的代码看起来不错。可能是编译器有问题
  • 哇。 (如果您复制并粘贴它并使用支持 VLA 扩展的 C 编译器,我保证它会工作——没有警告或错误)您如何以及使用什么来编译它?在 gcc 上,使用 gcc -Wall -Wextra -pedantic -Ofast -o dispnum dispnum.c 或对于 VS 使用 cl.exe /Wall /Ox /Fedispnum /Tcdispnum.c。如果您需要,我将不得不查找 clang 字符串。
  • 我认为你是对的,你是在 windows 还是 Linux 上? (如果你是命令行编译器,你可以下载免费的 VS 社区)如果你在 Linux 上,那么应该安装gcc。我会看看 Dev C++,看看我能不能为你找到一些东西。
  • 该网站说可以用TDM-GCC 4.9.2 下载它,这是普通的旧gcc Dev-C++ Blog。你正在做什么来编译它有些奇怪。您可能有 std=c89 集,它本身没有 VLA 扩展。我真的非常建议只打开cmd.exe(确保编译器的路径设置在path 变量中),然后使用命令行来学习如何构建小程序。很多时候,IDE 可以向您隐藏一些适合您的东西。
  • 那么,学习 C(或任何语言)最好的办法就是暂时忘记 IDE,只需使用 cmd.exe 了解您需要的编译器选项。 IDE 有大量用于设置编译器选项的对话框,其中许多对话框并不那么明显。从命令行学习不会对您隐藏任何内容,并且将为您提供有关编译器实际工作方式的坚实基础(然后您可以告诉 IDE 您希望它做什么,而不是 希望 它正在执行正确的事)。只要确保gcc.exe 在你的路径中(它可能在/program files/DevC++/MinGW/bin) 之类的地方。祝你好运。
猜你喜欢
  • 2022-01-22
  • 1970-01-01
  • 2022-01-10
  • 2020-01-23
  • 1970-01-01
  • 1970-01-01
  • 2011-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多