いくつかの文字列をespeakに渡そうとすると、それらが読み取られますが、「セグメンテーション違反」が発生します。

user8663682

これは私のコードです。ユーザーから5つの文字列を取得し、ユーザーがそれを挿入したときにespeakがそれぞれの文字列を読み取ります。しかし、私はsegmentation fault(core dumped)メッセージを受け取ります。

#include <string.h>
#include <malloc.h>
#include <espeak/speak_lib.h>

int test()
{

espeak_POSITION_TYPE position_type;
espeak_AUDIO_OUTPUT output;
char *path=NULL;
int Buflength = 500, Options=0;
void* user_data;
t_espeak_callback *SynthCallback;
espeak_PARAMETER Parm;



char Voice[] = {"English"};

int i=0;
char text[1000];
unsigned int Size,position=0, end_position=0, flags=espeakCHARS_AUTO, *unique_identifier;


    output = AUDIO_OUTPUT_PLAYBACK;

    espeak_Initialize(output, Buflength, path, Options ); 
    espeak_SetVoiceByName(Voice);
    const char *langNativeString = "en_US";
    espeak_VOICE voice={0};

        voice.languages = langNativeString;
        voice.name = "US";
        voice.variant = 2;
        voice.gender = 1;
       Size = strlen(text)+1;    


for (i=0; i<5; i++)
{

scanf("%s ", &text);

printf("%s", text);

    espeak_Synth( text, Size, position, position_type, end_position, flags,
    unique_identifier, user_data );
    espeak_Synchronize( );
fflush(stdout);

}

return 0;
}






int main(int argc, char* argv[] ) 
{
    test();

    return 0;
}

いくつかの変更を試みましたが、どれも機能しませんでした。私はプログラムがこのように機能することを望みます:

ユーザー入力:こんにちは

espeakは言う:こんにちは

ユーザー入力:1つ

espeakは言う:1つ

(5入力用)

しかし、入力として4文字を超えてインターリングしようとすると、segmentation faultエラー発生します。

ntd

2つの主な問題は次のとおりです。

  1. strlen初期化されていないcharの配列で使用ます
  2. unique_identifier引数はunsignedint(ソースコードを参照)でespeak_SynthあるNULLか、それを指している必要がありますが、現在はランダムメモリへのunsignedポインタです。

strlenscanf移動NULL代わりに使用するunique_identifierと、コードが突然機能します(一種)。

ただし、他にも多くの問題があります。役に立たない変数、初期化されていない変数、入力のサニタイズがないなどです。IMOのより良いアプローチは、test関数を破棄し、最初から適切に書き直すことです。

補遺

これが私が上記のコードを書き直す方法です。それはまだ最適ではありません(入力のサニタイズもエラーチェックもありません)が、IMOははるかにクリーンです。

#include <stdio.h>
#include <string.h>
#include <espeak/speak_lib.h>

static void say(const char *text)
{
    static int initialized = 0;
    if (! initialized) {
        espeak_Initialize(AUDIO_OUTPUT_PLAYBACK, 0, NULL, 0);
        espeak_SetVoiceByName("en");
        initialized = 1;
    }
    espeak_Synth(text, strlen(text)+1,
                 0, POS_CHARACTER, 0,
                 espeakCHARS_UTF8, NULL, NULL);
    espeak_Synchronize();
}

int main()
{
    char text[1000];
    int i;

    for (i = 0; i < 5; ++i) {
        scanf("%s", text);
        say(text);
    }

    return 0;
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