Я пока что просто тестирую функцию, что бы она хоть что-то выдавала. А в будущем хочу ее засунуть в скрипт.
Код
is_run=true
function main()
while is_run do
OnOrder()
sleep(50)
end
end
function OnOrder(order)
message("Цена "..tostring(order.order_num));
end
function OnStop(stop_flag)
is_run=false
stop_flag=1
end
Нельзя колбек вставлять в main попробуйте разобраться с назначением колбеков и main. Так НЕЛЬЗЯ: function main() while is_run do OnOrder() sleep(50) end end
означает, что индексация через точку локальной переменной order (в вашем случае -- параметра функции) невожможна, потому что order имеет значение nil. Происходит это потому, что вы вызываете OnOrder() из main без параметров. Lua никак не контролирует число параметров при вызове функций: если их меньше чем нужно, то недостающие примут значение nil (так, например, параметр order функции OnOrder принимает значение nil при вызове OnOrder() в вашем примере), если их больше чем нужно, то лишние параметры игнорируются. После такой ошибки происходит генерация исключения в lua и, выход из кода функции OnOrder, а затем и из main, т.к. код по перехвату исключений у вас отсутствует. После выхода из main (любого: с ошибкой или без) происходит выгрузка скрипта.
Ваша ошибка заключается в том, что вы вызываете OnOrder без параметров из main. OnOrder вызывается терминалом при регистрации заявки. Вызывать её явно, обычно, не имеет смысла. Советую также обратить внимание на то, что код в main и код callback'ов OnOrder, OnTrade... выполняется параллельно. Этот факт обязательно нужно учитывать при передаче параметров через глобальные переменные из callback'ов в main и обратно. Николай Камынин,
Цитата
А ошибку Вы получаете потому, что у Вас вызов функции происходит до ее описания Попробуйте изучить Lua.
Пожалуйста, не надо вводить человека в заблуждение. Объявление глобальных функций в Lua возможно в любом порядке, т.к. после загрузки скрипта сначала производится его выполнение (выполняется весь код вне функций и объявление функций), и лишь затем терминалом вызывается main и остальные callback'и. Как, например, OnOrder в примере кода выше.
Вячеслав, Все что я написал - есть правда. Но причину ошибки я указал неверно. Вы тоже неверно указали причину ошибки. ------------------- Ошибка в том, что переменная order не содержит элемента order_num Поэтому вызов функции onOrder с параметрами или без не спасает от этой ошибки.
Всё, что вы написали, есть ваша правда. Попрошу вас в дальнейшем быть более точным в высказываниях.
Цитата
Ошибка в том, что переменная order не содержит элемента order_num Поэтому вызов функции onOrder с параметрами или без не спасает от этой ошибки.
Вызов
Код
OnOrder({})
будет вполне нормальным, как и такой код
Код
t = {};
message(tostring(t.order_num));
так как индексация в Lua доступна всегда для таблиц и часто для типа userdata. В остальных случаях вы получите похожую ошибку с указанием типа. Однако, если для типа указана метатаблица, то возможно и его индексирование. Пример:
Код
a = ("test").sub;
message(tostring(a));
Замечу, что указание метатаблицы для типов кроме table и userdata возможно только из Си кода с помощью метода lua_setmetatable и никак из Lua.
Цитата
относительно объявления глобальных переменных в любом месте неверно. вот пример: print(x) x=10 результат nil
В таком примере вы правильно показали, что использование переменной в качестве аргумента функции перед присваиванием ей значения, приводит к ожидаемому результату - она имеет внутри функции значение nil. Но это ли я имел ввиду? Когда по вашему будут использоваться объявления функций? Возьмём такой код.
Код
function main()
test1();
end
function test1()
test2();
end
function test2()
message("Test message");
end
Здесь, например, функция test2 используется перед её объявлением. Однако такой код работает, и происходит это потому, что функция main вызывается (из Си кода терминала Quik) после интерпретации всего Lua-файла.
Даже такой код будет работать с тем же эффектом:
Код
function main()
test2 = function()
message("Test message");
end
test1();
end
function test1()
test2();
end
Для тех, кому интересно как работает Lua снаружи и изнутри, рекомендую книгу Roberto Ierusalimschy "Programming in Lua" (2013)