Средства разработки многопоточных скриптов в QUIK.

Страницы: Пред. 1 2 3 4 5 6 След.
RSS
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Nikolay
Цитата
Не стесняетесь пользоваться http://lua-users.org/wiki/SampleCode, раздел Serialization.
Полистал. Не увидел вообще ничего, заслуживающего внимания. Я что-то пропутил?
 
Цитата
s_mike@rambler.ru написал:
в первом примере не раскрыто содержимое таблицы, являющеся ключом. Сериализация это подразумевает. Таблица ключа может содержать вложенные таблицы, которые также должны быть раскрыты.
   Я при описании dump_tbl ни разу не упоминал про сериализацию и в этой функции ключи типа table, userdata и function не раскрываются. Для них выдается их служебный код (ссылка).

Цитата
s_mike@rambler.ru написал:
во втором случае результат явно неверен. "a" и "a\0b" - совершенно разные строки.
   Так как символ \0 в Lua это признак завершения строки, то для Lua "a" и "a\0b" - эквивалентные строки.

Цитата
s_mike@rambler.ru написал:
в третьем случае 1.#inf не является допустимым числом lua. Это всего лишь нерегламентированное внутреннее представление, которое не может попадать в результат.
   Результат 1.#inf выдает Lua и я не собираюсь переделывать его.
 
Такой код не должен вызывать затруднений.
Код
local function escape ( s )
    s = tostring ( s ):gsub ( "\n", "\\n" )
    return s
end
local function dumpstr ( t, alias, seen )
    seen = seen or { }
    if seen[ t ] then return "" else seen[ t ] = true end
    local s, mt = string.format ( "newtable %s\n", alias[ t ] or escape ( t ) ), getmetatable ( t )
    if mt then s = string.format ( "%smetatable %s\n", s, alias[ mt ] or escape ( mt ) ) end
    for k, v in pairs ( t ) do
        s = string.format ( "%sk %s %s\nv %s %s\n", s, type ( k ), alias[ k ] or escape ( k ), type ( v ), alias[ v ] or escape ( v ) )
    end
    if mt then s = string.format ( "%s%s", s, dumpstr ( mt, alias, seen ) ) end
    for k, v in pairs ( t ) do
        if type ( k ) == 'table' then s = string.format ( "%s%s", s, dumpstr ( k, alias, seen ) ) end
        if type ( v ) == 'table' then s = string.format ( "%s%s", s, dumpstr ( v, alias, seen ) ) end
    end
    return s
end
local function dumpfile ( file, t, alias, seen )
    seen = seen or { }
    if seen[ t ] then return else seen[ t ] = true end
    file:write ( string.format ( "newtable %s\n", alias[ t ] or escape ( t ) ) )
    local mt = getmetatable ( t )
    if mt then file:write ( string.format ( "metatable %s\n", alias[ mt ] or escape ( mt ) ) ) end
    for k, v in pairs ( t ) do
        file:write ( string.format ( "k %s %s\nv %s %s\n", type ( k ), alias[ k ] or escape ( k ), type ( v ), alias[ v ] or escape ( v ) ) )
    end
    if mt then dumpfile ( file, mt, alias, seen ) end
    for k, v in pairs ( t ) do
        if type ( k ) == 'table' then dumpfile ( file, k, alias, seen ) end
        if type ( v ) == 'table' then dumpfile ( file, v, alias, seen) end
    end
end

Код
local function unescape ( s )
    s = s:gsub ( "\\n", "\n" )
    return s
