2017-11-26 20 views
-1

죄송합니다 질문 제목이 잘 아니지만, 내가 무엇을 의미하는지 설명하려고하는 경우 :어느 쪽이 더 낫습니까? C++ 코드에서 System() 함수를 사용하거나 소스 코드를 사용합니까?

내가 내 C++ 코드 내에서 리눅스 터미널의 명령을 사용하여 system() 기능을 사용할 수 있습니다 아시다시피. 예 : system("aplay sound.wav");. 나는 이와 같은 모든 리눅스 명령을 쓸 수 있을지 모르지만, aplay이 작동합니다.

그래서, 내 질문은 여기에 있습니다 : 나는 eSpeak를처럼 내 C++ 프로그램을 운용에서 espeak를 사용하려면 읽기 내가 ( aplay은 "문자열"을 위의 코드 만에 대하여 무엇을 같은 것을)을 여물 통과 각각의 문자열입니다. 그것은 system() 함수를 호출하는 것이 좋습니다 아니면이 내 C 내부 ++ 코드와 같은 코드를 작성하고 내가 새 문자열? 하나가 빠른

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


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"}; 


char *text = {"this is a english test"}; 
unsigned int Size,position=0, end_position=0, flags=espeakCHARS_AUTO, *unique_identifier; 




int main(int argc, char* argv[]) 
{ 
    output = AUDIO_OUTPUT_PLAYBACK; 
    int I, Run = 1, L;  
    espeak_Initialize(output, Buflength, path, Options); 
    espeak_SetVoiceByName(Voice); 
    const char *langNativeString = "en"; //Default to US English 
    espeak_VOICE voice; 
     memset(&voice, 0, sizeof(espeak_VOICE)); // Zero out the voice first 
     voice.languages = langNativeString; 
     voice.name = "US"; 
     voice.variant = 2; 
     voice.gender = 1; 
     espeak_SetVoiceByProperties(&voice); 
    Size = strlen(text)+1;  
    espeak_Synth(text, Size, position, position_type, end_position, flags, 
    unique_identifier, user_data); 
    espeak_Synchronize(); 
    return 0; 
} 

을 읽고 싶어 할 때마다 char* text을 변경하는 것이 좋습니다?

+0

, 그것은 오히려 시스템 호출보다 프로그램에서 eSpeak를 API를 사용하는 것이 아마 더 효율적입니다. – user0042

+1

일부 시스템 명령을 실행하는 경우 C++ 대신 쉘 스크립트를 사용하는 것이 좋습니다. – VTT

+0

@VTT : 프로그램 내에서 내용이 여러 번 변경 될 때마다 하나의'string/char' 변수 만 있습니다. 변경 될 때마다'espeak'를 통해 전달하려고합니다. – user145959

답변

1

일반적으로 다른 프로그램을 실행하기 위해 system() 호출을 사용하기 전에 라이브러리 함수를 사용하거나 필요한 기능을 제공하는 코드를 작성하는 것이 좋습니다. 직접 필요한 기능을 제공하는 적절한 API (라이브러리 함수의 일명 세트)가있는 경우는 API 것을 사용하는 경우

, 당신의 프로그램은 아마 더 신뢰할 수있을 것입니다. 분명히 이것은 라이브러리 함수가 올바르게 작동한다고 가정하고 올바르게 사용할 수있는 충분한 설명서가 있습니다. 여기서의 위험은 버그가 있거나 문서화가 잘되어 있지 않은 라이브러리 기능과 우려 사항을 해결할 때 해당 라이브러리 작성자의 반응과 관련이 있습니다.

사용할 수있는 적절한 API가없는 경우 다음 옵션은 필요한 기능을 직접 구현하는 것입니다 (액세스 권한이있는 코드 및 라이브러리를 사용하여). 그런 다음 합리적인 작업을 수행한다고 가정하면 프로그램이 합리적으로 작동합니다 잘. 여기에 나오는 위험 요소는 사용자가 원하는 것을 얼마나 잘 이해하고 있으며, 필요한 기능을 설계하고 구현할 수있는 능력 (예 : 이해가 작업 범위를 훨씬 뛰어 넘는 방법) 및 사용자가 투입 한 노력 일을 잘하십시오.

최후의 수단으로, 당신은 system() 전화를 사용할 수 있습니다. 여기서 문제는 system()의 동작이 공식적으로 구현에 따라 정의되므로 호스트 시스템, 컴파일러 및 표준 라이브러리에서 다를 수 있다는 점입니다. 두 번째 부분은 system() 호출을 사용하여 실행되는 프로그램 (또는 셸)의 동작을 처리해야한다는 것입니다. 예를 들어 타사 프로그램 작성자가 새로운 기능을 도입 한 경우 실제로 해당 프로그램의 방식을 변경할 수 있습니다 실행 - 예를 들어, GUI 추가, 명령 행 옵션 변경 등 라이브러리 기능이 프로그램을 중단시키는 방식으로 변경 될 수 있지만 system() 호출을 사용하여 실행되는 타사 프로그램은 시간이 지남에 따라 프로그램을 어기십시오.

난 당신이 system()를 사용해서는 안 제안하고 있지 않다. 그러나 당신이 도달 한 첫 번째 도구가 아닌 다른 접근법이 금지되는 경우 옵션으로 간주하십시오. 당신의 아주 간략하게 예를 너머