2011-04-29 83 views
0

我已经编程了一段时间了,没有那么多,但是看起来真的很难找到分段故障的位置,已经尝试过几乎所有的东西:(。是一所学校的项目和教师通常不会对这个事情帮助找不到分段错误的位置

嗯,在这里,代码:提前

#include "funcoes2.h" 
#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 

listaa total_aero = NULL; 

void guarda_voo() 
{ 
    listaa t; /* struct list of airports */ 
    voo novo_voo; 
    aeroporto novo_aeroporto1; 
    aeroporto novo_aeroporto2; 


    scanf("%s %s %s %d:%d %s %f\n", novo_voo.codigo, novo_voo.aero_partida, novo_voo.aero_chegada, &novo_voo.hora_partida, &novo_voo.minuto_partida, novo_voo.hora_chegada, &novo_voo.preco); 

    for(t=total_aero; t != NULL; t = t->prox){ 
     if(!strcmp(t->naero.codigo, novo_voo.aero_partida)) 
      break; 
    } 

    if(t == NULL){ 
     insere_aeroporto(total_aero, novo_aeroporto1); /* adds an airport to the list, I also think that it won't reach here when executing */ 
     strcpy(total_aero->naero.codigo, novo_voo.aero_partida); 
     total_aero->naero.voos_saem++; 
     strcpy(total_aero->naero.aero_barato, novo_voo.aero_chegada); 
     strcpy(total_aero->naero.aero_tarde, novo_voo.aero_chegada); 
     total_aero->naero.preco_barato=novo_voo.preco; 
     total_aero->naero.hora_tarde=novo_voo.hora_partida; 
     total_aero->naero.minuto_tarde=novo_voo.minuto_partida; 
     total_aero->naero.situacao='a'; 
     total_aero->naero.voos = NULL; 
     insere_voo((total_aero->naero).voos, novo_voo); 
     } 
    else{ 
     t->naero.voos_saem++; 
     if(novo_voo.preco < (t->naero.preco_barato)){ 
      t->naero.preco_barato=novo_voo.preco; 
      strcpy(t->naero.aero_barato, novo_voo.aero_chegada); 
     }; 
     if((t->naero.hora_tarde<novo_voo.hora_partida) || (t->naero.hora_tarde==novo_voo.hora_partida && t->naero.minuto_tarde<novo_voo.minuto_partida)){ 
      (t->naero.hora_tarde=novo_voo.hora_partida); 
      (t->naero.minuto_tarde=novo_voo.minuto_partida); 
      strcpy(t->naero.aero_tarde, novo_voo.aero_chegada); 
     } 
     insere_voo(t->naero.voos, novo_voo); 
    } 


    for(t=total_aero; t != NULL; t = t->prox){ 

     if(!strcmp(t->naero.codigo, novo_voo.aero_chegada)){ 
      t->naero.voos_chegam++; 
      return; 
     } 
    } 

谢谢,如果事情不说清楚,告诉我,我会尽力解释它

我会把这里的.h文件:

typedef struct _st_voo{ 
char codigo[7]; 
char aero_partida[4]; 
char aero_chegada[4]; 
int hora_partida; 
int minuto_partida; 
char hora_chegada[6]; 
float preco; 
}voo; 



struct nodev { 
voo nvoo; 
struct nodev *prox; 
}; 
typedef struct nodev *listav; 



typedef struct _st_aeroporto{ 
char codigo[4]; 
int voos_saem; 
int voos_chegam; 
char aero_barato[4]; 
char aero_tarde[4]; 
float preco_barato; 
int hora_tarde; 
int minuto_tarde; 
char situacao; 
listav voos; 
}aeroporto; 


struct nodea { 
aeroporto naero; 
struct nodea *prox; 
}; 
typedef struct nodea *listaa; 



void guarda_voo(); 

void info_aeroporto(); 

void insere_voo(listav x, voo novo_voo); 

void remove_voo(listav x, voo cancelado); 

void insere_aeroporto(listaa x, aeroporto novo_aero); 
+1

你能改正格式吗?老实说,所有这一切都不明确......我建议你放置一个断点,并通过代码... – Pepe 2011-04-29 18:42:34

+1

你在调试器中通过你的代码?当发生seg-fault时,发生了什么? – 2011-04-29 18:42:40

+0

我不知道任何调试器,所以我真的不知道哪一行。 我会尽力做到这一点P.R. – Filipe 2011-04-29 18:45:20

回答

2

你的代码条目全部搞砸了。由于我们无法看到所有代码或执行它,因此不太可能有人能够找到它。你有两个选择:

  • 正道:学习如何调试代码用gdb:http://www.gnu.org/software/gdb/
  • 肮脏的方式:用printf()在你的代码的不同部分进行打印语句到控制台帮助您识别出现分段故障的位置和时间。
1

啊,Google是你的朋友,但我会继续说下去:很明显你需要一个调试器。如果您在Linux或UNIX操作系统上运行此操作,那么您需要使用gdb(http://www.gnu.org/software/gdb/),而在Windows版本的Visual Studio中,其同胞随附了一个内置的调试器如果你正在使用其中的一种查找分段错误,应该没有时间。

对于GDB,调用示例在http://sourceware.org/gdb/current/onlinedocs/gdb/Sample-Session.html#Sample-Session处可用,并且专门针对分段错误的一个位于此链接:http://www.unknownroad.com/rtfm/gdbtut/gdbsegfault.html

0

在尝试使用strcpy或scanf复制到字符串之前,检查是否已经为字符串分配了空间。

正如其他人提到的那样,使用调试器。如果您只是在调试器中运行,直到失败,您将能够查看回溯以查看导致失败的调用。

您可以使用printf语句来显示值 - “穷人”的调试器,但使用调试器可以更快地发现问题。

+0

我试图使用那个“可怜”的人的调试器,试图在main.c的开始时printf,但它没有工作。我会尝试得到一个真正的调试器然后 – Filipe 2011-04-29 18:51:37

+0

@Filipe:为什么它没有工作?在某种极端情况下,您应该在代码中的每条语句之后放置一个'printf'。这样,您可以确定在发生seg-fault之前它有多远。 – 2011-04-29 18:56:07

+0

嗯我认为printf的问题在于,我从.in文件获取信息并将其写入.out文件,并且出于某种原因,它不会写任何内容。当我试图在没有写入.out文件的情况下运行它时,它显示了我的printf。试图做穷人的方式 – Filipe 2011-04-29 19:04:58