end
local function loadstr ( s, alias )
    do local t = { } for k, v in pairs ( alias ) do t[ v ] = k end alias = t end
    local tlist, tcurr, kcurr, troot = { }, nil, nil, nil
    for l in s:gmatch ( "([^\n]+)\n" ) do
        local nt = l:match ( "newtable (.+)" )
        local mt = l:match ( "metatable (.+)" )
        local kt, k = l:match ( "k ([^ ]+) (.+)" )
        local vt, v = l:match ( "v ([^ ]+) (.+)" )
        if nt     then tlist[ nt ] = tlist[ nt ] or alias[ nt ] or { }; tcurr = tlist[ nt ]; troot = troot or tcurr
        elseif mt then tlist[ mt ] = tlist[ mt ] or alias[ nt ] or { }; setmetatable ( tcurr, tlist[ mt ] )
        elseif k then
            if     kt == 'table' then tlist[ k ] = tlist[ k ] or alias[ k ] or { }; kcurr = tlist[ k ]
            elseif kt == 'number' then kcurr = alias[ k ] or tonumber ( k )
            elseif kt == 'string' then kcurr = alias[ k ] or unescape ( k )
            else kcurr = alias[ k ]
            end
        elseif v and tcurr and kcurr ~= nil then
            if     vt == 'table' then tlist[ v ] = tlist[ v ] or alias[ v ] or { }; tcurr[ kcurr ] = tlist[ v ]
            elseif vt == 'number' then tcurr[ kcurr ] = alias[ v ] or tonumber ( v )
            elseif vt == 'string' then tcurr[ kcurr ] = alias[ v ] or unescape ( v )
            else tcurr[ kcurr ] = alias[ v ]
            end
        end
    end
    return troot
end
Выгрузка таких вещей как функции (особенно встроенные) и юзердата не предусмотрено, так что надо передавать список строковых псевдонимов в формате { ["math.max"] = math.max, ["getUniqueID"] = getUniqueID, ... }.
 
Цитата
TGB написал:

Цитата
s_mike@rambler.ru написал:
во втором случае результат явно неверен. "a" и "a\0b" - совершенно разные строки.
    Так как символ \0 в Lua это признак завершения строки, то для Lua "a" и "a\0b" - эквивалентные строки.
Lua использует бинарные строки с указанной длиной. Указанные строки - разные, и Lua будет их считать разными; при выгрузке в файл значения разные (и совпадающие со входящими). То что они отобразились одинаково это вероятно из-за того, что в используемом терминале используется С стандарт строк с нуль-терминатором.
 
Цитата


Цитата
s_mike@rambler.ru написал:
во втором случае результат явно неверен. "a" и "a\0b" - совершенно разные строки.
    Так как символ \0 в Lua это признак завершения строки, то для Lua "a" и "a\0b" - эквивалентные строки.

вот даже так?

print(string.len("a"))
print(string.len("a\0b"))

вообще то это самые базовые вещи.
www.bot4sale.ru        t.me/bot4sale
 
Цитата
s_mike@rambler.ru написал:
print(string.len("a"))
print(string.len("a\0b"))
Код
13
Повторяюсь - строки в Lua бинарные. Текст они не различают вообще, все строковые функции работают по отдельным байтам.
 
Немного доработанный код. Вроде справляется со всем, включая NaN. Все виды кодировок текста совместимые с ASCII должны работать без проблем. После загрузки всех модулей надо вызвать addalias() чтобы подцепить все функции, что не добавилось - добавить вручную. Для дампа есть вариант сразу в файл на случай если у вас данные на несколько гигабайт. Велосипед под лицензией MIT, берите-катайтесь.

TGB, выгружает _G в строку за 10 мсек, в файл за 2 мсек.

Код
local aliases = { }

local function escape ( s )
    s = tostring ( s ):gsub ( "\n", "\\n" )
    return s
end
local function dumpstr ( t, alias, seen )
    alias, seen = alias or aliases, seen or { }
    if seen[ t ] then return "" else seen[ t ] = true end
    local s, mt = string.format ( "newtable %s\n", alias[ t ] or escape ( t ) ), getmetatable ( t )
    if mt then s = string.format ( "%smetatable %s\n", s, alias[ mt ] or escape ( mt ) ) end
    for k, v in pairs ( t ) do
        s = string.format ( "%sk %s %s\nv %s %s\n", s, type ( k ), alias[ k ] or escape ( k ), type ( v ), alias[ v ] or escape ( v ) )
    end
    if mt then s = string.format ( "%s%s", s, dumpstr ( mt, alias, seen ) ) end
    for k, v in pairs ( t ) do
        if type ( k ) == 'table' then s = string.format ( "%s%s", s, dumpstr ( k, alias, seen ) ) end
        if type ( v ) == 'table' then s = string.format ( "%s%s", s, dumpstr ( v, alias, seen ) ) end
    end
    return s
