【问题标题】:array type has incomplete element type adjacency数组类型具有不完整的元素类型邻接
【发布时间】:2015-04-25 11:27:46
【问题描述】:

我做了一些作业,需要编写一个程序,给定一个矩阵表示邻接。 用户需要将矩阵和索引放入,如果索引的两个值之间存在路径,则程序返回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 是 1 的儿子。但是如果用户给出的值是 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]

谁能告诉我为什么?如果我的程序甚至可以工作? 谢谢大家

【问题讨论】:

  • long int [][20] A -> int A[][11]
  • 仅供参考,return 0; 永远不会执行
  • return path(A, N, u); 导致外部数组边界

标签: c arrays adjacency-matrix


【解决方案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] 

 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 因为它是一个预减量。

【讨论】:

  • @user4831626 - 需要在 [][11] 之前
  • 好吧,我说让我失去理智:(你说的一切都做了,但它不起作用。有人知道怎么做吗?
  • @user4831626 我不确定您希望您的代码做什么,但至少它可以使用更改后的建议进行编译。
  • 可以。但现在我在尝试执行时遇到“分段错误(核心转储)”。程序需要接收两个数字,例如 1、8,如果 8 有到 1 的直接路径,则返回。把它想象成一棵树
猜你喜欢
  • 2012-04-17
  • 2013-09-27
  • 1970-01-01
  • 1970-01-01
  • 2018-10-24
  • 1970-01-01
  • 2014-12-27
  • 1970-01-01
  • 2021-05-31
相关资源
最近更新 更多