2014-11-02 44 views
0

我不知道我是否必须再说一遍,但英语不是我的母语,我不是一个很好的学生,我见过你能够纠正我的消息,这很好,但我想再次道歉。分段错误,当我管stdout我的程序

这是处理,我有一个程序,它将参数中传递给定的图形转换为Dimacs格式,我将存储在.cnf文件中。 (我们用它来解决它与SAT求解器)

当我自己使用它时,他完美的工作,所以我想有另一个程序,graph_generator,我将管道到myprogram有随机graphes 。

我已经制作了我的graph_generator程序,并且他正确地以我想要的格式打印图形,所以我试图基本完成./graph_generator | ./myprogram,但我立即得到了分段错误,我看不到为什么,graph_generator返回的是预期的结果,而当我想使用调试器时,我不知道如何知道我输出结果,我复制粘贴graph_generator myprogram的结果正确地生成我的.cnf文件。

我不知道问题来自哪里,我有一个理论,但它有点跛脚,它是graph_generator的stdout,一旦管道myprogram认为空间是一个参数,并且存在问题。任何人都可以帮助我吗?

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的主,当我与管道使用它,消息“MARK-1”甚至不出现

+0

不,它不会那样做。显示代码段错误的地方。 – stark 2014-11-02 14:55:54

+0

我试图用printf做一些标记,在我甚至尝试用atoi转换参数之前发生段错误。 – 2014-11-02 15:02:16

+0

然后,您要显示的行从'main'开始并转到atoi。 – stark 2014-11-02 15:07:09

回答

1

这是因为段错误你不检查argc和逝去的无值作为参数。 请注意,标准输入是来自argv中参数的单独流。解决这个问题

最好的办法是分层次构建:

标记生成器:读取标准输入用的getchar循环,直到你得到的空格(空格,制表符或换行符)。

解析器:atoi很好,因为你只能通过整数。

状态机:前两个参数为taille和nbEdge,成对休息(x,y)来调用程序。也许在循环中使用switch语句和状态变量。

程序:你的程序的其余部分非常类似。

+0

就是这样,我的管道没有进入argv,所以我的程序不能工作,有没有办法这样做,否则我将不得不使用stdin的文件描述符? – 2014-11-02 15:51:09