2015-05-14 136 views
-2

返回此函數時出現了分段錯誤(最後一段),我不知道爲什麼(我瘋了,因爲無法理解這個問題)。返回時出現分段錯誤

frase是一個全局變量。該函數是另一個函數的副本,我只修改了最後一個函數(之前我寫了一條評論以更好地展示)。如果函數在{cout<<"404 "<<endl;return 404;}處返回,則不會發生錯誤。我希望我已經解釋了一切必要的東西。

int funzione_principale() 
{ 
    //string frase; 
    char frase_char [1024]={'\0'}; 
    char frase_elaborata [1024]={'\0'}; 

    PlaySound(TEXT("Avviso.wav"), NULL, SND_FILENAME); 
    rec(); //REGISTRO L' AUDIO 
    while(active) 
     Sleep(50); // HERE I WAIT OTHER FUNCTION TO COMPLETE! 
    if(frase.length()<=14) 
    { 
     cout<<"404 "<<endl;return 404; 
    } 
    frase.copy(frase_char,frase.length()-57,56); 
    for(int k=0; frase_char[k]!='"';k++) 
    { 
     frase_elaborata[k]=frase_char[k]; 
    } 
    //tramite fparole otteniamo il numero di parole contenute nella frase_elaborata 
    righe=fparole(frase_elaborata); 
    //MANIPOLAZIONE DELLE PAROLE NELAL FRASE TRAMITE MATRICE 
    char matrice [righe][27]; 
    for(int x=0;x<=righe;x++) 
     memset(matrice[x],0,27); 
    int conto=0; 
    int indice=0; 
    int riga=0; 
    int lunghezza=strlen(frase_elaborata); 
    minuscole_accenti(frase_elaborata); 
    cout<<"Frase tradotta: "<<frase_elaborata<<endl; 
    while (frase_elaborata[conto]!='\0') 
    { 
     if(frase_elaborata[conto]>=97 && frase_elaborata[conto]<=122) 
     { 
      matrice[riga][indice]=frase_elaborata[conto]; 
      indice++; 
     } 
     if(frase_elaborata[conto]>=48 && frase_elaborata[conto]<=57) 
     { 
      matrice[riga][indice]=frase_elaborata[conto]; 
      indice++; 
     } 
     if(frase_elaborata[conto]==' ' && conto!=lunghezza-1 && frase_elaborata[conto+1]!=' ') 
     { 
      matrice[riga][indice]='\0'; 
      indice=0; 
      riga++; 
     } 
     conto++; 
    } 
    //ADESSO LA MATRICE CONTIENE NUM RIGHE CON OGNIUNA, UNA PAROLA DELLA FRASE 
    cout<<"Frase presente nella matrice: "<<endl; 
    for(int x=0;x<=righe;x++) 
     cout<<matrice[x]<<endl; 

    // FROM HERE I MODIFIED THE FUNCTION ! 

    for(int t=0;t<=righe;t++) 
    { 
     if(strcmp(matrice[t],"s")==0) 
     {return 1;} 
     if(strcmp(matrice[t],"si")==0) 
     {return 1;} 
     if(strcmp(matrice[t],"affermativo")==0) 
     {return 1;} 
     if(strcmp(matrice[t],"ok")==0) 
     {return 1;} 
     if(strcmp(matrice[t],"certo")==0) 
     {return 1;} 

     if(strcmp(matrice[t],"no")==0) 
     {return -1;} 
     if(strcmp(matrice[t],"negativo")==0) 
     {return -1;} 

     if(strcmp(matrice[t],"dopo")==0) 
     {return 0;} 
     if(strcmp(matrice[t],"rimanda")==0) 
     {return 0;} 
     if(strcmp(matrice[t],"rimandalo")==0) 
     {return 0;} 
     if(strcmp(matrice[t],"non")==0 && strcmp(matrice[t+1],"ora")==0) 
     {return 0;} 
     if(strcmp(matrice[t],"chiedi")==0 && strcmp(matrice[t+1],"dopo")==0) 
     {return 0;} 
     if(strcmp(matrice[t],"chiedimelo")==0 && strcmp(matrice[t+1],"dopo")==0) 
     {return 0;} 

    } 
    return 404; 
} 
+1

是'matrice [t + 1]'在最後一個循環中是否正確?看起來像訪問數組越界...(沒有讀取所有代碼) – tomse

+0

是的,這是正確的。你說得對,我會解決的,謝謝! (但是,這不是一個大問題,因爲我確定如果strcmp關於matrice [t]和「non」(和另一個)返回0,這意味着矩陣[t + 1]可以訪問。 – Alan

回答

2

你在2個地方遇到了問題(同樣的問題)。您的for循環從0運行到righe INCLUSIVE,並且您執行了兩次。有一次你寫入非法內存空間(for(int x=0;x<=righe;x++) memset(matrice[x],0,27);),第二次讀它。 for應該是for(int x=0;x<righe;x++)

+0

You right! ,但是如果righe = 0,這使得該函數不適用於我,所以我只更改'char matrice'[righe + 1] [27];'並且工作!謝謝你:D – Alan