2017-09-04 5 views
3

私のアプリケーションでは、設定ファイルを使いたいと思います。しかし、私はここで鶏と卵の問題を抱えています。設定ファイルはSDL(と他のもの)をどのように初期化するべきかを記述することさえできます。したがって、SDL_GetPrefPath()の前にSDL_Init()と呼ぶ必要があります。私のアプリケーションの設定がユーザ単位で保存される共通の場所を得るためです。それが可能かどうかはわかりません。私も同様の(フォールバック)目的のために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)に依存している(「Wiki」(https ://wiki.libsdl.org/SDL_Init)は、ロギングシステムが初期化を必要としないと主張しています)、[メーリングリスト](https://discourse.libsdl。org/c/sdl-development)、場合によっては[The 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はbugzillaのチケットを提出してきました。基本的にプラットフォームに依存し、安全ではないという答えは、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が格納されます。

関連する問題