Объявление функции перед определением вызывающей ошибки в C - PullRequest
1 голос
/ 22 апреля 2019

Я пытался написать код, который может проверить, есть ли последовательность 123 в массиве или нет, для которой я сделал функцию check , которая выполняет эту работу.Но объявление этой функции до main вызывает проблемы с компиляцией, когда я записываю в нее аргументы.

#include<conio.h>
#include<stdio.h>
#include<stdlib.h>

int check(int, int);      /* This line is cauing trouble */

void main()
{   int arr_size;
    int a[]={0,1,2,1,2,1,4,5,1,2,3,4,5};
    arr_size = sizeof(a)/sizeof(a[0]);
    printf("%d",check(a, arr_size));

}

int check(int a[], int arr_size)
{
    int i;
    for(i=0;i<arr_size-1; i++)
    {
    if(a[i]==1 && a[i+1]==2 && a[i+2]==3)
        {
            return 1;

        }
    }
    return 0;
}

Скриншот ошибки прилагается.Error produced in CodeBlocks

Часть объявления не вызывает никаких проблем, и код работает нормально, когда я не пишу в нем аргументы, как показано ниже.

int check();  

Я ожидал, что при объявлении функции она должна принимать праметры, что здесь не так.Руководство будет оценено.

1 Ответ

5 голосов
/ 22 апреля 2019

У вас есть конфликт.

int и int * (или, int []) не являются одинаковыми типами.

Обновите вашу предварительную декларацию до

int check(int *, int); 

Тем не менее, учитывая использование arr_size, вам необходимо изменить условие цикла с

for(i=0;i<arr_size-1; i++)

на

for(i=0;i<arr_size-2; i++)

, поскольку вы используете [i+2] как один из индексов внутри цикла.


Относительно причины, по которой int * (указатель) в данном случае эквивалентен массиву, цитируя C11, глава §6.7.6.3

Объявление параметра как '' массив типа '' должно быть скорректировано на '' квалифицированный указатель на тип '' , [...]

...