项目:目标票价矩阵的来源
语言: C。
理由:这适用于学校运动。我的输出已经过了一天,所有的问题都是这一行代码,我不知道问题是什么。
目标:制作一个程序,分别从列表中获取源节点,目标节点和成本值。在处理完整个列表之后,程序应该询问用户他/她希望看到哪个节点。当用户输入节点号时,程序应输出节点可能的目的地列表及其各自的成本。该程序应尽可能使用MINIMAL内存(因此在数组上使用指针)。
范围:指针和结构。
代码中的问题: 这些是变量
int nodes, edges, src, dst, cst, loop=0, temp=0;
节点用于不同节点的数量。边缘用于连接数。 Src用于源节点的编号,dst用于目标节点的编号,cst用于其相应的成本。循环是程序扫描文件的时间计数器。 Temp是一个价值持有者,可以让代码更容易阅读。
这是结构
typedef struct path {
int num;
int *cost;
int *neighbors;
}path;
这是问题的一个方面
fscanf (file, "%d %d", &nodes, &edges);
这将获取文件中第一行的节点和连接数。
printf("%d %d\n", nodes, edges);
path list[25000]={[0 ... 24999]{.num=0}};
通常,我不应该这样做。大小应该取决于文件开头的节点数,但我认为问题源于列表不是数组。这实际上是对“最小记忆”部分的妥协。如果有人可以改善这一点,我将非常感激。
path * listp;
listp=&list;
puts("Processing data...");
while (loop<edges)
{
fscanf (file, "%d %d %d", &src, &dst, &cst);
这是从文件列表中获取值的原因。 (listp + SRC) - &GT; NUM ++; (listp + dst)的 - &GT; NUM ++; 这是为了在每次遇到列表中的数字时增加源节点和目标节点上的连接数。
realloc((listp+src)->cost, (listp+src)->num);
realloc((listp+src)->neighbors, (listp+src)->num);
这是为了增加成本和邻居可用的内存量,这样我就可以存储更多的值。我在这里没有遇到任何错误,但我不确定我是否正确行事。如果我不是,请通知我。
temp=((listp+src)->num)-1;
这是为了使代码更加明显。
(listp+src)->(cost+temp)=&cst;
(listp+src)->(neighbors+temp)=&dst;
这个。这就是“之前的预期标识符”('令牌'错误出现的地方。我真的不知道我在这里做错了什么。请帮帮我:(< / p>
realloc((listp+dst)->cost, (listp+dst)->num);
realloc((listp+dst)->neighbors, (listp+dst)->num);
temp=((listp+dst)->num)-1;
(listp+dst)->(cost+temp)=&cst;
(listp+dst)->(neighbors+temp)=&src;
loop++;
}
基本上是为目标节点进行冲洗和重复。
所以我唯一的问题就是强调的问题。我不知道我做错了什么。我认为我的代码可能还有其他错误,但到目前为止,编译器并未向我发出警告。如果有人注意到任何其他可能的错误,如果他们也可以指出它,对我来说将是一个很大的帮助。拜托,谢谢你。
答案 0 :(得分:1)
(listp+dst)->(cost+temp)
在语法上是无效的:编译器试图告诉你它需要一个标识符作为函数的指针,以便(listp+dst)->foo(cost+temp)
成为格式良好的表达式。
因此,如果我正确理解您尝试做什么,请使用(*listp)[dst].cost[temp]
。或者,如果您真的更喜欢指针算术,((listp+dst)->cost+tmp)
,请注意括号中的更改。