2012-05-02 7 views
0

今私はいくつかのテストをしていますが、私はこのコードで何が間違っているのかわかりません - どんな考えですか?関数、テーブルとforルア

function IATetris(Pieza,Rotacion,Array) 
io.write("The table the script received has: ",Pieza,"\n") 
RotacionInicial = Rotacion 
PosInicial = 7 
final = #Array --this gets the size of the array 
i = 1 

    for y = 1, 20 do --the array of my tetris board is 20 in x and 14 in y so it would be something like this Array2D[20][14] 

    io.write(" First for y ",y,"\n") 
    Array2D[y]={} --clearing the new array 
    for x = 1,14 do 
    io.write(" First for x ",x,"\n") 
     if i == final then break end 

     io.write(" First for i",i,"\n") 
     Array2D[y][x] = Array[i] 
     i= i+1 --seems like you cant use i++ in lua 
     end 
    end 
end 

私がやっていることは、2つの整数と1つの配列を得ることです。私は、プログラムが実際に起こっている場所を確認するには、コンソールで書くこと、そして私が取得していますしています...ですよ

最初のログメッセージ:"The table the script received has: "

と第二のログメッセージ:" First for y "

しかし、私はそれ以上のものは得られないので、おそらくプログラムはそこでクラッシュしていますか?この関数は20秒ごとに呼び出されます。なぜ私はこれが起こっているのか分かりません。どんな助けでも本当に感謝します、ありがとう。

答えて

2

この行は、ログの場合:

io.write(" First for y ",y,"\n") 

とこの行がログに記録されていません。

io.write(" First for x ",x,"\n") 

その後、問題はこれらの行のいずれかである:

Array2D[y]={} --clearing the new array 
for x = 1,14 do 

for x...は間違いなく動作します私にとっては、Array2Dラインだとおもいます。文法的に間違っていることは何もないので、実行時エラーでなければなりません。ランタイムエラーは、Luaまたはそれが埋め込まれているアプリケーションによって報告されるべきです。そうでない場合、機能が「停止」すると、あなたは盲目的にデバッグしており、このような問題に多くの時間を費やします。

Array2Dがテーブルでない場合、私はその行で発生する可能性がある唯一のエラーが発生する可能性があります。インデックスを作成しようとしているので、インデックスにする必要があります。 Array2Dはあなたの関数では宣言されていませんが、他の場所で既に定義されているグローバル変数の場合は問題ありません。しかし、の場合は、この関数のローカル変数であるため、local Array2D = {}を追加する必要があります。

Array2Dが何であるか、実際のエラーが何であるかわからない場合は、より正確な回答をするのは難しいです。あなたは本当に、ロギングよりも、問題を見つけるのは良い方法を持っていない場合は、これは、単にArray2Dラインの前に、私の仮説を検証する必要があります

io.write("Array2D is: ", type(Array2D), "\n") 
+0

Wuaありがとう、私はこのArray2D [y] = {}を実行すると思ったような高水準のスクリプトですので、同時にローカルArray2Dを実行すると同時に宣言されるでしょう= {}これは非常にありがとう – Makenshi

+0

ようこそ。私はpcallの使用についての彼の注意が有効なものであることから、Mudの回答も高く評価しました。この場合は、Luaからエラーメッセージを受け取るのに役立ちます。しかし、それはあなたのためにこれを行うには、通常、ホストプログラムまでです。 – MattJ

2

Array2Dのように(表を問わず)初期化されていない見えるので、 Array2D[y]={}にあります。

あなたはこのように、機能やトラップ誤差を呼び出すためにpcallを使用することができます。

local ok, msg = pcall(IATetris, pieza, rotacion, array) 
if not ok then 
    print("ERROR:", msg) 
end 

サイドノート:あなたは、変数の範囲を限定するために、可能な限りlocalキーワードを使用する必要があります。