2011-04-29 80 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