对于一项家庭作业,我的任务是向代码添加错误检查。我还剩下两个:一个我了解我需要编写错误检查的内容,但是无法使它正常工作,另一个我还没有找到要检查的内容。
我尝试更改read_edge的返回类型以允许使用return 0;在发现错误时结束函数,但这导致g.edges收到错误的类型。我还尝试在测试“ edge”结构上主调用read_edge之前设置错误检查,但这对捕获错误没有影响。
typedef int vertex;
typedef struct {
vertex source;
vertex target;
float weight;
} edge;
typedef struct {
int n;
int m;
vertex* vertices;
edge* edges;
} graph;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
edge read_edge(FILE* file) {
edge e;
if (fscanf(file, "%d %d %f", &e.source, &e.target, &e.weight) != 3){
printf("Error: Expected an Integer and/or Float\n");
return 0;
}
fscanf(file, "%d %d %f", &e.source, &e.target, &e.weight);
return e;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
这是main调用read_edge的部分:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
graph g = create_graph(n, m);
for (int i = 0; i < m; i++) {
// missing error check
g.edges[i] = read_edge(file);
}
printf("%d %d\n", g.n, g.m);
return 0;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
很显然,由于我尝试返回0,所以这将导致编译错误;返回类型为“ edge”,但我不确定如何使这种情况发生。
答案 0 :(得分:1)
更改函数,使其返回int
,并使用指向要填充的结构的指针作为参数。
此外,您不应致电fscanf()
两次。第二个调用将尝试从文件中读取下一个结构,而不是重新读取测试结果时所读取的内容。
int read_edge(FILE* file, edge *e) {
if (fscanf(file, "%d %d %f", e->source, e->target, e->weight) != 3){
printf("Error: Expected two integers and float\n");
return 0;
}
return 1;
}
在呼叫者中,而不是
e = read_edge(f);
您使用类似
int success = read_edge(f, &e);
所以另一个功能是:
for (int i = 0; i < m; i++) {
int success = read_edge(file, &g.edges[i]);
if (!success) {
break;
}
}