项目:源到目的地票价矩阵
语言:C
理由:这是用于学校练习。我的输出已经过去了一天,所有的问题是这种代码行,我不知道问题是什么。
目标:制作一个从列表中分别获取源节点,目标节点和成本值的程序。处理完整个列表后,程序应询问用户他/她希望看到哪个节点。当用户输入节点号时,程序应输出该节点可能的目的地及其各自成本的列表。该程序应尽可能使用最小的内存(因此在数组上使用指针)。
范围:指针和结构。
代码中的问题:
这些是变量
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)-> num ++;
(listp + dst)-> 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;
这个。这是“'('令牌'之前的预期标识符”错误出现的地方。我真的不知道我在这里做错了什么。请帮助我:(
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++;
}
基本上是漂洗然后对目标节点重复。
因此,我唯一的问题是最要强调的问题。我不知道我在做什么错。我认为我的代码也可能存在其他错误,但是到目前为止,编译器尚未向我发出警告。如果有人发现任何其他可能的错误,也可以指出对我有很大帮助。谢谢,麻烦您了。
最佳答案
(listp+dst)->(cost+temp)
在语法上是无效的:编译器试图告诉您它期望使用标识符作为函数的指针,因此(listp+dst)->foo(cost+temp)
成为格式正确的表达式。
因此,如果我正确理解了您想做什么,则应该使用(*listp)[dst].cost[temp]
。或者,如果您真的更喜欢指针算术,请使用((listp+dst)->cost+tmp)
,注意括号中的更改。
关于c - 指针:“'(' token 之前的预期标识符”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29877007/