Запись в таблицу - вопрос.

Страницы: 1
RSS
Запись в таблицу - вопрос.
 
Здравствуйте,

Немного запутался, подскажите пожалуйста, почему при срабатывании условия If then, в 1 строку созданной таблицы не записывается заданный текст ?
Код
function main()

CreateTable();

   while is_run do
       sleep(1000)

 end

 end
--------------------------------------------------------------------------------------
 --Функция создания таблицы: Начало

function CreateTable()

t_id = AllocTable();

AddColumn(t_id, 0, "Код Бумаги", true, QTABLE_INT_TYPE, 15)
AddColumn(t_id, 1, "Условие", true, QTABLE_INT_TYPE, 15)
AddColumn(t_id, 2, "Статус", true, QTABLE_INT_TYPE, 15)
AddColumn(t_id, 3, "Время", true, QTABLE_INT_TYPE, 15)
AddColumn(t_id, 4, "Цена", true, QTABLE_INT_TYPE, 15)


t = CreateWindow(t_id); 

SetWindowCaption(t_id, "Таблица"); 

for i=0, 3, 1 do
InsertRow(t_id, -1); 


end; 

end
 --Функция создания таблицы: Конец
------------------------------------------------------------------------

local G1=getNumCandles("GAZP_Price")
q,g,w1=getCandlesByIndex("GAZP_Pricet", 0, G1-2, 2)
GAZP_Price_now = q[0].close

GAZP_Price_condition=0

if GAZP_Price_now => GAZP_Price_condition then

message("Условие сработало",1)

SetCell(t_id, 1, 1, "текст1")
SetCell(t_id, 1, 2, "текст2")
SetCell(t_id, 1, 3, "текст3")

end
 
Для начала, уточните для себя базовые принципы работы lua-интерпретатора.

Присвоение переменных G1, q, g и т.д., а также блок if..then..end у Вас находятся в теле (body) модуля.
Все эти команды выполняются интерпретатором один раз при первом проходе исходного текста текущего модуля lua, т.е. на этапе, когда интерпретатор даже не заглядывает внутрь текста описанных в модуле функций, а только запоминает адреса их входных точек (другими словами, на этом этапе интерпретатор лишь присваивает глобальным переменным main и CreateTable адрес соответствующей функции, но, повторюсь, внутрь функций он при этом не заглядывает).

Таким образом, Ваш блок if..then..end, находящийся в body модуля, выполняется интерпретатором один раз еще даже до вызова OnInit, не говоря уж об main.
 
То есть, когда в данном случае выполнилось условие If then, сама таблица t_id по сути еще не создана ?
 
А при каком тогда заходе интерпретатор заглянет внутрь функции ?
 
Цитата
Optimus1 Optimus1 написал:
То есть, когда в данном случае выполнилось условие If then, сама таблица t_id по сути еще не создана ?
Да

Цитата
Optimus1 Optimus1 написал:
А при каком тогда заходе интерпретатор заглянет внутрь функции ?
В общем случае: тогда, когда интерпретатор встретит команду собственно вызова этой функции (main(), CreateTable() и т.п.). Вызов самой первой функции программы делается из тела (body) стартового модуля. Далее команды вызовов функций будут уже отрабатываться по мере нахождения их интерпретатором внутри текущей исполняемой функции.

В QLua: для Quik Вы пишете не самостоятельную (имеющую собственную точку старта) программу, а лишь описание набора колбеков, которые QUIK по мере необходимости будет вызывать.
На стартовом проходе интерпретатор QLua выполняет инструкции body вашего модуля только лишь для того, чтобы в результате получить в глобальных переменных с зарезервированными именами (OnInit, main, OnStop, OnOrder и т.д) адреса написанных Вами функций-колбэков. Если QLua в результате не получит в переменной main адреса функции, то на этом все и закончится. Остальные зарезервированные функции определять не обязательно. Потом он вызовет OnInit(), если найдет там адрес функции (в Вашем случае вызова не будет, т.к. у Вас эта функция не описана). Далее Quik создаст отдельный поток для Вашего скрипта, из которого вызовет main(). В своем потоке Quik, по мере необходимости, будет вызывать остальные ваши колбеки, и т.д.

Может быть Вам проще будет понять действия интерпретатора, если Вы внимательно изучите синтаксис Lua.
Дело в том, что в исходном синтаксисе Lua нет такого такой команды:
function myCode()
...
end
Такая запись - это так называемый синтаксический "сахар", упрощение записи инструкций для приведения их к более привычному для программиста виду.
Реально, до начал интерпретации, эта запись преобразуется к виду:
myCode = function()
...
end
И тогда становится ясно, что интерпретатору, встретив такую инструкцию, просто незачем лезть внутрь тела функции. Вы же всего лишь поручили ему запомнить адрес функции в переменной myCode.

И таких синтаксических "сахаров" в Lua не мало. Изучите их, и писать программу сразу станет проще.
 
Огромнейшее спасибо за ответ!
Страницы: 1
Читают тему
Наверх