end
local function dumpfile ( file, t, alias, seen )
    alias, seen = alias or aliases, seen or { }
    if seen[ t ] then return else seen[ t ] = true end
    local mt = getmetatable ( t )
    file:write ( string.format ( "newtable %s\n", alias[ t ] or escape ( t ) ) )
    if mt then file:write ( string.format ( "metatable %s\n", alias[ mt ] or escape ( mt ) ) ) end
    for k, v in pairs ( t ) do
        file:write ( string.format ( "k %s %s\nv %s %s\n", type ( k ), alias[ k ] or escape ( k ), type ( v ), alias[ v ] or escape ( v ) ) )
    end
    if mt then dumpfile ( file, mt, alias, seen ) end
    for k, v in pairs ( t ) do
        if type ( k ) == 'table' then dumpfile ( file, k, alias, seen ) end
        if type ( v ) == 'table' then dumpfile ( file, v, alias, seen) end
    end
end

local function unescape ( s )
    s = s:gsub ( "\\n", "\n" )
    return s
end
local function loadstr ( s, alias )
    alias = alias or aliases
    do local t = { } for k, v in pairs ( alias ) do t[ v ] = k end alias = t end
    local tlist, tcurr, kcurr, troot = { }, nil, nil, nil
    for l in s:gmatch ( "([^\n]+)\n" ) do
        local nt = l:match ( "newtable (.+)" )
        local mt = l:match ( "metatable (.+)" )
        local kt, k = l:match ( "k ([^ ]+) (.+)" )
        local vt, v = l:match ( "v ([^ ]+) (.+)" )
        if nt     then tlist[ nt ] = tlist[ nt ] or alias[ nt ] or { }; tcurr = tlist[ nt ]; troot = troot or tcurr
        elseif mt then tlist[ mt ] = tlist[ mt ] or alias[ nt ] or { }; setmetatable ( tcurr, tlist[ mt ] )
        elseif k then
            if     kt == 'table' then tlist[ k ] = tlist[ k ] or alias[ k ] or { }; kcurr = tlist[ k ]
            elseif kt == 'number' then kcurr = alias[ k ] or tonumber ( k ) or 0/0
            elseif kt == 'string' then kcurr = alias[ k ] or unescape ( k )
            else kcurr = alias[ k ]
            end
        elseif v and tcurr and kcurr ~= nil then
            if     vt == 'table' then tlist[ v ] = tlist[ v ] or alias[ v ] or { }; tcurr[ kcurr ] = tlist[ v ]
            elseif vt == 'number' then tcurr[ kcurr ] = alias[ v ] or tonumber ( v ) or 0/0
            elseif vt == 'string' then tcurr[ kcurr ] = alias[ v ] or unescape ( v )
            else tcurr[ kcurr ] = alias[ v ]
            end
        end
    end
    return troot
end

local function addalias ( item, path, deep, seen )
    if item == nil and path == nil and deep == nil and seen == nil then item, path, deep = _G, "_G", true end
    seen = seen or { }
    if item == nil or path == nil or seen[ item ] ~= nil then
        return
    elseif type ( item ) == 'table' and deep then
        seen[ item ] = true
        for k, v in pairs ( item ) do
            if type ( v ) == 'table'  then
                addalias ( v, string.format ( "%s.%s", path, escape( k ) ), deep, seen )
            elseif type ( v ) ~= 'string' and type ( v ) ~= 'number' then
                aliases[ v ] = string.format ( "%s.%s", path, escape ( k ) )
            end
        end
    else
        aliases[ item ] = path
    end
end

addalias ( math.huge, "math.huge" )
addalias ( -math.huge, "-math.huge" )

return { dumpstr = dumpstr, dumpfile = dumpfile, loadstr = loadstr, addalias = addalias }
 
