返回时出现分段错误

时间:2015-05-14 18:48:00

标签: c++ windows

我在返回此功能时遇到了分段错误(在最后一个内部),我不知道为什么(我会发疯,因为这个问题无法理解)。

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 个答案:

答案 0 :(得分: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++)