OnOrder выдает ошибку

Страницы: 1
RSS
OnOrder выдает ошибку
 
Добрый вечер, я вставляю в код следующую функцию:

function OnOrder(order)
  message("Цена "..tostring(order.price));-- NUMBER  
end

При компиляции выдается ошибка:

attempt to index local 'order' (a nil value)

Что написано не так? Спасибо.  
 
Вы пишите скрипт или индикатор?
 
Я пока что просто тестирую функцию, что бы она хоть что-то выдавала. А в будущем хочу ее засунуть в скрипт.
Код
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
 
А ошибку Вы получаете потому, что у Вас вызов функции происходит до ее описания
Попробуйте изучить Lua.
 
yves1,
Ошибка, которую вы получили
Цитата
attempt to index local 'order' (a nil value)
означает, что индексация через точку локальной переменной 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 с параметрами или без не спасает от этой ошибки.
 
относительно объявления глобальных переменных в любом месте неверно.
вот пример:
print(x)
x=10
результат nil
 
Уважаемый,
Цитата
Все что я написал - есть правда.
Всё, что вы написали, есть ваша правда. Попрошу вас в дальнейшем быть более точным в высказываниях.
Цитата
Ошибка в том, что переменная 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)
Страницы: 1
Читают тему
Наверх