2016-03-24 21 views
1

以下のLuaスクリプトを見てください。Luaスクリプトの関数間で変数を共有する

アイデアはステータスを変更する前に、 "getStateFlag()"を呼び出して "status"変数に割り当てて現在のステータスを取得しています。メソッドChangeState1またはChangeState2は、現在のステータスを変更できます。したがって、後でResetStatusメソッドを呼び出すときに、 "status"という値を保存することで古いステータスにリセットすることができます。

しかし、問題がある、この「状態」変数は常に0

function Start() 
    status = 0 
    local flag = getStateFlag() 
    if(flag == 1) then 
     status = getCurrentStatus() 
     ChangeState1() 
    else if(flag == 2) then 
     status = getCurrentStatus() 
     ChangeState2() 
    else 
     ResetStatus(status) 
    end 
end 

function ChangeStatus1() 
    device::set_value(1) 
end 

function ChangeStatus1() 
    device::set_value(2) 
end 

function ResetStatus(status) 
    device::set_value(status) 
end 
+0

質問を編集して、実行中の環境について説明してください(何らかの組み込みプロセッサのように聞こえるのですか?)。他のユーザーが経験したことがある場合は、アイデアを持っている可能性があります。 – solublefish

答えて

0

に設定されます。しかし問題は、この「状態」変数は常に0

のファーストに設定しています以前に保存したステータスとgetCurrentStatus()で取得した現在のステータスの2つの異なる値を分離する必要があります。これで両方を1つの変数に混在させました。これは、Start()関数を入力するたびに0で初期化されます。現在のステータスを要求していないとき(フラグが1または2でない場合)、割り当て済みの以前に保存した値を実際に破棄します(status=0)。

+0

このスクリプトはボタンクリックで実行されます。したがって、このスクリプトが実行されるたびに、私はこのように宣言しているのでstatus = 0を割り当てます。この値を一定に保つ他の方法はありますか? – Roe

1

あなたの質問が正しく理解された場合は、Start()に複数回お電話します。 flagが1に等しいか2あなたはstatusStart() にあなたの最後の呼び出しからの値にリセットすることにしたい。しかし、現在、それはすべての0になりますが、現在のステータス値を格納したいし、それがChangeState1()またはChangeState2()エルス の内側に変更されますStart()flagとしない場合は、1または2です。

したがって、まだ定義されていない場合は、statusを0で初期化したいだけです。それは0にデフォルト設定されますnilをstatusがある場合はそれ以外の場合は変わらない、だから、

status = status or 0 

:あなたがスタート()内で何ができるか

はこれです。

または単に機能の外でステータスを初期化してください。

バックアップ状態をChangeState1またはChangeState2によって変更された値から分離することが、より洗練されたソリューションです。 backupStatus変数は、バックアップするときや復元したいときにのみアクセスします。それ以外の場合は、currentStatus変数を使用します。

+0

この完全なスクリプトは、ボタンをクリックするたびに実行されます。したがって、ステータスに値がある場合は、次の実行時に0に割り当てるべきではありません。 – Roe

+1

@Roeはい私は説明した通りです。 – Piglet

+0

ステータス=ステータスまたは0を試しましたが、ステータスの値は常に0です。私は、このスクリプトが実行されるたびにステータスの値が初期化されていると思います。 – Roe

0

ピグレットの回答のコメントによれば、ランタイム環境では実行ごとにグローバル変数を削除またはクリアすることが問題のようです。 Start()の先頭にstatusの値を出力することで、出力を得る方法があると仮定して、それを検証できます。それが常にゼロの場合、それは毎回グローバルな状態を失っているかなり良い指標です。

このような場合は、実行中に状態を保存する別の方法を見つける必要があります。ファイルシステムまたはプラットフォーム固有の外部ストレージにアクセスすることができます。

関連する問題