<?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; Lua и С++, ошибка]]></title>
		<link>https://quik2dde.ru/viewtopic.php?id=90</link>
		<atom:link href="https://quik2dde.ru/extern.php?action=feed&amp;tid=90&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «Lua и С++, ошибка».]]></description>
		<lastBuildDate>Sat, 22 Mar 2014 00:16:13 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: Lua и С++, ошибка]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=550#p550</link>
			<description><![CDATA[<p>Разобрался все-таки. Адский трэш. Оказывается, все дело в том, что Lua здесь не любит ключи типа строка!<br />Массив, видимо, специально никто не нумеровал и ключи были созданы автоматически. А может, причина в чем-то еще.<br />Пришлось сделать так:</p><div class="codebox"><pre><code>byte cc=0;
lua_pushnil(L);
while (lua_next(L, 1) != 0) // этот цикл выполняется 4 раза, по кол-ву элементов
{                           // поля идут в порядке списка из документации
     int i=0;
     hh = luaL_checklstring(L, 2, &amp;argLen); // здесь лежит ключ
     switch (cc) 
     {
       case 0: ss.bid_count   = atoi(luaL_checklstring(L, 3, &amp;argLen));break;
       case 1: ss.offer_count = atoi(luaL_checklstring(L, 3, &amp;argLen));break;
       case 2: // bid
             lua_pushnil(L);
             while (lua_next(L, 3) != 0)
             {
                 i++;  
                 hh = luaL_checklstring(L, 4, &amp;argLen); // здесь лежит ключ
                                
                         /* обработка вложенных таблиц */              

                                        //  достаем не только значение, но и ключ, 
                 lua_pop(L,2);          //  который положила в стек lua_next
                 lua_pushinteger(L,i);  //  здесь кладем в стек ключ типа integer собственноручно
              }     
              break;
        case 3: // offer
            
     }    
     lua_pop(L,1);
     cc++;
}
lua_pop(L,1);</code></pre></div><p>Выравнивание стека, конечно же, изменилось, пришлось отступать от хрестоматийных вещей и все внимательно<br />смотреть. В коде есть комментарии.</p>]]></description>
			<author><![CDATA[null@example.com (Delv)]]></author>
			<pubDate>Sat, 22 Mar 2014 00:16:13 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=550#p550</guid>
		</item>
		<item>
			<title><![CDATA[Re: Lua и С++, ошибка]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=549#p549</link>
			<description><![CDATA[<p>переписал блок с использованием положительных индексов:</p><div class="codebox"><pre><code> lua_pushnil(L);
 while (lua_next(L, 1) != 0) // этот цикл выполняется 4 раза, по кол-ву элементов
 {                                        // поля идут в порядке списка из документации по getQuoteLevel2
                
     std::string hh = luaL_checklstring(L, 2, &amp;argLen); // здесь лежит ключ

     switch (cc) {

       case 0: ss.bid_count   = atoi( ((std::string)luaL_checklstring(L, 3, &amp;argLen)).c_str() ); break;
       case 1: ss.offer_count = atoi( ((std::string)luaL_checklstring(L, 3, &amp;argLen)).c_str() ); break;
       case 2:
                    lua_pushnil(L);
                    while (lua_next(L, 3) != 0)
                    {
                         std::string hh = luaL_checklstring(L, 4, &amp;argLen); // здесь лежит ключ


                         lua_pop(L,1);
                     }
                     lua_pop(L,1);
                     break;

       case 3:
                     break;
     }            

                     lua_pop(L,1);
                 cc++;
}
       lua_pop(L,1);</code></pre></div><p>Расчертил на бумажке движения стека. В теории все должно быть правильно. На практике все та же ошибка на второй итерации в case 2.</p>]]></description>
			<author><![CDATA[null@example.com (Delv)]]></author>
			<pubDate>Fri, 21 Mar 2014 19:14:45 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=549#p549</guid>
		</item>
		<item>
			<title><![CDATA[Re: Lua и С++, ошибка]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=547#p547</link>
			<description><![CDATA[<p>Я не проверял у себя ваш код, но на сколько помню, ошибка вот в чем.<br />Вот здесь вы обращаетесь по относительному индексу с конца<br />while (lua_next(L, -2) != 0)</p><p>но вот здесь у вас на самом деле происходит изменение стека<br />lua_pop(L, 1);</p><p>и индекс -2 - уже не подходит.</p><p>Вот в этом проектике здесь я с подобной бедой сталкивался<br />[url]http://quik2dde.ru/viewtopic.php?id=61[/url]<br />и, помнится, просто перешел на положительный индекс, где уже постоянно и на самом деле лежит итерируемая таблица.</p><p>Думать как надо вам поменять код мне сейчас лень, посмотрите исходники по приведённой ссылке.<br />Если получится - напишите что поправили.<br />Если не получится понять - тоже напишите, тогда уже буду мозг напрягать, вспоминать )</p>]]></description>
			<author><![CDATA[null@example.com (swerg)]]></author>
			<pubDate>Fri, 21 Mar 2014 17:20:50 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=547#p547</guid>
		</item>
		<item>
			<title><![CDATA[Lua и С++, ошибка]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=546#p546</link>
			<description><![CDATA[<p>Здравствуйте!<br />Внутри подключаемой из Lua dll есть вот такая функция на C:</p><div class="codebox"><pre><code>static int forLua_OnQuote(lua_State *L)
{
    const char *argClass = NULL;
        size_t argClassLen = 0;

    const char *argSec = NULL;  
        size_t argSecLen = 0;
    
    argClass = luaL_checklstring(L, 1, &amp;argClassLen);
    argSec = luaL_checklstring(L, 2, &amp;argSecLen);

    stack ss;

    if( strcmp(argClass,&quot;SPBFUT&quot;)==0 &amp;&amp; strcmp(argSec,&quot;RIM4&quot;)==0)
    {
        lua_settop(L,0);
        lua_getfield (L, LUA_GLOBALSINDEX, &quot;getQuoteLevel2&quot;);
        lua_pushstring (L, argClass);
                lua_pushstring (L, argSec);

        int r = lua_pcall (L, 2 /* num args */, 1 /* num res */, 0);
                if (r==0)
                {
                                //успешный вызов, в стеке таблица
                    size_t argLeng = 0; 
                byte cc=0;

                lua_pushnil(L);
                while (lua_next(L, -2) != 0)
                {
                    std::string k1 = luaL_checklstring(L, -2, &amp;argLeng); // здесь лежит ключ (bid_count, offer_count, bid, offer)

                    switch (cc) {

                    case 0: ss.bid_count   = atoi( ((std::string)luaL_checklstring(L, -1, &amp;argLeng)).c_str() ); break;
                    case 1: ss.offer_count = atoi( ((std::string)luaL_checklstring(L, -1, &amp;argLeng)).c_str() ); break;
                    case 2: // здесь идет обработка вложенной таблицы bid
                            lua_pushnil(L);
                            while (lua_next(L, -2) != 0) //!!!!!!! при второй итерации здесь возникает ошибка:
                            {                            //!!!!!!! lua invalid key to &#039;next&#039; 
                                 
                                 std::string k2 = luaL_checklstring(L, -2, &amp;argLeng); // здесь лежит ключ, по -1 лежит значение

                                 lua_pop(L, 1);
                            }
                            lua_pop(L, 1);
                            break;
                    case 3: // здесь должна быть обработка вложенной таблицы offer
                            break;
                    }

                    lua_pop(L, 1);
                    cc++;
                }
                lua_pop(L, 1);
        }
        else
        {
            //какая-то ошибка при вызове getQuoteLevel2
            MsgToQuik(L, (char *)lua_tostring (L, -1));
        }
    }

    return(1);
}</code></pre></div><br /><p>В Lua она регистрируется как коллбэк OnQuote. При попытке пройтись по массиву bid на второй итерации возникает ошибка(<strong>lua invalid key to &#039;next&#039;</strong>), хотя первую пару ключ/значение цикл видит верно. Ключ: &quot;1&quot;, значение: &quot;таблица&quot;. Если погрузиться ниже, в bid[1], то видит оба ключа и оба значения. Если не погружаться во вложенные таблицы, а пройтись только по первой, в которой всего 4 значения, то тоже все хорошо. В чем я тут неправ, откуда ошибка? Подскажите пожалуйста.</p>]]></description>
			<author><![CDATA[null@example.com (Delv)]]></author>
			<pubDate>Fri, 21 Mar 2014 13:08:07 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=546#p546</guid>
		</item>
	</channel>
</rss>
