Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.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中“char”错误之前应为“')_C_Function_Pointers - Fatal编程技术网

错误:C中“char”错误之前应为“')

错误:C中“char”错误之前应为“'),c,function,pointers,C,Function,Pointers,我是C语言的新手,尤其是指针。我将感谢任何帮助 int checkDiamonds(cor_row,cor_collumn,char *arr2) { if (*(arr2 + cor_row*7 + cor_collumn)=='*') return 1; else return 0; } 这是我在代码中使用的函数之一,我不明白为什么它总是给我这个错误:在“char”之前应该有。您必须定义参数的类型,例如: int checkDiamond

我是C语言的新手,尤其是指针。我将感谢任何帮助

int checkDiamonds(cor_row,cor_collumn,char *arr2)
{
    if (*(arr2 + cor_row*7 + cor_collumn)=='*')

        return 1;

    else
        return 0;
}

这是我在代码中使用的函数之一,我不明白为什么它总是给我这个错误:在“char”之前应该有。您必须定义参数的类型,例如:

int checkDiamonds(int cor_row, int cor_collumn, char *arr2)
{
    // ...
}

同时作为其定义的函数声明可以使用标识符列表或参数类型列表,但不能同时使用两者

所以这个函数定义

int checkDiamonds(cor_row,cor_collumn,char *arr2)
{
    if (*(arr2 + cor_row*7 + cor_collumn)=='*')

        return 1;

    else
        return 0;
}
被编译器解析为具有标识符列表的函数,但随后遇到类型说明符

因此,您需要使用标识符列表或参数类型列表。当然,最好使用参数类型列表为编译器提供函数原型

例如,您的函数可以声明为

int checkDiamonds( size_t cor_row,size_t cor_collumn, const char *arr2)
{
    return *( arr2 + cor_row*7 + cor_collumn ) == '*';
}
下面是一个演示程序,它显示了在同时是函数定义的函数声明中使用标识符列表和参数类型列表之间的区别

#include <stdio.h>

void f( s, n )
const char *s; size_t n;
{
    puts( s + n );
}

void g( const char *s, size_t n )
{
    puts( s + n );
}

int main(void) 
{
    f( "One Two", 0 );
    g( "One Two", 4 );

    return 0;
}

定义函数的现代方法是为每个参数指定一个类型:

int checkDiamonds(int cor_row, int cor_collumn, char *arr2)
{
    …
}
为了支持旧的源代码,仍然可以使用以下类型分别定义函数:

int checkDiamonds(cor_row, cor_collumn, arr2)
int cor_row;
int cor_collumn;
char *arr2;
{
    …
}
因为编译器看到int checkDiamondscor_行,cor_collumn,所以它希望下一个是另一个参数名或右括号。相反,当它看到一个类型char时,这是出乎意料的,所以抱怨道,告诉您它期望的是一个而不是char


这两种定义方法之间还有其他区别。第一种方法可以更好地区分类型,应该在新代码中使用。

编译器因错误信息差而臭名昭著。所以别难过。遗憾的是,前端的编写速度很快,因此它在发现语法被破坏时报告错误,而不一定是您的问题所在。它不想花很多时间弄清楚你想做什么。如果前端编译器有两个不同的版本就好了,一个版本速度快,另一个版本提供更好的错误消息。@franji1编译器非常擅长提供错误消息,如果你把它们放在上下文中,看看问题中省略的行号。@franji1错误消息的质量几乎与解析性能无关。相反,编写编译器以提供良好的错误消息要困难得多。我所说的“更难”是指既复杂又使解析代码更加复杂。错误的修复与缺少一个around字符完全无关,对吗?这是一个错误消息。见莫斯科的@vlad解释。错误消息假定问题是标识符列表格式不正确。错误的假设。这是一个格式不正确的参数类型列表。根据这些假设,它可能会产生两种不同的错误。这就是我所说的。+1对导致特定编译器错误的语法差异进行了很好的解释——解释了他们为什么会出现错误,但不是我的代码出了什么问题,这也是很多人认为答案应该是什么。您的回答解释了OP为什么会得到错误—而不仅仅是如何修复它。
int checkDiamonds(cor_row, cor_collumn, arr2)
int cor_row;
int cor_collumn;
char *arr2;
{
    …
}