<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[QUIK -> DDE &mdash; (PrintDbgStr и Lua): Использование функции PrintDbgStr в QLua]]></title>
		<link>https://quik2dde.ru/viewtopic.php?id=108</link>
		<atom:link href="https://quik2dde.ru/extern.php?action=feed&amp;tid=108&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «(PrintDbgStr и Lua): Использование функции PrintDbgStr в QLua».]]></description>
		<lastBuildDate>Tue, 21 Jul 2015 21:37:05 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: (PrintDbgStr и Lua): Использование функции PrintDbgStr в QLua]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=1494#p1494</link>
			<description><![CDATA[<p>Хороший пример но подобный код я буду использовать для конфига. Да и логирование это на сегодняшний день не самая актуальная тема, оно сейчас мне нужно в основном для отладки скрипта, да и то с появлением&nbsp; PrintDbgStr не сильно актуально. <br />В будущем я обязательно присмотрюсь к СУБД но на сегодня вывод в текст самое то что нужно.<br />И кстати я практически везде где возможно избавился от циклов. Чтение первоисточников помогает.</p>]]></description>
			<author><![CDATA[null@example.com (andrv)]]></author>
			<pubDate>Tue, 21 Jul 2015 21:37:05 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=1494#p1494</guid>
		</item>
		<item>
			<title><![CDATA[Re: (PrintDbgStr и Lua): Использование функции PrintDbgStr в QLua]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=1486#p1486</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (kalikazandr)]]></author>
			<pubDate>Mon, 20 Jul 2015 05:31:11 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=1486#p1486</guid>
		</item>
		<item>
			<title><![CDATA[Re: (PrintDbgStr и Lua): Использование функции PrintDbgStr в QLua]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=1484#p1484</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (andrv)]]></author>
			<pubDate>Sun, 19 Jul 2015 22:12:03 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=1484#p1484</guid>
		</item>
		<item>
			<title><![CDATA[Re: (PrintDbgStr и Lua): Использование функции PrintDbgStr в QLua]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=1477#p1477</link>
			<description><![CDATA[<p>нет функция table2string родная пруф: [url]http://sourceforge.net/projects/qllib/files/?source=navbar[/url]<br />в данном случае скрипт будет один но по куче инструментов, сейчас просто занимаю рефакторингом всего кода.<br />Спасибо за подсказку внесу изменения.</p>]]></description>
			<author><![CDATA[null@example.com (andrv)]]></author>
			<pubDate>Sun, 19 Jul 2015 08:08:07 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=1477#p1477</guid>
		</item>
		<item>
			<title><![CDATA[Re: (PrintDbgStr и Lua): Использование функции PrintDbgStr в QLua]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=1476#p1476</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (kalikazandr)]]></author>
			<pubDate>Sun, 19 Jul 2015 07:59:18 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=1476#p1476</guid>
		</item>
		<item>
			<title><![CDATA[Re: (PrintDbgStr и Lua): Использование функции PrintDbgStr в QLua]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=1475#p1475</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (kalikazandr)]]></author>
			<pubDate>Sun, 19 Jul 2015 07:53:14 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=1475#p1475</guid>
		</item>
		<item>
			<title><![CDATA[Re: (PrintDbgStr и Lua): Использование функции PrintDbgStr в QLua]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=1474#p1474</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (andrv)]]></author>
			<pubDate>Sun, 19 Jul 2015 06:31:54 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=1474#p1474</guid>
		</item>
		<item>
			<title><![CDATA[Re: (PrintDbgStr и Lua): Использование функции PrintDbgStr в QLua]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=1473#p1473</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (kalikazandr)]]></author>
			<pubDate>Sat, 18 Jul 2015 23:06:12 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=1473#p1473</guid>
		</item>
		<item>
			<title><![CDATA[Re: (PrintDbgStr и Lua): Использование функции PrintDbgStr в QLua]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=1472#p1472</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (andrv)]]></author>
			<pubDate>Sat, 18 Jul 2015 22:12:10 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=1472#p1472</guid>
		</item>
		<item>
			<title><![CDATA[Re: (PrintDbgStr и Lua): Использование функции PrintDbgStr в QLua]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=1471#p1471</link>
			<description><![CDATA[<div class="quotebox"><cite>andrv пишет:</cite><blockquote><p>Раз уж похоже на мой вопрос нет ответа решил переделать&nbsp; функцию toLog из QL для своих нужд (может кому-нибудь пригодится):</p></blockquote></div><p>а где же функция table2string(value)? )) Есть гораздо более эффективные функции для логирования, чем toLog.</p>]]></description>
			<author><![CDATA[null@example.com (kalikazandr)]]></author>
			<pubDate>Sat, 18 Jul 2015 21:53:58 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=1471#p1471</guid>
		</item>
		<item>
			<title><![CDATA[Re: (PrintDbgStr и Lua): Использование функции PrintDbgStr в QLua]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=1469#p1469</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (andrv)]]></author>
			<pubDate>Sat, 18 Jul 2015 18:33:00 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=1469#p1469</guid>
		</item>
		<item>
			<title><![CDATA[Re: (PrintDbgStr и Lua): Использование функции PrintDbgStr в QLua]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=1465#p1465</link>
			<description><![CDATA[<p>Добрый день,<br />насколько я понимаю в самой луа тоже есть функция OutputDebugString только я нигде не нашел доки как еe вызвать. <br />Не подскажите как?</p>]]></description>
			<author><![CDATA[null@example.com (andrv)]]></author>
			<pubDate>Sat, 18 Jul 2015 09:55:03 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=1465#p1465</guid>
		</item>
		<item>
			<title><![CDATA[Re: (PrintDbgStr и Lua): Использование функции PrintDbgStr в QLua]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=1297#p1297</link>
			<description><![CDATA[<p>-</p>]]></description>
			<author><![CDATA[null@example.com (sam063rus)]]></author>
			<pubDate>Thu, 30 Apr 2015 13:22:43 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=1297#p1297</guid>
		</item>
		<item>
			<title><![CDATA[Re: (PrintDbgStr и Lua): Использование функции PrintDbgStr в QLua]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=1296#p1296</link>
			<description><![CDATA[<p>[url=https://quik2dde.ru/viewtopic.php?id=151]Обсуждение записи логов в файл(ы) вынесено в отдельную тему[/url]</p>]]></description>
			<author><![CDATA[null@example.com (admin)]]></author>
			<pubDate>Thu, 30 Apr 2015 12:35:15 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=1296#p1296</guid>
		</item>
		<item>
			<title><![CDATA[Re: (PrintDbgStr и Lua): Использование функции PrintDbgStr в QLua]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=692#p692</link>
			<description><![CDATA[<div class="quotebox"><cite>swerg пишет:</cite><blockquote><p>Спасибо за результаты и эксперимент!<br />Это замеры при условии запущенного DebugView или нет?</p></blockquote></div><p>Да, форма VCL, окно DebugView и окно сообщений QUIK были запущены. Визуально в окна DebugView и VCL строки выводились в реал-тайме, окно сообщений QUIK &quot;молчало&quot; и выплюнуло все в конце одним разом. ) Наверное потому что прерывания в основном потоке небыло.</p>]]></description>
			<author><![CDATA[null@example.com (GREEN_X5)]]></author>
			<pubDate>Tue, 18 Nov 2014 18:07:27 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=692#p692</guid>
		</item>
	</channel>
</rss>
