"Luaの3でのプログラミング" の注意事項を読んで(XXII)

日付:2014年8月6日
CのAPIPartⅣ

26アプリケーションの拡張
     Luaの使用が設定言語を作るために使用されることが重要です。主要言語でいくつかの設定機能を実行します。

 
26.1基本
     時々、プログラムはいくつかの機能情報、LUAを使用するよりも設定を容易にする他の多くの方法があるかもしれない多くの時間を設定する必要があります。そのようなファイルを、環境変数を使用したり読んように、ファイルを解析するために関連したファイルを読み込みます。Luaの設定は、LUAのファイルに対応している場合読み取ることがなど、CSV、TXTファイル、として交換。
     あなたがファイルを解析するためのLua LuaのAPIを制御するために使用し、その後、あなたはLuaのグローバル変数から設定したい値を取得する必要がある場合のLuaを使用することで構成されました。ロード機能は、ファイルをロードする機能を想定して、関数呼び出しがluaL_loadfile高速なファイルに与えられた名前から文を読み、次に速いのステートメントを実行するために、lua_pcallを呼び出します。(例えば、構成ファイルの構文エラー)、エラーが発生した場合、我々はスタック取得したインデックスからプログラム引数を使用して時間をlua_tostring -1、このときの誤差関数は、スタックプッシュと非ゼロのエラーコードを返すために情報。
たとえば、
lua_tostring(L、-1) - スタックからの情報を取得します
     ファイルがロードされた後、あなたはLuaのグローバル変数から変数の値を取得する必要があります。この時点で、目的の値を取得lua_getglobal呼び出して、パラメータは、グローバル変数の名前です。各呼び出しは、対応するメインプログラムがスタックから対応する値を取得し、グローバル変数値の値がスタックにプッシュでしょう。Lua_is *は、その値の種類を決定するために使用して、対応するタイプの値を取得* lua_toを呼び出しています。
     Luaの設定を使用する利点は、Luaは、ヘルプあなたはすべての文法検出プロセスは、(設定ファイルもコメントを有することができる?)ん、行われます。Luaのユーザーは、より複雑な構成処理を行うことができますが、設定ファイルは一部のユーザーに促すことができるよう情報、または適切な値を選択するために、環境変数を検出します:
e.g.
--configuration file
if getenv("DISPLAY") == ":0.0" then
     width = 300;height = 300
else
     width = 200;height = 200
     プログラムは、新しい構成情報を追加するためのLuaを使用して容易である今のところ、この機能は、プログラムをより柔軟になります:もう一つの理由は、ということです。

 
26.2表の操作
     このようなシナリオが想定されます:ウィンドウの背景色を設定します。RGB値:このケースでは、3つの値が必要です。C、各値の範囲は、典型的に[0、255]、及びルア、実数であるすべてのため、そう[0,1]の範囲の使用。
     ;このメソッドは使用定義済みの色に適していないプログラムは、などの前景の色、ボタンの色、など、様々な構成を必要とし、これは多くの変数が必要になりますその場合:通常の変数のような、それぞれの値の文のトラブルの多くをもたらすでしょう、またはデフォルト。この場合、ジョブに適したこのような構成の表でのLUA:
e.g.
background = {r = 0.30,g = 0.10,b = 0}
     テーブルを使用してスクリプトに大きな利便性をもたらします。この時にも簡単なように、所定の値の一部を使用することができます。
e.g.
BLUE = { r = 0, g = 0, b = 1.0}
background = BLUE
     これらの値を得るために、Cコードが、以下を実現することができます。
e.g.
lua_getglobal(L,"background")
if (! lua_istable(L,-1))
     error(L,"'background' is not a table");
red = getcolorfield(L,"r");
green = getcolorfield(L,"g");
blue = getcolorfield(L,"b");

#define MAX_COLOR     255
int getcolorfield(lua_State *L,const char* key)
{
      int result;
     //key 推出,而把相应的value推进栈
    lua_pushstring(L,key);
      lua_gettable(L,-2);
     //前面两段可以用 lua_getfield(L,-1,key);来替代
     if(!lua_isnumber(L,-1))
          error(L,"invalid component in background color");
     result = (int)(lua_tonumber(L,-1)) * MAX_COLOR);
     lua_pop(L,1);
     return result;
}
 

Luaの関数を呼び出す26.3
     大きな強いLuaのあるプログラムは、あるにプロファイルは、関数呼び出しを定義することができます。
     API関数は比較的簡単です呼び出します:まず、機能プッシュは、スタックに呼び出されます。その後、パラメータのプッシュがスタックに呼び出されます。そして、実際の関数呼び出しlua_pcall機能を実行することもできる。最後にスタックから呼び出しの結果を得ました。
     0は、このように、エラー処理機能、スタック内のインデックス値の残りの部分の位置を表す関数がないことを示し、第四のパラメータは、エラー処理機能を意味し;第2のパラメータは数lua_pcall表現と結果の数は、送信パラメータを返されますこれらの関数は、最初のスタックにプッシュする必要があり、Luaはパラメータを調整し、演算結果の実際の機能の数を返します、あなたは余分なプッシュニッケル場合に必要とするか、値を破棄します。結果は押す前に、lua_pcall関数や関数のパラメータは、スタックから離れる削除されます。関数は、結果の数、最初のプッシュの結果を返すとき。
     それだけでなく、また、エラーメッセージにスタックするプッシュします(まだ関数のパラメータと機能が起動します);あなたが運転lua_pcall中にエラーが発生した場合は、lua_pcallはエラーコードを返します。エラーメッセージをプッシュする前にエラーハンドラがある場合は、lua_pcallはまだ最初のエラー処理機能を実行します。
     LUA_ERRUNを返しlua_pcall通常のエラー状態は、異なるエラーコードが返されたエラーの2種類があります:最初のメモリ割り当てエラーがLUA_ERRMEM返されますであり、後者の場合は、LUAのエラー処理を実行している場合ときに、関数自体、この時点では確かに誤差関数を呼び出すことはありませんので、この時間はすぐにエラーコードLUA_ERRORを返しますので。また、第三の場合に定義されてlua5.2、ファイナライザ(通訳?)スロー間違った時間は、この時間はLUA_ERRGCMM(GCのメタメソッドでエラー)が返されます。このコードは、エラーが呼び出し元の関数自体に関連していないことを示しています。


 
26.4一般的な関数の呼び出し
     ここでは、ラッパー(ラッパー?)Cの可変長引数(変数、パラメータ?)特性で使用LUAの関数を呼び出すために使用を作成します。我々はラッパーはcall_va、パラメータである場合; 2、および結果のパラメータ文字列表現の戻り値; 3、パラメータリスト; 1、呼び出される関数の名前4、結果リストポインタの戻り値を格納します。すべての操作を処理するためのAPIを使用します。
e.g.
call_va(L,"f","dd>d",x,y,&z);
     文字列は「DD> D」、「ダブルと2種類のパラメータ、ダブルの戻り値の型」ここで、「d」は「ダブル」の意味を意味し、「私は」「整数」を表し、「s」は「文字列を表し。 " 「>」区切り文字を使用してください。関数が値を返さない場合は、「>」オプションです。

ます。https://www.cnblogs.com/zhong-dev/p/4044562.htmlで再現

おすすめ

転載: blog.csdn.net/weixin_34014277/article/details/94600984