<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[QUIK -> DDE &mdash; (PrintDbgStr и Lua): Использование функции PrintDbgStr в QLua]]></title>
	<link rel="self" href="https://quik2dde.ru/extern.php?action=feed&amp;tid=108&amp;type=atom" />
	<updated>2015-07-21T21:37:05Z</updated>
	<generator>PunBB</generator>
	<id>https://quik2dde.ru/viewtopic.php?id=108</id>
		<entry>
			<title type="html"><![CDATA[Re: (PrintDbgStr и Lua): Использование функции PrintDbgStr в QLua]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=1494#p1494" />
			<content type="html"><![CDATA[<p>Хороший пример но подобный код я буду использовать для конфига. Да и логирование это на сегодняшний день не самая актуальная тема, оно сейчас мне нужно в основном для отладки скрипта, да и то с появлением&nbsp; PrintDbgStr не сильно актуально. <br />В будущем я обязательно присмотрюсь к СУБД но на сегодня вывод в текст самое то что нужно.<br />И кстати я практически везде где возможно избавился от циклов. Чтение первоисточников помогает.</p>]]></content>
			<author>
				<name><![CDATA[andrv]]></name>
				<uri>https://quik2dde.ru/profile.php?id=279</uri>
			</author>
			<updated>2015-07-21T21:37:05Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=1494#p1494</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: (PrintDbgStr и Lua): Использование функции PrintDbgStr в QLua]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=1486#p1486" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>andrv пишет:</cite><blockquote><div class="quotebox"><cite>kalikazandr пишет:</cite><blockquote><p>if io.type(lf)~=&quot;file&quot; then&nbsp; &nbsp; lf=io.open(file_path,&quot;a+&quot;) end - вдруг выше не получилось открыть файл?</p></blockquote></div><p>как показала практика эта проверка просто необходима <img src="https://quik2dde.ru/img/smilies/smile.png" width="15" height="15" alt="smile" /></p></blockquote></div><p>тем более надо задуматься об открытии потока вывода в начале скрипта и закрытии по окончании его работы, у вас видимо функция в каждом логическом блоке вызывается или еще хуже в цикле, естественно множественные открытия и закрытия потока требуют дополнительные проверки, т.к. есть вероятность, что с прошлой записи поток еще не успел корректно закрыться.<br />Вот удобный пример доработанного кода Ерусалимского:</p><div class="codebox"><pre><code>local base = _G

module(&#039;Serializer&#039;)
-- модуль для сохранения таблицы в файл
-- могут быть сохранены переменные типа число, строка или булевский тип
-- таблица сохраняется в текущий поток вывода
-- если вы хотите, чтобы сохранение производилось в файл,
-- то поток вывода Lua должен быть предварительно настроен, например так:
-- открываем файл для записи данных
-- local f = io.open(&quot;data.lua&quot;, &quot;w&quot;)
-- сохраняем предыдущий поток вывода
-- local prevOutput = io.output()
-- устанавливаем вывод стандартного потока в наш файл
-- io.output(f)
-- сериализация...
-- закрываем файл
-- f:close()
-- восстанавливаем предыдущий поток вывода
-- io.output(prevOutput)
-- ...

-- проверка, что переменная может быть сохранена как строка 
-- т.е это число, строка или булевский тип)
local function isValidType(valueType)
  return &quot;number&quot; == valueType or 
         &quot;boolean&quot; == valueType or 
         &quot;string&quot; == valueType
end

-- конвертация переменной в строку
local function valueToString (value)
    local valueType = base.type(value)
  
    if &quot;number&quot; == valueType or &quot;boolean&quot; == valueType then
        result = base.tostring(value)
    else  -- assume it is a string
    --result = base.string.format(&quot;%q&quot;, value)
        value = base.string.gsub( value, &quot;\n&quot;, &quot;\\n&quot; )
        if base.string.match( base.string.gsub(value,&quot;[^&#039;\&quot;]&quot;,&quot;&quot;), &#039;^&quot;+$&#039; ) then
            return &quot;&#039;&quot; .. value .. &quot;&#039;&quot;
        else
            return &#039;&quot;&#039; .. base.string.gsub(value,&#039;&quot;&#039;, &#039;\\&quot;&#039; ) .. &#039;&quot;&#039;
        end
    end
    return result
end

function save (name, value, saved)
  saved = saved or {}       -- initial value
  base.io.write(name, &quot; = &quot;)
  local valueType = base.type(value)
  if isValidType(valueType) then
    base.io.write(valueToString(value), &quot;\n&quot;)
  elseif &quot;table&quot; == valueType then
    if saved[value] then    -- value already saved?
      base.io.write(saved[value], &quot;\n&quot;)  -- use its previous name
    else
      saved[value] = name   -- save name for next time
      base.io.write(&quot;{}\n&quot;)     -- create a new table
      for k,v in base.pairs(value) do      -- save its fields
        -- добавляем проверку ключа таблицы
        local keyType = base.type(k)
        if isValidType(keyType) then
          local fieldname = base.string.format(&quot;%s[%s]&quot;, name, valueToString(k))
          save(fieldname, v, saved)
        else
          base.error(&quot;cannot save a &quot; .. keyType)
        end
      end
    end
  else
    base.error(&quot;cannot save a &quot; .. valueType)
  end
end</code></pre></div><p>обратите внимание на описание модуля</p>]]></content>
			<author>
				<name><![CDATA[kalikazandr]]></name>
				<uri>https://quik2dde.ru/profile.php?id=208</uri>
			</author>
			<updated>2015-07-20T05:31:11Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=1486#p1486</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: (PrintDbgStr и Lua): Использование функции PrintDbgStr в QLua]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=1484#p1484" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>kalikazandr пишет:</cite><blockquote><p>if io.type(lf)~=&quot;file&quot; then&nbsp; &nbsp; lf=io.open(file_path,&quot;a+&quot;) end - вдруг выше не получилось открыть файл?</p></blockquote></div><p>как показала практика эта проверка просто необходима <img src="https://quik2dde.ru/img/smilies/smile.png" width="15" height="15" alt="smile" /></p>]]></content>
			<author>
				<name><![CDATA[andrv]]></name>
				<uri>https://quik2dde.ru/profile.php?id=279</uri>
			</author>
			<updated>2015-07-19T22:12:03Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=1484#p1484</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: (PrintDbgStr и Lua): Использование функции PrintDbgStr в QLua]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=1477#p1477" />
			<content type="html"><![CDATA[<p>нет функция table2string родная пруф: [url]http://sourceforge.net/projects/qllib/files/?source=navbar[/url]<br />в данном случае скрипт будет один но по куче инструментов, сейчас просто занимаю рефакторингом всего кода.<br />Спасибо за подсказку внесу изменения.</p>]]></content>
			<author>
				<name><![CDATA[andrv]]></name>
				<uri>https://quik2dde.ru/profile.php?id=279</uri>
			</author>
			<updated>2015-07-19T08:08:07Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=1477#p1477</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: (PrintDbgStr и Lua): Использование функции PrintDbgStr в QLua]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=1476#p1476" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>kalikazandr пишет:</cite><blockquote><p>local table2string = function (table) ... end<br />local&nbsp; function table2string&nbsp; (table) ... end<br />идентичны, объявить выше function toLog()</p><p>if type(v)==&quot;string&quot; or type(v)==&quot;number&quot; then - не нужна такая проверка, проверьте на функцию, таблицу, bolean<br />остальное через else - не надо лишний раз type() вызывать.</p><p>из разных скриптов дебаговые записи в один файл? зачем этот геморрой? необходимо дополнительный текст вставлять типа - &quot;робот Вася&quot;, &quot;робот Петя&quot;, что делать если одновременно захотят роботы запись сделать?<br />Если файл общий для нескольких роботов для передачи данных, то лучше БД использовать, на форуме есть примеры БД от уважаемого swerg</p></blockquote></div><p>накосячил с изменениями))</p>]]></content>
			<author>
				<name><![CDATA[kalikazandr]]></name>
				<uri>https://quik2dde.ru/profile.php?id=208</uri>
			</author>
			<updated>2015-07-19T07:59:18Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=1476#p1476</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: (PrintDbgStr и Lua): Использование функции PrintDbgStr в QLua]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=1475#p1475" />
			<content type="html"><![CDATA[<p>local table2string = function (table) ... end<br />local&nbsp; function table2string&nbsp; (table) ... end<br />идентичны, объявить выше function toLog()<br />из разных скриптов дебаговые записи в один файл? зачем этот геморрой? необходимо дополнительный текст вставлять типа - &quot;робот Вася&quot;, &quot;робот Петя&quot;, что делать если одновременно захотят роботы запись сделать?<br />Если файл общий для нескольких роботов для передачи данных, то лучше БД использовать, на форуме есть примеры БД от уважаемого swerg</p>]]></content>
			<author>
				<name><![CDATA[kalikazandr]]></name>
				<uri>https://quik2dde.ru/profile.php?id=208</uri>
			</author>
			<updated>2015-07-19T07:53:14Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=1475#p1475</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: (PrintDbgStr и Lua): Использование функции PrintDbgStr в QLua]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=1474#p1474" />
			<content type="html"><![CDATA[<p>Мне эта строчка показалась тоже подозрительной, но это я оставил на совести разработчиков QL (если эта проверка есть значит здесь может быть ошибка, поэтому я обычно такие проверки в чужом коде не удаляю). <br />По поводу открытия файла в начале скрипта это конечно правильно, но только в том случае если у вас логика в одном скрипте а не разнесена по куче модулей.</p><p>Меня на самом деле смущает другое не будет ли правильней записать функцию table2string следующим образом:<br /></p><div class="codebox"><pre><code>local table2string
table2string = function (table)
    local str
    for k,v in pairs(table) do
        if type(v)==&quot;string&quot; or type(v)==&quot;number&quot; then
            str=str..k..&quot;=&quot;..v..&#039;;&#039;
        elseif type(v)==&quot;table&quot;then
            str=str..k..&quot;={&quot;..table2string(v)..&quot;};&quot;
        elseif type(v)==&quot;function&quot; or type(v)==&#039;boolean&#039; then
            str=str..k..&#039;=&#039;..tostring(v)..&#039;;&#039;
        end
    end
    return str
end</code></pre></div>]]></content>
			<author>
				<name><![CDATA[andrv]]></name>
				<uri>https://quik2dde.ru/profile.php?id=279</uri>
			</author>
			<updated>2015-07-19T06:31:54Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=1474#p1474</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: (PrintDbgStr и Lua): Использование функции PrintDbgStr в QLua]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=1473#p1473" />
			<content type="html"><![CDATA[<p>вот этот участок очень странно выглядит, в духе QL:<br />if lf~=nil then<br />&nbsp; lf.write(tostring(os.date(&quot;%H:%M:%S&quot;)) .. &quot;\t&quot; .. lStr ..&quot;\n&quot;)<br />&nbsp; if io.type(lf)~=&quot;file&quot; then&nbsp; &nbsp; lf=io.open(file_path,&quot;a+&quot;) end<br />&nbsp; &nbsp; lf.flush()<br />&nbsp; if io.type(lf)==&quot;file&quot; then&nbsp; &nbsp; lf:close() end<br />end<br />вот эта строчка у вас что проверяет?<br />if io.type(lf)~=&quot;file&quot; then&nbsp; &nbsp; lf=io.open(file_path,&quot;a+&quot;) end - вдруг выше не получилось открыть файл?</p><p>и следом... if io.type(lf)==&quot;file&quot; then&nbsp; &nbsp; lf:close() end - вдруг после записи он закрылся самостоятельно?</p><p>я не использую логирование, дорогое удовольствие.<br />и уж если предполагаемых записей много, то открыть файл надо при запуске скрипта и закрыть его перед остановкой.</p>]]></content>
			<author>
				<name><![CDATA[kalikazandr]]></name>
				<uri>https://quik2dde.ru/profile.php?id=208</uri>
			</author>
			<updated>2015-07-18T23:06:12Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=1473#p1473</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: (PrintDbgStr и Lua): Использование функции PrintDbgStr в QLua]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=1472#p1472" />
			<content type="html"><![CDATA[<p>вполне возможно я использую это если знаете подскажите посмотрю<br />а table2string(value) там же в либе QL да и у Ееразалимского она описана в общем виде подобные функции выглядят вот так:<br /></p><div class="codebox"><pre><code>local function table2string(table)
    local str
    for k,v in pairs(table) do
        if type(v)==&quot;string&quot; or type(v)==&quot;number&quot; then
            str=str..k..&quot;=&quot;..v..&#039;;&#039;
        elseif type(v)==&quot;table&quot;then
            str=str..k..&quot;={&quot;..table2string(v)..&quot;};&quot;
        elseif type(v)==&quot;function&quot; or type(v)==&#039;boolean&#039; then
            str=str..k..&#039;=&#039;..tostring(v)..&#039;;&#039;
        end
    end
    return str
end</code></pre></div><p>либо так (пример из книги Программирование на lua):<br /></p><div class="codebox"><pre><code>function serialize (o)
    if type(o) == &quot;number&quot; then io.write (o)
    elseif type(o) == &quot;string&quot; then io.write(string.format(&quot;%q&quot;, o))
    elseif type(o) == &quot;table&quot; then
        io.write(&quot;{\n&quot;)
        for k,v in pairs(o) do
            io.write(&quot; &quot;, k, &quot; = &quot;) serialize(v) io.write(&quot;,\n&quot;)
        end
        io.write(&quot;}\n&quot;)
    else
        error(&quot;cannot serialize a &quot; .. type(o))
    end
end</code></pre></div>]]></content>
			<author>
				<name><![CDATA[andrv]]></name>
				<uri>https://quik2dde.ru/profile.php?id=279</uri>
			</author>
			<updated>2015-07-18T22:12:10Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=1472#p1472</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: (PrintDbgStr и Lua): Использование функции PrintDbgStr в QLua]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=1471#p1471" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>andrv пишет:</cite><blockquote><p>Раз уж похоже на мой вопрос нет ответа решил переделать&nbsp; функцию toLog из QL для своих нужд (может кому-нибудь пригодится):</p></blockquote></div><p>а где же функция table2string(value)? )) Есть гораздо более эффективные функции для логирования, чем toLog.</p>]]></content>
			<author>
				<name><![CDATA[kalikazandr]]></name>
				<uri>https://quik2dde.ru/profile.php?id=208</uri>
			</author>
			<updated>2015-07-18T21:53:58Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=1471#p1471</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: (PrintDbgStr и Lua): Использование функции PrintDbgStr в QLua]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=1469#p1469" />
			<content type="html"><![CDATA[<p>Раз уж похоже на мой вопрос нет ответа решил переделать&nbsp; функцию toLog из QL для своих нужд (может кому-нибудь пригодится):<br /></p><div class="codebox"><pre><code>local function toLog(file_path,value, isLog, isDebug, isTest)
    -- запись в лог параметра value
    -- value может быть числом, строкой или таблицей
    -- file_path  -  путь к файлу
    -- файл открывается на дозапись и закрывается после записи строки
    if value~=nil then
        local lStr
        if type(value)==&quot;string&quot; or type(value)==&quot;number&quot; then lStr = value
        elseif type(value)==&#039;boolean&#039; then lStr = tostring(value)
        elseif type(value)==&quot;table&quot; then lStr = table2string(value)
        end
        if file_path~=nil and lStr ~=nil and isLog then
            local lf=io.open(file_path,&quot;a+&quot;)
            if lf~=nil then
                lf.write(tostring(os.date(&quot;%H:%M:%S&quot;)) .. &quot;\t&quot; .. lStr ..&quot;\n&quot;)
                if io.type(lf)~=&quot;file&quot; then    lf=io.open(file_path,&quot;a+&quot;) end
                lf.flush()
                if io.type(lf)==&quot;file&quot; then    lf:close() end
            end
        end
        if isDebug then
            if isTest then
                print(os.date(&quot;%H:%M:%S&quot;) .. &quot; &quot; .. lStr)
            else
                PrintDbgStr(lStr)
            end
        end
    end
end</code></pre></div>]]></content>
			<author>
				<name><![CDATA[andrv]]></name>
				<uri>https://quik2dde.ru/profile.php?id=279</uri>
			</author>
			<updated>2015-07-18T18:33:00Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=1469#p1469</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: (PrintDbgStr и Lua): Использование функции PrintDbgStr в QLua]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=1465#p1465" />
			<content type="html"><![CDATA[<p>Добрый день,<br />насколько я понимаю в самой луа тоже есть функция OutputDebugString только я нигде не нашел доки как еe вызвать. <br />Не подскажите как?</p>]]></content>
			<author>
				<name><![CDATA[andrv]]></name>
				<uri>https://quik2dde.ru/profile.php?id=279</uri>
			</author>
			<updated>2015-07-18T09:55:03Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=1465#p1465</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: (PrintDbgStr и Lua): Использование функции PrintDbgStr в QLua]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=1297#p1297" />
			<content type="html"><![CDATA[<p>-</p>]]></content>
			<author>
				<name><![CDATA[sam063rus]]></name>
				<uri>https://quik2dde.ru/profile.php?id=228</uri>
			</author>
			<updated>2015-04-30T13:22:43Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=1297#p1297</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: (PrintDbgStr и Lua): Использование функции PrintDbgStr в QLua]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=1296#p1296" />
			<content type="html"><![CDATA[<p>[url=https://quik2dde.ru/viewtopic.php?id=151]Обсуждение записи логов в файл(ы) вынесено в отдельную тему[/url]</p>]]></content>
			<author>
				<name><![CDATA[admin]]></name>
				<uri>https://quik2dde.ru/profile.php?id=2</uri>
			</author>
			<updated>2015-04-30T12:35:15Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=1296#p1296</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: (PrintDbgStr и Lua): Использование функции PrintDbgStr в QLua]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=692#p692" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>swerg пишет:</cite><blockquote><p>Спасибо за результаты и эксперимент!<br />Это замеры при условии запущенного DebugView или нет?</p></blockquote></div><p>Да, форма VCL, окно DebugView и окно сообщений QUIK были запущены. Визуально в окна DebugView и VCL строки выводились в реал-тайме, окно сообщений QUIK &quot;молчало&quot; и выплюнуло все в конце одним разом. ) Наверное потому что прерывания в основном потоке небыло.</p>]]></content>
			<author>
				<name><![CDATA[GREEN_X5]]></name>
				<uri>https://quik2dde.ru/profile.php?id=206</uri>
			</author>
			<updated>2014-11-18T18:07:27Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=692#p692</id>
		</entry>
</feed>
