Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Не стесняетесь пользоваться , раздел Serialization.
Полистал. Не увидел вообще ничего, заслуживающего внимания. Я что-то пропутил?
Пользователь
Сообщений: Регистрация: 12.05.2020
14.03.2021 22:26:26
Цитата
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 и я не собираюсь переделывать его.
Пользователь
Сообщений: Регистрация: 03.02.2021
15.03.2021 01:21:22
Такой код не должен вызывать затруднений.
Код
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, ... }.
написал: во втором случае результат явно неверен. "a" и "a\0b" - совершенно разные строки.
Так как символ \0 в Lua это признак завершения строки, то для Lua "a" и "a\0b" - эквивалентные строки.
Lua использует бинарные строки с указанной длиной. Указанные строки - разные, и Lua будет их считать разными; при выгрузке в файл значения разные (и совпадающие со входящими). То что они отобразились одинаково это вероятно из-за того, что в используемом терминале используется С стандарт строк с нуль-терминатором.
Пользователь
Сообщений: Регистрация: 30.01.2015
15.03.2021 01:54:39
Цитата
Цитата
написал: во втором случае результат явно неверен. "a" и "a\0b" - совершенно разные строки.
Так как символ \0 в Lua это признак завершения строки, то для Lua "a" и "a\0b" - эквивалентные строки.
Повторяюсь - строки в Lua бинарные. Текст они не различают вообще, все строковые функции работают по отдельным байтам.
Пользователь
Сообщений: Регистрация: 03.02.2021
15.03.2021 05:21:55
Немного доработанный код. Вроде справляется со всем, включая 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 }
Артем написал: TGB , От корки до корки прошдутируйте, пожалуйста.
Я думаю что вы мне здесь все расскажите
Пользователь
Сообщений: Регистрация: 03.02.2021
15.03.2021 18:41:34
TGB,про бинарные строки вам уже рассказали. Собственно эта информация прямым текстом написана в третьем параграфе первой главы, т.е. в самом начале инструкции - которую вы очевидно не читали. Так что пожалуйста прочитайте, целиком и полностью. Перед тем как делать библиотеки для других людей, сначала убедитесь что ваши познания и умения находятся на уровне повыше плинтуса.
Пользователь
Сообщений: Регистрация: 25.09.2020
15.03.2021 18:53:54
Артем, На заборе тоже много чего написано. Если составлять описание здешних глюков, наверное, многотомник получится - и хоть что-нибудь было бы описано! А читать про строки, да еще "целиком и полностью"... Строка - это непрерывная последовательность элементов (например, байтов), оканчивающаяся терминатором. Точка. О ЧЁМ здесь вообще можно читать? КАКИМ ОБРАЗОМ чтение всей этой бредятины может поднять "ваши познания и умения находятся на уровне повыше плинтуса"? Из любого дерьма, из любой элементарщины проблему сделают...
Пользователь
Сообщений: Регистрация: 03.02.2021
15.03.2021 18:56:03
Цитата
Владимир написал: Строка - это непрерывная последовательность элементов (например, байтов), оканчивающаяся терминатором. Точка.
Неправильно. Садись, двойка. Домашнее задание - прочитать и усвоить определение типа string в языке Lua.
Пользователь
Сообщений: Регистрация: 25.09.2020
15.03.2021 18:57:57
Артем,Да мне СРАТЬ. что там в головожопу создателям этой "документации" вдарило. Строка - это то, что я сказал! Была, есть и будет.
Пользователь
Сообщений: Регистрация: 03.02.2021
15.03.2021 19:01:09
Тут как говорится, нечего на зеркало пенять если рожа крива. Не знаете языка, а глаголите как будто сопоставимо экспертному мнению, а не пердежу в лужу. Будете иметь весомое мнение, когда хотя-бы выучите формальное определение языка, про реальную имплементацию в коде уж не будем заикаться.
Пользователь
Сообщений: Регистрация: 25.09.2020
15.03.2021 19:05:23
Артем, Да вот как раз я-то язык знаю. Я чуть ли не единственный на этом форуме, кто написал скрипт на девственно чистом Lua. Есть ещё такие? Поднимите руки! Нет? Тогда НЕ ВАМ что-то мне говорить о знании языка.
Пользователь
Сообщений: Регистрация: 03.02.2021
15.03.2021 19:09:47
Владимир, argumentum ad verecundiam. Вы эксперт в C, Prolog, Fortran, ассебмлер Z80? В Lua вы не эксперт. Тоже, пожалуйста, прочитайте инструкцию - в этом языке она очень короткая. Почерпнёте много нового.
Пользователь
Сообщений: Регистрация: 25.09.2020
15.03.2021 19:24:38
Артем, Ответьте на вопрос! Есть такие? Нет? Тогда ИМЕННО Я И ЕСТЬ "эксперт в Lua"! Я на нём ПОЛНОСТЬЮ реализовал всё, что я хотел. Алгоритм давно уже торгует лучше меня, а недавно я признал его безоговорочное превосходство, я больше не хочу "путаться у него под ногами". Вот и сегодня он приподнял мой портфель на полпроцента. Наверное, до конца сессии ещё чт-нибудь наковыряет. Что мне ещё желать? НА КОЙ мне читать инструкцию? Мне больше НЕЧЕГО оттуда почерпнуть!
На ассемблере Z80 не писал никогда (писал н трёх других ассемблерах). Равно как и н Прологе. На Фортране последний раз писал лет 30-40 назад. На C - да, "эксперт". Но не на С++.
Пользователь
Сообщений: Регистрация: 03.02.2021
15.03.2021 19:43:38
Владимир, спасибо за торговую информацию. Я начинал писать робота без надежды на прибыль, считая что точность технического анализа будет приближаться к броску монетки в силу турбулентности рынка. Но видя что алгоритмический робот может надёжно торговать в плюс, мне теперь кажется что и мой нейронный робот тоже будет хорошо справляться.
По поводу экспертизы я уже сказал - кто не знает языка в полной мере тот не эксперт как ни крути. Это примерно как Вася-токарь с опытом 40 лет, который вручную точит хорошие детали, но так и не умеет пользоваться блоком ЧПУ и особо ядрёные чертежи ему не по зубам, хотя станок справился бы.
Пользователь
Сообщений: Регистрация: 25.09.2020
15.03.2021 20:39:24
Артем, А я начинал писать робот, хорошо представляя, что именно и как именно он будет делать. В процессе написания, конечно, кое-что поменялось, но базовые принципы остались в неприкосновенности. Ежу понятно, что "алгоритмический робот может надёжно торговать в плюс", а вот нейронный робот" сдохнет, а не справится.
А я как раз знаю язык в полной мере. ВСЁ, что я хотел написать, я написал с его помощью, ВСЁ, для чего он предназначен, реализовал. Куда ещё "полнее мера"? А уж сравнивать такое убожество, как Lua хотя бы со станком с ЧПУ и вообще смешно. Хуже языка мне пока что не попадалось!
Пользователь
Сообщений: Регистрация: 03.02.2021
15.03.2021 20:55:29
Владимир, в поисках плохих языков далеко ходить не надо - C++, Java, Rust - мы все о них слышали. Lua это один из хороших языков, рядом с C и Python.
Легко наверное жить когда уровень ЧСВ еще выше чем уровень IQ. Когда нейронный робот запустится, я с вами поделюсь данными о монетарной производительности.
Пользователь
Сообщений: Регистрация: 25.09.2020
15.03.2021 20:59:48
Артем, Не стоит, сударь, не стоит. Вы для меня не авторитет, Вы для меня НИКТО. А что Lua есть глючное убожество, говорится в доброй половине моих комментариев на этом форуме ДОКАЗАТЕЛЬНО говорится, а не голословно "один из хороших языков".
Пользователь
Сообщений: Регистрация: 03.02.2021
15.03.2021 21:20:27
Владимир, буду надеяться что нейросеть будет работать как описано - извлекать скрытые и неизвестные зависимости в голом потоке данных и воспроизводить их. На друих задачах итоговая точность обычно составляет от 85% до 99% - для фондового рынка я пологаю что величина будет значительно ниже. Однако базовый анализ авторегрессором показывает значительную корреляцию, так что резонно пологать что итоговая точность будет значительно выше 50%, чего будет достаточно для торговли в плюс. В такой ситуации вам не останется выбора, кроме как признать мою авторитетность в этом поле деятельности.
К нейросетям я всегда относился полунасмешливо, и ещё за много лет до того, как сам начал торговать, предлагал их сторонникам: "Запустите свои сети на биржу, и пусть там торгуют. Когда разоритесь - скажете".
Пользователь
Сообщений: Регистрация: 30.05.2020
15.03.2021 23:14:10
Сидят в песочнице зверята и хвастаютя: "Я дальше всех умею прыгать", - говорит Зайчонок. "А я быстрее всех бегаю в колесе", - говорит Бельчонок. Медвежонок слушал-слушал и говорит: "А я…, а у меня… А я вам щас всем пи[цензура] дам!"
Пользователь
Сообщений: Регистрация: 03.02.2021
15.03.2021 23:53:26
Цитата
Владимир написал: К нейросетям я всегда относился полунасмешливо
Зря. GPT-3 уже может писать книги, программировать на декларативных языках, и делать арифметику в уме (т.е. без использования программы-калькулятора) до пятизначных слагаемых. GPT-4 не за горами, и он возможно сам сможет написать GPT-5.
Пользователь
Сообщений: Регистрация: 25.09.2020
16.03.2021 00:15:01
Артем, И что? Я тоже могу "писать книги, программировать на декларативных языках, и делать арифметику в уме до пятизначных слагаемых". Пушкиным мне всё равно не быть, даже близко, как и всем этим GPT-12345. Вон, про Глубокого Голубого тоже бурные ахи-вздохи были, а потом в Джакарте Фриц всего лишь на 90-МГц пне вздрючил его, так его сразу и разобрали на запчасти.
В любом случае, всё это какая-то статистическая обработка чего-то там, а потому она может воспроизводить лишь поведение СТАДА - на творческие, нестандартные решения все эти нейросети неспособны по определению.
Бегло полистал Вики: Чат-боты... "технология пока очень далека от реального применения в здравоохранении"... Разработчики опасаются, что GPT-3 может быть использована для спама, домогательств, радикализации, дезинформации или астротурфинга... GPT-3 демонстрирует «значительные улучшения» в создании экстремистских текстов по сравнению со своим предшественником GPT-2... "многие ожидания по поводу способностей больших языковых моделей вроде GPT-3 являются совершенно нереалистичными"... пытаться построить интеллектуальные машины путём масштабирования языковых моделей — всё равно что строить высотные самолёты для полёта на Луну...
В общем, лень дальше даже листать - пустышка!
Пользователь
Сообщений: Регистрация: 03.02.2021
16.03.2021 00:59:07
Владимир, знаете о нейросетях в районе ничерта, а заявления делаете громкие. Непрофессионально.
Пользователь
Сообщений: Регистрация: 25.09.2020
16.03.2021 07:58:13
Артем, Чтобы узнать, что яйцо тухлое, не обязательно съесть его целиком.(с) Вы возразите хоть полслова по существу сказанного мною? Очень сомневаюсь. Ибо сказано вполне профессионально. Я знаю о нейросетях ДОСТАТОЧНО.
Пользователь
Сообщений: Регистрация: 25.09.2020
16.03.2021 13:05:28
В гроб меня вгонит этот "один из хороших языков"!
Оформляю свой последний алгоритм для скрипта (автоудаление заявок по таймеру, алгоритм я где-то выше описывал). Поменял алгоритм генерации транзакций на тот, который посоветовал Игорь М. У одного брокера (версия Квика 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
Лично у меня нет слов в нормативной лексике!
Пользователь
Сообщений: Регистрация: 27.01.2017
16.03.2021 13:13:54
Цитата
Лично у меня нет слов в нормативной лексике!
Продолжайте в том же духе оформлять свой код - не то еще будет.
Никаких проблем с подачей транзакции и поиском ответов, если он пришел, нет. А то что Вы не знаете что такое счет депо только подтверждает, что предметная область Вами не усвоена.
Пользователь
Сообщений: Регистрация: 25.09.2020
16.03.2021 14:05:56
Nikolay, Проблемы ЕСТЬ, и я их ПЕРЕЧИСЛИЛ. Более того: тот самый счёт, которого у этого придурка "нет" - это именно МОЙ счёт, и он отображается в диагностике ПРАВИЛЬНО, и при старой технике формирования айдишек транзакций он его прекрасно находил (а второго брокера и сейчас прекрасно находит! Ну, а уж про порчу переменных у меня просто слов нет - как можно изуродовать ассемблерный JMP, чтобы он стал выдавать такую херню?!
Результат: Первая сделка: i=1181, j=1, k=1 i=1181, j=1, N=1
Заработало, блин! УЖАС!!!
Пользователь
Сообщений: Регистрация: 02.02.2015
миру мир!
16.03.2021 18:48:36
Цитата
Владимир написал: Ну, а уж про порчу переменных у меня просто слов нет - как можно изуродовать ассемблерный 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
Пользователь
Сообщений: Регистрация: 25.09.2020
16.03.2021 19:08:48
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".
Пользователь
Сообщений: Регистрация: 25.09.2020
16.03.2021 19:26:45
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. А это уже просто гимн языку!
Пользователь
Сообщений: Регистрация: 03.02.2021
16.03.2021 22:34:56
Владимир, про область видимости переменных в университете не проходили? Или вы уроки лекции прогуливали? Лекции о форматирование кода и именовании переменных тоже видимо мимо вас прошли.
Пользователь
Сообщений: Регистрация: 25.09.2020
16.03.2021 22:39:43
Артем, Нет, не проходили. Лекции - да, частенько прогуливал, но средний балл у меня в институте был 5.00. И собственными мозгами допетрил, что если явно объявленную переменную подменяют какой-то левой своей, то это есть маразм.
Пользователь
Сообщений: Регистрация: 03.02.2021
16.03.2021 22:42:27
Владимир, маразм это у вас в голове, если вы задокументированную функцию языка принимаете за ошибку. На пенсию пора.
Пользователь
Сообщений: Регистрация: 25.09.2020
16.03.2021 22:52:42
Артем, Я, милок, нередко ПИСАЛ документацию, и молиться на всякое дерьмо не намерен. На мой взгляд, это кретинизм, проявления которого тоже придётся компенсировать собственным кодом.
Пользователь
Сообщений: Регистрация: 03.02.2021
17.03.2021 00:23:52
Владимир, Я на иностранных форумах как-то байку слышал, что там программистов за 35 на работу не берут, особенно в таких местах как Сан-Франциско. Видимо по причине вот такого подхода к делу у ветеранов программирования. Я программирую уже 15 лет, видимо мне осталось где-то еще 15-25 пока катушка не съехала.
Пользователь
Сообщений: Регистрация: 25.09.2020
17.03.2021 07:56:54
Артем, Я, лапуль, байки на иностранных форумах не читаю, но со многими забугорными программистами был знаком лично. В частности, с человеком, который был признан лучшим программистом мира 1993 года. И даже с ещё более крутыми (но менее титулованными). Да и вообще, мне сам Кен Томпсон руку пожимал!
Я не знаю, какой там в Вашем представлении "вот такой подход к делу у ветеранов программирования", но у вас, нахватавшихся в своих университетах всякой дребедени, подход явно радикально иной. В самом деле: у нас, "ветеранов", просто крыша едет, когда язык пилюёт на явно объявленные программистом переменные, заводит вместо них свои (с теми же именами!) и работает по ним. Зашибися! А для вас это нормально? Надеюсь, в вашей долбаной "документации" сие гениальное действо подробно описано? Оно того стоит!
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;
}
Можете начинать аргументировать почему С это плохой язык.
Пользователь
Сообщений: Регистрация: 25.09.2020
17.03.2021 09:37:44
Артем, Во-первых, я никогда не говорил, что "С это плохой язык". Наоборот, я говорил, что C мой наилюбимейший язык на протяжении десятилетий. Во-вторых, Ваш пример вовсе не на C, а на C++, про который я писал в своей книге: С языком всё просто – немного перефразируя Генри Форда: «Любой модуль SINT может быть написан на любом языке программирования при условии, что это язык C». И это почти не шутка: эффективность C сравнима с ассемблером, он пригоден для решения подавляющего большинства задач, поддерживается всеми платформами, удобен для программиста – удобен настолько, что искать что-либо лучшее просто не хочется. Причём именно C, но не C++, который был нами отвергнут из-за крайне неудачной реализации (я бы даже сказал «дискредитации») идей объектного программирования.
Пользователь
Сообщений: Регистрация: 03.02.2021
17.03.2021 18:28:12
Владимир, у вас этот код на С не компилируется что ли, что вы его С++ обзываете? Был бы С++ я бы писал void main ( ) и #include <cstdlib>.
Пользователь
Сообщений: Регистрация: 25.09.2020
17.03.2021 18:39:10
Артем, Я его и не собирался компилировать! Просто в С нет этого маразма с объявлением переменных внутри блоков. Хотя здесь они, по крайней мере, объявляются, в отличие от Lua. Я всю жизнь пользуюсь компиляторами С++, но только потому, что там есть строчные комментарии - ЕДИНСТВЕННОЕ, что можно оттуда взять полезного! Я когда-то где-то читал, как Керниган плакался: "Ну как же это мы забыли про строчные комментарии"? Во всём остальном ставить рядом Страуструпа и Кернигана с Ричи просто нельзя - у них совершенно разные весовые категории.
Пользователь
Сообщений: Регистрация: 03.02.2021
17.03.2021 19:26:43
Владимир, использовать в тысячу раз более тяжеловесный и в целом несовместимый язык ради однострочных комментариев - ну-ну. Это при том что в изначальном собственно языке они тоже доступны, надо только инструкцию прочитать.
На пенсию, товарищ.
Пользователь
Сообщений: Регистрация: 25.09.2020
17.03.2021 19:33:26
Я не язык использую, лапуль, а компилятор. Кстати, почти никогда "тяжеловесный" - мой любимый BC3.1. Иногда использовал Watcom, иногда GNU. Ни в одном из них никакой "тяжеловесности" не было. И программы нга выходе всегда смешного размера - я не помню, была ли хоть одна объёмом свыше сотни килобайт.
НЕ БЫЛО изначальном языке строчных комментариев! И если Ваша долбана инструкция утверждает обратное, засуньте её... сами знаете куда.