2012-05-02 3 views
0

Прямо сейчас я делаю несколько тестов, но я не могу найти, что не так с этим кодом - любая идея?функции, таблицы и для Lua

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. В этом нет ничего синтаксически неправильного, поэтому это должна быть ошибка времени выполнения. Ошибки Runtime должны сообщаться Lua или приложением, в которое оно встроено. Если это не так, и функция просто «останавливается», вы отлаживаете слепые, и вы будете тратить много времени на такие проблемы.

Единственная ошибка, которую я могу думать, может произойти в этой строке, если Array2D не является таблицей. Поскольку вы пытаетесь проиндексировать его, это должно быть. Array2D не объявлен в вашей функции, это нормально, если это глобальная переменная, которая уже определена в другом месте. Однако если он равен, он должен быть локальной переменной только для этой функции, тогда вы должны добавить local Array2D = {}.

Не зная, что такое Array2D, или какова ваша фактическая ошибка, трудно дать более точный ответ. Если вы на самом деле нет лучшего способа выяснить проблему, чем лесозаготовки, это, как раз перед линией Array2D, следует проверить свою гипотезу:

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

WOW спасибо, так как lua ​​- такой высокий уровень скриптинга, который я думал, выполнив это Array2D [y] = {}, он также будет объявлен в то же время, просто выполнив локальный Array2D = {} исправил это, спасибо вам большое – Makenshi

+0

Добро пожаловать. Я тоже проголосовал за ответ Мюда, так как его записка об использовании pcall является допустимой - в этом случае вы могли бы получить сообщение об ошибке от Lua. Обычно это зависит от хост-программы, чтобы сделать это для вас. – MattJ

2

Похоже Array2D не инициализируется (или не таблица), так что это крэпс на Array2D[y]={}.

Вы можете использовать pcall, чтобы вызвать функцию и ловушки ошибок, например:

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

Side Примечание: Вы должны использовать ключевое слово local по возможности ограничить область действия переменных.

Смежные вопросы