тип массива имеет неполную смежность типа элемента

У меня есть домашнее задание, и мне нужно написать программу, в которой матрица представляет смежность. Пользователю нужно ввести матрицу и индекс, и программа вернет true, если между двумя значениями индексов есть путь. Например

0 1 2 3 4
1 0 1 0 0
2 0 0 1 0
3 0 0 0 0
4 0 0 0 0

Если пользователь предоставляет эту матрицу (без номеров индексов) и дает значение 3,1, тогда она возвращает true, потому что 3 является сыном 2, а 2 является сыном единицы. Но если пользователь дает значение 4,1, он возвращает false.

#include <stdio.h>

#define N 11
#define TRUE 1
#define FALSE 0


int path(long int [][20] A, int u, int v)
{
    if(u == 0 && A[u][v] == TRUE)
        return TRUE;

    if(u == 0 && A[u][v] == FALSE)
        return FALSE;

    if(A[u][v] == FALSE)
        return path(A, u--, v);

    else if(A[u][v] == TRUE)
        return path(A, N, u);
}

int main()
{
    int arr[11][11]  = {{0,1,1,1,0,0,0,0,0,0,0},
                        {0,0,0,0,1,1,1,1,1,0,0},
                        {0,0,0,0,0,0,0,0,0,1,0},
                        {0,0,0,0,0,0,0,0,0,0,1},
                        {0,0,0,0,0,0,0,0,0,0,0},
                        {0,0,0,0,0,0,0,0,0,0,0},
                        {0,0,0,0,0,0,0,0,0,0,0},
                        {0,0,0,0,0,0,0,0,0,0,0},
                        {0,0,0,0,0,0,0,0,0,0,0},
                        {0,0,0,0,0,0,0,0,0,0,0},
                        {0,0,0,0,0,0,0,0,0,0,0}};

    return path(arr,1,8);
    return 0;
}

когда я пытаюсь запустить его на gcc, он возвращает:

adjacency.c:8:26: ошибка: ожидается ';', ',' или ')' перед 'A' adjacency.c: в функции 'main': adjacency.c:30:1: предупреждение: неявное объявление функции 'путь' [-Wimplicit-function-declaration]

Кто-нибудь может сказать мне, почему? И если моя программа вообще работает?? Спасибо ребята


person user4831626    schedule 25.04.2015    source источник
comment
К вашему сведению, return 0; никогда не будет выполняться   -  person Spikatrix    schedule 25.04.2015
comment
return path(A, N, u); вызывают внешние границы массива   -  person BLUEPIXY    schedule 25.04.2015


Ответы (1)


Прототипы функций не соответствуют размеру массива.

Попробуйте изменить

int path(long int [][20] A, int u, int v)

в

int path(long int A[][11], int u, int v)   // Move A

и в основном изменение

 int arr[11][11] 

to

 long int arr[11][11] 

или отбросить long в функции

int path(int A[][11], int u, int v)

КСТАТИ:

return path(A, N, u);

наверное плохо, так как N=11. Вы будете индексировать вне массива.

Может быть, вы хотите

return path(A, N-1, u);

вместо этого, чтобы избежать индексации массива за пределами диапазона.

ВАЖНО:

return path(A, u--, v);

наверное надо:

return path(A, --u, v);

Потому что u-- это пост-декремент. У вас будет бесконечный цикл, вызывающий path(..) снова и снова с одними и теми же значениями.

Вы хотите, чтобы он уменьшался до вызова функции. Поэтому используйте --u, так как это предварительный декремент.

person 4386427    schedule 25.04.2015
comment
@user4831626 - Нужно быть перед [][11] - person 4386427; 25.04.2015
comment
Ну, я заявляю, что сошла с ума :( Сделал все, что вы сказали, и это не работает. У кого-нибудь есть идеи, как это сделать? - person user4831626; 25.04.2015
comment
@ user4831626 Я не уверен, что вы хотите, чтобы ваш код делал, но, по крайней мере, он может скомпилироваться с предложенными изменениями. - person 4386427; 25.04.2015
comment
да может. но теперь я получаю ошибку сегментации (ядро сбрасывается) при попытке выполнить. программе нужно получить два числа например 1, 8 и вернуть если 8 имеет прямой путь к 1. подумайте об этом как о дереве - person user4831626; 25.04.2015