2017-09-04 1 views
3

내 응용 프로그램에서 구성 파일을 사용하고 싶습니다. 그러나 여기에 닭고기와 달걀 문제가 있습니다. 설정 파일은 SDL (및 다른 것들)이 어떻게 init'ed되어야 하는지를 기술 할 수 있습니다. 따라서 SDL_GetPrefPath()SDL_Init() 전에 호출해야 내 응용 프로그램의 구성이 사용자별로 저장되는 일반적인 장소를 얻을 수 있습니다. 가능한지 확실하지 않습니다. 비슷한 (fall-back) 목적을 위해서 SDL_GetBasePath()이 필요하다. 나는 추한 것을 알고 있지만, 일부 사용자는 설정 파일을 찾기 위해 선택적으로 그것을 원할 것이다. SDL 관련 함수를 사용하지 않기 때문에 구성 파일 자체를 읽는 것은 문제가되지 않지만 구성 파일을 찾을 수있는 디렉토리를 얻어야합니다.SDL_Init() 전에 SDL_GetBasePath() 및 SDL_GetPrefPath()를 호출 할 수 있습니까?

확실히 작동하는지 테스트 할 수 있지만 최상의 것은 아니며 다른 SDL 버전, 다른 아키텍처 또는 누가 알 수 있습니까? 나는 "설계 상"(그리고 "미래 보장형") 안전하다는 것을 알고 싶습니다.

위의 SDL-2 위키에는 SDL_ShowSimpleMessageBox()과 같은 일부 기능이 표시되어 있으며 SDL_Init() 이전에도 사용하는 것이 안전하지만이 경우이 경우인지 확실하지 않습니다. SDL-2 wiki가 (SDL_ShowSimpleMessageBox()과 같이) 항상 이와 같은 상황을 보여주기에 충분히 상세 할 지 모르겠다. 왜냐하면이 정보는 내가 지금 이야기하고있는 기능의 페이지에 언급되어 있지 않기 때문이다.

내 응용 프로그램은 Linux, MacOS 및 Windows에서 실행되도록 설계되었으므로 SDL이 초기화 후 환경 설정 디렉토리를 놓을 때 혼란스럽고 재사용이 안되는 경우 판단하기가 어려울 수 있습니다.

+0

[소스] (http://hg.libsdl.org/SDL/file/f76299105635/src/filesystem)에 의존적 인'-SDL_Init()'이 보이지 않습니다 ([The Wiki] (https : //wiki.libsdl.org/SDL_Init) 로깅 시스템이 initing을 필요로하지 않는다고 주장한다면, [mailing list] (https : //discourse.libsdl.org/c/sdl-development), 문서 정리 요청을 [Bugzilla] (https://bugzilla.libsdl.org/)에 추가 할 수도 있습니다. – genpfault

+0

예, 원본을 보려고했습니다. 어쩌면 내 솔루션에 결함이 있다고 생각합니다. 비록 이것이 "희망"에 의존하지 않고 우아함을 고치는 방법을 잘 모르겠지만 SDL_Init()은 나중에 달라질 수있는 설명되지 않은 행동으로 바뀔 수도 있습니다. 어쩌면 SDL_Init (0); 또는 그와 비슷한 것을 만들고, 설정을 읽은 후에 하위 시스템을 초기화하자. 현재 너무 많은 아이디어가 없지만 경험이 풍부한 SDL 사용자가 좋은 아이디어를 얻길 희망합니다. 또는 실제로 메일 링리스트 : D –

+0

나는 메일 링리스트가 최선의 방법이라고 생각합니다. * "그냥"문서화 문제 일 것입니다. 당신은 매력적인 유스 케이스가 있다고 생각합니다. – genpfault

답변

1

은 어쩌면 너무 다른 사람을 위해 유용합니다, 그래서 이것은 내가 알아낼 수있는 것입니다 :

https://bugzilla.libsdl.org/show_bug.cgi?id=3796

나는이에 대한 SDL 버그질라 티켓을 제출했습니다. 대답은 기본적으로 플랫폼에 종속적이며 안전하지 않은이 기능은 SDL_Init()없이 사용된다는 것입니다. 일부 플랫폼에서 작동 할 수도 있고 다른 플랫폼에서 작동하지 않을 수도 있습니다 (또는 향후). 그러나 팁이있어서 SDL_Init(0)SDL_Quit()을 사용합니다. 그래서, 함께 내 자신의 아이디어뿐만 아니라이 같은 추가 :

char *my_pref_dir_path = NULL; 
if (!SDL_Init(0)) { 
    char *p = SDL_GetPrefPath(app_org, app_name); 
    if (p) { 
     my_pref_dir_path = strdup(p); 
     SDL_free(p); 
    } 
    SQL_Quit(); 
} 
if (!my_pref_dir_path) { 
    /* ... panic or exit or whatever ... */ 
} 

SDL_Init(0) 그것이 내가 필요하지 않을 계획을 방해하지 않도록 너무 많은 (심지어 비디오 또는 다른 하위 시스템을 초기화하지 않습니다 SDL은 나중에 사용함), 원하는 기능을 사용하는 것이 안전해야합니다. 그 후에 SQL_Quit()은 SDL을 "사라지게"만들 것입니다. 나중에이 코드가 전혀 프로그램에 없었던 것처럼 일부는 "적절한"SDL 초기화를 가질 수 있습니다 (예 : SDL_Init(SDL_INIT_EVERYTHING)). 나는 확실하지 않다, 이후 SDL_GetPrefPath()에 의해 반환 된 포인터가 SQL_Quit() 후 유효한 경우

, 나는 그것을 strdup()하거나, 그것은 너무 어쨌든 설명서에서 권장 때부터 SDL_GetPrefPath()에 의해 반환 된 포인터 SQL_Quit() 이전 SDL_free()을 사용합니다. 어쩌면 여기서 너무 조심 스러울 지 모르지만, 이런 트릭을하면 더 안전한 내기가 될 것입니다.

이 코드 뒤에는 my_pref_dir_path에 SDL 환경 설정 디렉토리 문자열에 대한 포인터가 저장되고 오류가 발생하면 NULL이 저장됩니다.

관련 문제