Цитата
s_mike@rambler.ru написал:
print(string.len("a"))print(string.len("a\0b"))
   Длины разные, но "a" .. "a\0b" = "aa". Проверено в Lua 5.3.5 и 5.4.1. Непорядок. Разработчикам Lua это надо бы довести до сведенья.
 
Цитата
TGB написал:
Цитата
s_mike@rambler.ru написал:
print(string.len("a"))print(string.len("a\0b"))
    Длины разные, но "a" .. "a\0b" = "aa". Проверено в Lua 5.3.5 и 5.4.1. Непорядок. Разработчикам Lua это надо бы довести до сведенья.
Здесь вы опять ошибаетесь

print(#("x" .. "a\0\b"))
4
www.bot4sale.ru        t.me/bot4sale
 
Цитата
s_mike@rambler.ru написал:
Здесь вы опять ошибаетесьprint(#("x" .. "a\0\b"))4


www.bot4sale.ru         t.me/bot4sale
 Ну и ладно :smile:
 
TGB,

https://www.lua.org/manual/5.3/
https://www.lua.org/manual/5.4/

От корки до корки прошдутируйте, пожалуйста.
 
Цитата
Артем написал:
TGB ,  https://www.lua.org/manual/5.3/  https://www.lua.org/manual/5.4/
От корки до корки прошдутируйте, пожалуйста.
  Я думаю что вы мне здесь все расскажите :smile:
 
TGB,про бинарные строки вам уже рассказали. Собственно эта информация прямым текстом написана в третьем параграфе первой главы, т.е. в самом начале инструкции - которую вы очевидно не читали. Так что пожалуйста прочитайте, целиком и полностью. Перед тем как делать библиотеки для других людей, сначала убедитесь что ваши познания и умения находятся на уровне повыше плинтуса.
 
Артем, На заборе тоже много чего написано. Если составлять описание здешних глюков, наверное, многотомник получится - и хоть что-нибудь было бы описано! А читать про строки, да еще "целиком и полностью"... Строка - это непрерывная последовательность элементов (например, байтов), оканчивающаяся терминатором. Точка. О ЧЁМ здесь вообще можно читать? КАКИМ ОБРАЗОМ чтение всей этой бредятины может поднять "ваши познания и умения находятся на уровне повыше плинтуса"? Из любого дерьма, из любой элементарщины проблему сделают...
 
Цитата
Владимир написал:
Строка - это непрерывная последовательность элементов (например, байтов), оканчивающаяся терминатором. Точка.
Неправильно. Садись, двойка. Домашнее задание - прочитать и усвоить определение типа string в языке Lua.
 
Артем,Да мне СРАТЬ. что там в головожопу создателям этой "документации" вдарило. Строка - это то, что я сказал! Была, есть и будет.
 
Тут как говорится, нечего на зеркало пенять если рожа крива. Не знаете языка, а глаголите как будто сопоставимо экспертному мнению, а не пердежу в лужу. Будете иметь весомое мнение, когда хотя-бы выучите формальное определение языка, про реальную имплементацию в коде уж не будем заикаться.
 
Артем, Да вот как раз я-то язык знаю. Я чуть ли не единственный на этом форуме, кто написал скрипт на девственно чистом Lua. Есть ещё такие? Поднимите руки! Нет? Тогда НЕ ВАМ что-то мне говорить о знании языка. :wink:  
 
Владимир, argumentum ad verecundiam. Вы эксперт в C, Prolog, Fortran, ассебмлер Z80? В Lua вы не эксперт. Тоже, пожалуйста, прочитайте инструкцию - в этом языке она очень короткая. Почерпнёте много нового.
 
Артем, Ответьте на вопрос! Есть такие? Нет? Тогда ИМЕННО Я И ЕСТЬ "эксперт в Lua"! Я на нём ПОЛНОСТЬЮ реализовал всё, что я хотел. Алгоритм давно уже торгует лучше меня, а недавно я признал его безоговорочное превосходство, я больше не хочу "путаться у него под ногами". Вот и сегодня он приподнял мой портфель на полпроцента. Наверное, до конца сессии ещё чт-нибудь наковыряет. Что мне ещё желать? НА КОЙ мне читать инструкцию? Мне больше НЕЧЕГО оттуда почерпнуть!

На ассемблере Z80 не писал никогда (писал н трёх других ассемблерах). Равно как и н Прологе. На Фортране последний раз писал лет 30-40 назад. На C - да, "эксперт". Но не на С++.
 
Владимир, спасибо за торговую информацию. Я начинал писать робота без надежды на прибыль, считая что точность технического анализа будет приближаться к броску монетки в силу турбулентности рынка. Но видя что алгоритмический робот может надёжно торговать в плюс, мне теперь кажется что и мой нейронный робот тоже будет хорошо справляться.


По поводу экспертизы я уже сказал - кто не знает языка в полной мере тот не эксперт как ни крути. Это примерно как Вася-токарь с опытом 40 лет, который вручную точит хорошие детали, но так и не умеет пользоваться блоком ЧПУ и особо ядрёные чертежи ему не по зубам, хотя станок справился бы.
 
Артем, А я начинал писать робот, хорошо представляя, что именно и как именно он будет делать. В процессе написания, конечно, кое-что поменялось, но базовые принципы остались в неприкосновенности. Ежу понятно, что "алгоритмический робот может надёжно торговать в плюс", а вот нейронный робот" сдохнет, а не справится.

А я как раз знаю язык в полной мере. ВСЁ, что я хотел написать, я написал с его помощью, ВСЁ, для чего он предназначен, реализовал. Куда ещё "полнее мера"? А уж сравнивать такое убожество, как Lua хотя бы со станком с ЧПУ и вообще смешно. Хуже языка мне пока что не попадалось!
 
Владимир, в поисках плохих языков далеко ходить не надо - C++, Java, Rust - мы все о них слышали. Lua это один из хороших языков, рядом с C и Python.


Легко наверное жить когда уровень ЧСВ еще выше чем уровень IQ. Когда нейронный робот запустится, я с вами поделюсь данными о монетарной производительности.
 
Артем, Не стоит, сударь, не стоит. Вы для меня не авторитет, Вы для меня НИКТО. А что Lua есть глючное убожество, говорится в доброй половине моих комментариев на этом форуме ДОКАЗАТЕЛЬНО говорится, а не голословно "один из хороших языков".
 
Владимир, буду надеяться что нейросеть будет работать как описано - извлекать скрытые и неизвестные зависимости в голом потоке данных и воспроизводить их. На друих задачах итоговая точность обычно составляет от 85% до 99% - для фондового рынка я пологаю что величина будет значительно ниже. Однако базовый анализ авторегрессором показывает значительную корреляцию, так что резонно пологать что итоговая точность будет значительно выше 50%, чего будет достаточно для торговли в плюс. В такой ситуации вам не останется выбора, кроме как признать мою авторитетность в этом поле деятельности.  :smile:  
 
Артем, Надейтесь - я что, запрещаю? :smile:

К нейросетям я всегда относился полунасмешливо, и ещё за много лет до того, как сам начал торговать, предлагал их сторонникам: "Запустите свои сети на биржу, и пусть там торгуют. Когда разоритесь - скажете". :smile:  
 
Сидят в песочнице зверята и хвастаютя:
"Я дальше всех умею прыгать", - говорит Зайчонок.
"А я быстрее всех бегаю в колесе", - говорит Бельчонок.
Медвежонок слушал-слушал и говорит:
"А я…, а у меня… А я вам щас всем пи[цензура] дам!"
 
Цитата
Владимир написал:
К нейросетям я всегда относился полунасмешливо
Зря. GPT-3 уже может писать книги, программировать на декларативных языках, и делать арифметику в уме (т.е. без использования программы-калькулятора)  до пятизначных слагаемых. GPT-4 не за горами, и он возможно сам сможет написать GPT-5.
 
Артем, И что? Я тоже могу "писать книги, программировать на декларативных языках, и делать арифметику в уме до пятизначных слагаемых". Пушкиным мне всё равно не быть, даже близко, как и всем этим GPT-12345. Вон, про Глубокого Голубого тоже бурные ахи-вздохи были, а потом в Джакарте Фриц всего лишь на 90-МГц пне вздрючил его, так его сразу и разобрали на запчасти.

В любом случае, всё это какая-то статистическая обработка чего-то там, а потому она может воспроизводить лишь поведение СТАДА - на творческие, нестандартные решения все эти нейросети неспособны по определению.

Бегло полистал Вики: Чат-боты... "технология пока очень далека от реального применения в здравоохранении"... Разработчики опасаются, что GPT-3 может быть использована для спама, домогательств, радикализации, дезинформации или астротурфинга... GPT-3 демонстрирует «значительные улучшения» в создании экстремистских текстов по сравнению со своим предшественником GPT-2... "многие ожидания по поводу способностей больших языковых моделей вроде GPT-3 являются совершенно нереалистичными"... пытаться построить интеллектуальные машины путём масштабирования языковых моделей — всё равно что строить высотные самолёты для полёта на Луну...

В общем, лень дальше даже листать - пустышка!
 
Владимир, знаете о нейросетях в районе ничерта, а заявления делаете громкие. Непрофессионально.
 
Артем, Чтобы узнать, что яйцо тухлое, не обязательно съесть его целиком.(с) Вы возразите хоть полслова по существу сказанного мною? Очень сомневаюсь. Ибо сказано вполне профессионально. :smile:  Я знаю о нейросетях ДОСТАТОЧНО.
 
В гроб меня вгонит этот "один из хороших языков"! :smile:

Оформляю свой последний алгоритм для скрипта (автоудаление заявок по таймеру, алгоритм я где-то выше описывал). Поменял алгоритм генерации транзакций на тот, который посоветовал Игорь М. У одного брокера (версия Квика 8.11.0.66) заявки принимаются нормально, у другого (8.7.1.3) после отправки транзакции выскакивает: "Указанный счёт депо не найден". Какой, в задницу, "счёт депо"?! Я ваще не знаю, что это такое!

Приключения на этом не кончились (а только начались). У того брокера, у которого заявки всё-таки принимаются, начались приключения в OnTrade.
Вывожу отладочную печать на входе:
OnTrade: transID=744549 OrderID=21985300239 Trade=373210739
Всё правильно, именно такой transID и был отправлен.

Теперь я начинаю искать эту транзакцию в массиве сделок данного (i-го) тикера:
for j=1,a[i][12][0][0] do
...
в этом массиве сейчас только ОДНА строка, сформированная функцией подачи заявки:
Код
j=a[i][12][0][0]+1;      -- количество заявок для тикера увеличилось
a[i][12][0][0]=j;      -- записываем количество заявок в паспорт
a[i][12][j]={};      -- массив паспортов сделок
a[i][12][j][0]=A.TRANS_ID;   -- ID заявки (пока транзакции) в системе
a[i][12][j][1]=0;      -- сделок по этой заявке ещё нет
a[i][12][j][2]=n;      -- количество оставшихся лотов по заявке
a[i][12][0][1]=C+10;      -- счётчик 15-секундных тиков до закрытия заявок
Смотрим - и в самом деле:
F:write("i="..i..", j="..j..", N="..a[i][12][0][0]..", 0="..a[i][12][j][0]..", 1="..a[i][12][j][1]..", 2="..a[i][12][j][2].."\n");
Результат:
i=1181, j=1, N=1, 0=744549, 1=0, 2=1

Теперь смотрим, наша ли это заявка (здесь, как водится, начала выдрипываться динамическая типизация - пришлось завернуть в tostring):
Код
if tostring(a[i][12][j][0])==tostring(n.trans_id) and a[i][12][j][1]==0 then 
 F:write("Первая сделка: i="..i..", j="..j.."\n");
 goto LSetTradeData;
end;      -- конец условия совпадения заявок
end;      -- конец цикла поиска
И снова всё прекрасно:
Первая сделка: i=1181, j=1

А теперь прыгаем на LSetTradeData, и первым же делом ставим печать:
::LSetTradeData::
F:write("i="..i..", j="..j..", N="..a[i][12][0][0].."\n");
Результат:
i=1181, j=1181, N=1

Лично у меня нет слов в нормативной лексике! :sad:  
 
Цитата
Лично у меня нет слов в нормативной лексике!  
Продолжайте в том же духе оформлять свой код - не то еще будет.

Никаких проблем с подачей транзакции и поиском ответов, если он пришел, нет. А то что Вы не знаете что такое счет депо только подтверждает, что предметная область Вами не усвоена.
 
Nikolay, Проблемы ЕСТЬ, и я их ПЕРЕЧИСЛИЛ. Более того: тот самый счёт, которого у этого придурка "нет" - это именно МОЙ счёт, и он отображается в диагностике ПРАВИЛЬНО, и при старой технике формирования айдишек транзакций он его прекрасно находил (а  второго брокера и сейчас прекрасно находит! Ну, а уж про порчу переменных у меня просто слов нет - как можно изуродовать ассемблерный JMP, чтобы он стал выдавать такую херню?!
 
Мудифицировал код:
Код
k=j;
F:write("Первая сделка i="..i..", j="..j..", k="..k.."\n");
goto qq;end;end;
...
::qq::
j=k;
::LSetTradeData::
F:write("i="..i..", j="..j..", N="..a[i][12][0][0].."\n");
Результат:
Первая сделка: i=1181, j=1, k=1
i=1181, j=1, N=1

Заработало, блин! УЖАС!!!
 
Цитата
Владимир написал:
Ну, а уж про порчу переменных у меня просто слов нет - как можно изуродовать ассемблерный JMP, чтобы он стал выдавать такую херню?!

Местный дурач0к по прежнему не читает документацию.

Цитата
Second, the control variable is a local variable automatically declared by the for statement and is visible only inside the loop.
A typical idiot's mistake is to assume that the variable still exists after the loop ends
 
swerg, Да в гробу я видел ТАКУЮ "документацию" - это дерьмо пущай умники читают.

Справка для особо одарённых:
1. Это НЕ ЕСТЬ "variable automatically declared by the for statement and is visible only inside the loop" - переменная явно объявлена в самом начале функции:
Код
function OnTrade(n)   -- обработчик прерывания по приходу сделки
 local i,j,k,s;   -- вспомогательные переменные
2. Эта переменная видна НЕ ТОЛЬКО в теле цикла и активно используется в теле функции.

3. У нормальных языков (С) такие локальные переменные заводятся в стеке и до выхода из функции ни одна сволочь не имеет права её уничтожить, а у криворуких бездарей, ессно, "typical idiot's mistake".
 
swerg, Ах, да - по выходу из цикла эта переменная всё-таки СУЩЕСТВУЕТ, только её значение "волшебным образом" изменяется с ID сделки тикера на ID самого тикера! И, поскольку в начале функции стоит:
Код
 j=N;            -- невозможное значение индекса тикера
 for i=0,N-1 do       -- цикл по тикерам (поиск нужного)
  if a[i][0]==n.sec_code then j=i;break;end;end;
 if j==N then goto q;end;   -- тикер не найден
 i=j;            -- компенсация глюка с переменной цикла
то, очевидно, в циклах используется НЕ ТА i и НЕ ТА j. А это уже просто гимн языку!
 
Владимир, про область видимости переменных в университете не проходили? Или вы уроки лекции прогуливали? Лекции о форматирование кода и именовании переменных тоже видимо мимо вас прошли.
 
Артем, Нет, не проходили. Лекции - да, частенько прогуливал, но средний балл у меня в институте был 5.00. И собственными мозгами допетрил, что если явно объявленную переменную подменяют какой-то левой своей, то это есть маразм.
 
Владимир, маразм это у вас в голове, если вы задокументированную функцию языка принимаете за ошибку. На пенсию пора.  :smile:  
 
Артем, Я, милок, нередко ПИСАЛ документацию, и молиться на всякое дерьмо не намерен. На мой взгляд, это кретинизм, проявления которого тоже придётся компенсировать собственным кодом.
 
Владимир, Я на иностранных форумах как-то байку слышал, что там программистов за 35 на работу не берут, особенно в таких местах как Сан-Франциско. Видимо по причине вот такого подхода к делу у ветеранов программирования.  :smile: Я программирую уже 15 лет, видимо мне осталось где-то еще 15-25 пока катушка не съехала.
 
Артем, Я, лапуль, байки на иностранных форумах не читаю, но со многими забугорными программистами был знаком лично. В частности, с человеком, который был признан лучшим программистом мира 1993 года. И даже с ещё более крутыми (но менее титулованными). Да и вообще, мне сам Кен Томпсон руку пожимал! :wink:

Я не знаю, какой там в Вашем представлении "вот такой подход к делу у ветеранов программирования", но у вас, нахватавшихся в своих университетах всякой дребедени, подход явно радикально иной. В самом деле: у нас, "ветеранов", просто крыша едет, когда язык пилюёт на явно объявленные программистом переменные, заводит вместо них свои (с теми же именами!) и работает по ним. Зашибися! А для вас это нормально? Надеюсь, в вашей долбаной "документации" сие гениальное действо подробно описано? Оно того стоит! :smile:  
 
Владимир, поясняю доходчиво на понятном языке:

Код
local i = -999
for i = 1, 100 do
  if math.random ( 0, 9 ) == 0 then 
    print ( i )
    break 
  end
end
print ( i )
Код
#include "stdio.h"
#include "stdlib.h"
int main ( int argc, char ** argv )
{
  int i = 0;
  for ( int i = 1; i < 100; i++ )
  {   
    if ( rand ( ) % 10 == 0 ) 
    {
      printf ( "%d\n", i );
      break;
    }
  }
  printf ( "%d", i );
  return 0;
}
Можете начинать аргументировать почему С это плохой язык.
 
Артем, Во-первых, я никогда не говорил, что "С это плохой язык". Наоборот, я говорил, что C мой наилюбимейший язык на протяжении десятилетий. Во-вторых, Ваш пример вовсе не на C, а на C++, про который я писал в своей книге:
С языком всё просто – немного перефразируя Генри Форда: «Любой модуль SINT может быть написан на любом языке программирования при условии, что это язык C». И это почти не шутка: эффективность C сравнима с ассемблером, он пригоден для решения подавляющего большинства задач, поддерживается всеми платформами, удобен для программиста – удобен настолько, что искать что-либо лучшее просто не хочется. Причём именно C, но не C++, который был нами отвергнут из-за крайне неудачной реализации (я бы даже сказал «дискредитации») идей объектного программирования.
 
Владимир, у вас этот код на С не компилируется что ли, что вы его С++ обзываете? Был бы С++ я бы писал void main ( ) и #include <cstdlib>.
 
Артем, Я его и не собирался компилировать! Просто в С нет этого маразма с объявлением переменных внутри блоков. Хотя здесь они, по крайней мере, объявляются, в отличие от Lua. Я всю жизнь пользуюсь компиляторами С++, но только потому, что там есть строчные комментарии - ЕДИНСТВЕННОЕ, что можно оттуда взять полезного! Я когда-то где-то читал, как Керниган плакался: "Ну как же это мы забыли про строчные комментарии"? Во всём остальном ставить рядом Страуструпа и Кернигана с Ричи просто нельзя - у них совершенно разные весовые категории. :smile:  
 
Владимир, использовать в тысячу раз более тяжеловесный и в целом несовместимый язык ради однострочных комментариев - ну-ну. Это при том что в изначальном собственно языке они тоже доступны, надо только инструкцию прочитать.

На пенсию, товарищ.
 
Я не язык использую, лапуль, а компилятор. Кстати, почти никогда "тяжеловесный" - мой любимый BC3.1. Иногда использовал Watcom, иногда GNU. Ни в одном из них никакой "тяжеловесности" не было. И программы нга выходе всегда смешного размера - я не помню, была ли хоть одна объёмом свыше сотни килобайт.

НЕ БЫЛО изначальном языке строчных комментариев! И если Ваша долбана инструкция утверждает обратное, засуньте её... сами знаете куда.

Да я давно уже на пенсии, лапуль. :wink:  
Страницы: Пред. 1 2 3 4 5 6 След.
Читают тему (гостей: 3)
Наверх