我不知道是否必须再说一遍,但英语不是我的母语,我不是一个很好的学生,我看到你能纠正我的信息,所以很好,但我想再次道歉。
这是一个交易,我有一个程序,它将参数中传递的给定图形转换为Dimacs格式,并将其存储在.cnf文件中。(我们用SAT求解器来求解)
当我自己使用它时,他工作得很好,所以我想有另一个程序,graph_generator,我会把它管道到我的程序中,以获得随机图形。
我已经制作了我的graph_generator程序,他以我想要的格式正确地打印了图表,所以我基本上已经尝试过了/graph_generator|/myprogram,但我立即出现分段错误,我不明白为什么,graph_generator返回的正是它所期望的,当我想使用调试器时,我不知道如何知道我通过管道传输结果,当我复制粘贴graph_generatormyprogram的结果时,我正确地生成了我的.cnf文件。
我不知道问题可能来自哪里,我有一个理论,但它有点站不住脚,那就是graph_generator的stdout,一旦管道化了我的程序,就会将空间视为一个参数,这就是问题所在。有人能帮我吗?
int main (int argc, char* argv[]){
graph* mygraph;
int taille, nbEdge;
int i;
FILE* resultat;
printf("mark 1");
taille = atoi(argv[1]);
nbEdge = atoi(argv[2]);
printf("mark 2");
mygraph = build_empty_graph(taille);
for(i = 3; i < argc; i+= 2)
add_edge(atoi(argv[i]), atoi(argv[i+1]), mygraph);
resultat = fopen("resultat.cnf", "w");
write_result_comments(resultat);
write_result_header(resultat, mygraph);
write_first_stack(resultat, mygraph);
write_second_stack(resultat, mygraph);
fclose(resultat);
return 0;
}
这是myprogram的主要部分,当我将其与管道一起使用时,消息"mark1"甚至不会出现
这是分段故障,因为您没有检查argc,也没有传递任何值作为参数。请注意,stdin是一个独立于argv中参数的流。
解决这个问题的最佳方法是分层构建:
tokenizer:使用getchar在循环中读取stdin,直到到达空白(空格、制表符或换行符)。
parser:atoi很好,因为您只传递int。
状态机:前两个args到taille和nbEdge,其余成对(x,y)调用程序。也许在循环中使用switch语句和状态变量。
程序:程序的其余部分基本上是原样的。