Магический шар подсказывает, что ТС путается в типах данных: положил в массив с ключом одного типа, а ищет в ячейке с ключом другого типа. Естественно, там nil
Надо делать так, как надо. А как не надо - делать не надо.
Пользователь
Сообщений: Регистрация: 23.01.2015
15.10.2020 13:00:14
Владимир, У Вас есть понимание что фраза "полная версия кода которая не работает." означает что в коде должно быть всё для того чтобы его можно было запустить и получить ошибку?
Пользователь
Сообщений: Регистрация: 27.01.2017
15.10.2020 13:00:44
Ну и какой тип у a[i][1][1] Вы через message не увидите. Добавьте в вывод хотя бы message(i..": type(a[i][1][1]) "..type(a[i][1][1]))
Пользователь
Сообщений: Регистрация: 25.09.2020
15.10.2020 13:02:13
Sergey Gorokhov, SP- строка (массив) на три числа, а - сложное, разветвлённое дерево объектов с разнообразной информацией по тикерам, отследить которое не представляется возможным. В частности, этот код выполняется в "большом" прерывании, инициализация - в main, визуализация результатов - малом,обновление - в разных местах.
Пользователь
Сообщений: Регистрация: 25.09.2020
15.10.2020 13:04:07
Sergey Gorokhov, Сергей, я 40 лет программистом, причём системщик, был даже когда-то в соавторы бортовой операционки включён. Поверьте, я кое-что смыслю в программировании.
Пользователь
Сообщений: Регистрация: 23.01.2015
15.10.2020 13:07:47
Цитата
Владимир написал: , SP- строка (массив) на три числа, а - сложное, разветвлённое дерево объектов с разнообразной информацией по тикерам, отследить которое не представляется возможным. В частности, этот код выполняется в "большом" прерывании, инициализация - в main, визуализация результатов - малом,обновление - в разных местах.
В виде КОДА а не слов.
Цитата
Владимир написал: , Сергей, я 40 лет программистом, причём системщик, был даже когда-то в соавторы бортовой операционки включён. Поверьте, я кое-что смыслю в программировании. ::
Для того чтобы выложить "полную версию кода которая не работает" не надо быть программистом
Пользователь
Сообщений: Регистрация: 25.09.2020
15.10.2020 13:09:40
Sergey Gorokhov, Не вижу смысла. Тем более, что я за это время самостоятельно разобрался, почему возникают глюки.
Пользователь
Сообщений: Регистрация: 23.01.2015
15.10.2020 13:10:26
Цитата
Владимир написал: , Не вижу смысла. Тем более, что я за это время самостоятельно разобрался, почему возникают глюки.
Цитата
Sergey Gorokhov написал: 4) Если не хотите сотрудничать то увы ничем помочь не можем.
Пользователь
Сообщений: Регистрация: 25.09.2020
15.10.2020 13:20:51
Sergey Gorokhov, Это не сотрудничество. Я абсолютно точно знаю, что мне пришлось бы МЕСЯЦ рассказывать, что и как делает код. Вы хотели отслеживать a? Ну, рискните - вот её описание:
-- Структура таблицы данных для i-го тикера -- [0] - код тикера -- [1] - справочная информация по тикеру -- [1][0] - код класса тикера -- [1][1] - код валюты тикера (0 - рубли, 1 - доллары, 2 - евро) -- [1][2] - код качества тикера (0 - наихудший 3 - наилучший) -- [1][3] - размер лота (берётся из справочника) -- [1][4] - общее количество сделок (минимум одна, хотя бы виртуальная) -- [1][5] - общее количество закупленных лотов по тикеру -- [1][6] - сумма затрат по тикеру -- [1][7] - средняя цена по всем лотам -- [2] - последнее значение курса (берётся из таблицы текущих торгов) -- [3] - глобальный стоп-лосс -- [4] - стоп-лосс последней ставки -- [5] - сделки текущего тикера в виде пар: размер ставки в лотах - цена покупки -- [6] - свечи текущего тикера по периодам (накапливаемые) -- [7] - свечи текущего тикера (предпоследние) -- [8] - свечи текущего тикера (последние) -- [9] - ID строки в таблице визуализации или -1
Пользователь
Сообщений: Регистрация: 23.01.2015
15.10.2020 13:28:57
Цитата
Владимир написал: Я абсолютно точно знаю, что мне пришлось бы МЕСЯЦ рассказывать, что и как делает код
НЕ надо ничего рассказывать.
Цитата
Владимир написал: Вы хотели отслеживать a? Ну, рискните - вот её описание:
Никто у Вас не спрашивал "описание"
нужен просто код. Всё. без слов. без объяснений. скопировать содержимое проблемного lua файла и вставить сюда. так можно?
Пользователь
Сообщений: Регистрация: 25.09.2020
15.10.2020 13:30:31
Sergey Gorokhov, Нет, нельзя. Что Вы с ним делать-то будете? Тем более, без описания.
function r()local i,j,k;c=c+1;if c==10 then c=0;R();end;for i=0,N-1 do if a[i][9]~=-1 then j=a[i][2];a[i][2]=getParamEx(a[i][1][0],a[i][0],"LAST").param_value;k=0xFFFFFF;if j~=a[i][2]then if tonumber(j)>tonumber(a[i][2]) then k=0xFFCCCC;end;if tonumber(j)<tonumber(a[i][2]) then k=0xCCCCFF;end;end;j=CL[a[i][1][1]];if tonumber(a[i][1][5])==0 then j=0x666666;end;if f then SetColor(T,a[i][9],QTABLE_NO_INDEX,k,j,-1,-1);end;if tonumber(a[i][2])==0 then if f then SetColor(T,a[i][9],1,0,0xFFFFFF,-1,-1);end;end;if f then SetCell(T,a[i][9],1,a[i][0]);end;if f then SetCell(T,a[i][9],2,d0(a[i][1][5]));end;if f then SetCell(T,a[i][9],3,d0(a[i][2]));end;if f then SetCell(T,a[i][9],4,string.format("%1.2f",a[i][2]*a[i][1][3]*a[i][1][5]));end;if f then SetCell(T,a[i][9],5,string.format("%1.2f",a[i][1][6]));end;if f then SetCell(T,a[i][9],6,d0(string.format("%1.3f",a[i][1][7])));end;if f then SetCell(T,a[i][9],7,string.format("%1.2f",a[i][2]/a[i][1][7]*100-100));end;j=a[i][5][a[i][1][4]-1];if f then SetCell(T,a[i][9],8,d0(j));end;j=a[i][2]/j*100-100;if j>5 then if f then SetColor(T,a[i][9],9,0xCCCCFF,0,-1,-1);end;end;if j<-5 then if f then SetColor(T,a[i][9],9,0xFFCCCC,0,-1,-1);end;end;if f then SetCell(T,a[i][9],9,string.format("%1.2f",j));end;end;end;SetWindowCaption(T,"R="..SP[0].."+"..M[0].."="..SV[0].."/"..SR[0].." D="..SP[1].."+"..M[1].."="..SV[1].."/"..SR[1].." E="..SP[2].."+"..M[2].."="..SV[2].."/"..SR[2]);end
function R()local i,j,k,l;l=0;SP[0]=0;SP[1]=0;SP[2]=0;SV[0]=0;SV[1]=0;SV[2]=0;SR[0]=0;SR[1]=0;SR[2]=0;for i=0,N-1 do a[i][2]=getParamEx(a[i][1][0],a[i][0],"LAST").param_value;SP[a[i][1][1]]=tonumber(SP[a[i][1][1]])+a[i][1][6];j=a[i][2]/a[i][1][7]*100-100;if j > 1 then SR[a[i][1][1]]=SR[a[i][1][1]]+a[i][1][6];end;SV[a[i][1][1]]=SV[a[i][1][1]]+(a[i][2]-a[i][1][7])*a[i][1][5]*a[i][1][3];j=a[i][2]/a[i][1][7]*100-100;k=0;j=a[i][2]/a[i][1][7]*100-100;if j<-5 and a[i][2]~=0 then k=1;end;if a[i][1][5]>0 then j=a[i][2]/a[i][5][a[i][1][4]-1]*100-100;if j>3 or j<-3 then k=1;end;end;if k==0 and a[i][9]~=-1 then l=1;a[i][9]=-1;end;if k~=0 and a[i][9]==-1 then if f then a[i][2]=0;a[i][9]=InsertRow(T,-1);end;end;end;if l~=0 then if f then Clear(T);end;i=0;for i=0,N-1 do if a[i][9]~=-1 then a[i][2]=0;if f then a[i][9]=InsertRow(T,-1);end;end;end;end;C=C+1;end
function OnStop() f=false;end
function b(n) local i=0;a[n][1][5]=0;a[n][1][6]=0;while i<a[n][1][4] do a[n][1][5]=a[n][1][5]+a[n][5][i];a[n][1][6]=a[n][1][6]+a[n][5][i]*a[n][5][i+1]*a[n][1][3];i=i+2;end;if a[n][1][5]~=0 then a[n][1][7]=a[n][1][6]/a[n][1][5]/a[n][1][3];else a[n][1][7]=a[n][5][a[n][1][4]-1];end;end
function d0(s) s=tonumber(s);if s==math.floor(s) then s=math.floor(s) end return tostring(s);end
function e() f=false;message("Файл бракованный!");sleep(5000);end
function main() local i,j,s;CL={0,0x9900,0x99};f=true;c=0;C=0;N=0;T=0;a={};M={};M[0]=0;M[1]=0;M[2]=0;SP={};SV={};SR={};F=io.open(getScriptPath().."//T","r");if F==nil then e();return;end;for l in F:lines() do s=l:sub(1,1);if s=="_" then loadstring(l:sub(2))();end;if s~="-" and s~="_" then i=l:find("\1");if i==nil then e();return;end;a[N]={};a[N][1]={};a[N][1][0]=l:sub(1,i-1);l=l:sub(i+1);i=l:find("\2");if i==nil then e();return;end;a[N][0]=l:sub(1,i-1);if l:sub(i+2,i+2)~="\3" or l:sub(i+4,i+4)~="\t" then e();return;end;a[N][1][1]=l:sub(i+1,i+1);a[N][1][2]=l:sub(i+3,i+3);l=l:sub(i+5);a[N][1][3]=getParamEx(a[N][1][0],a[N][0],"LOTSIZE").param_value;i=l:find("\t");if i==nil then e();return;end;a[N][2]=0;l=l:sub(i+1);a[N][3]=0;a[N][4]=0;a[N][5]={};j=0;while l:sub(1,1)~="#" do i=l:find("\t");if i==nil then e();return;end;s=l:sub(1,i-1);l=l:sub(i+1);i=s:find(":");if i==nil then e();return;end;a[N][5][j]=s:sub(1,i-1);a[N][5][j+1]=s:sub(i+1);j=j+2;end;a[N][1][4]=j;a[N][6]={};a[N][7]={};a[N][8]={};j=0;while j<12 do a[N][6][j]=0;a[N][7][j]=0;a[N][8][j]=0;j=j+1;end;l=l:sub(i+1);j=0;while j<12 do i=l:find("\4");if i==nil then break;end;i=l:find(":");if i==nil then e();return;end;a[N][6][j]=l:sub(2,i-1);l=l:sub(i+1);i=l:find(":");if i==nil then e();return;end;a[N][7][j]=l:sub(2,i-1);l=l:sub(i+1);i=l:find("\4");if i==nil then e();return;end;a[N][8][j]=l:sub(2,i-1);l=l:sub(i+1);j=j+1;end;a[N][9]=-1;b(N);N=N+1;end;end;F:close();T=AllocTable();AddColumn(T,1,"Тикер",true,QTABLE_STRING_TYPE,8);AddColumn(T,2,"Кол",true,QTABLE_STRING_TYPE,6);AddColumn(T,3,"Цена",true,QTABLE_STRING_TYPE,12);AddColumn(T,4,"Сумма",true,QTABLE_STRING_TYPE,12);AddColumn(T,5,"Затраты",true,QTABLE_STRING_TYPE,12);AddColumn(T,6,"Med",true,QTABLE_STRING_TYPE,12);AddColumn(T,7,"%",true,QTABLE_STRING_TYPE,12);AddColumn(T,8,"Last",true,QTABLE_STRING_TYPE,12);AddColumn(T,9,"%",true,QTABLE_STRING_TYPE,12);CreateWindow(T);SetWindowPos(T,0,0,900,560);R();F=io.open(getScriptPath().."//LOG","w");if F==nil then e();return;end;message("Скрипт запущен, акций: "..N);while f do sleep(1500);r();end;F:close();F=io.open(getScriptPath().."//TTT","w");if F==nil then e();return;end;i=0;while i<N do F:write(a[i][1][0].."\1"..a[i][0].."\2"..a[i][1][1].."\3"..a[i][1][2].."\t"..d0(a[i][2]).."\t");j=0;while j<a[i][1][4] do F:write(a[i][5][j]..":"..d0(a[i][5][j+1]).."\t");j=j+2;end;F:write("#");j=0;while j<12 do F:write(d0(a[i][6][j])..":"..d0(a[i][7][j])..":"..d0(a[i][8][j]).."\4");j=j+1;end;F:write("\n");i=i+1;end;F:close();message("Скрипт остановлен!");end
Последняя версия, ругается на "attempt to perform arithmetic on a nil value". если отрезать SP, SV, SR - работает: рисует таблицу, меняет в ней данные, записывает результаты в файл. Вот прям ща и работает - советует акции Nokia продать.
function r() local i,j,k;c = c + 1 ; if c = = 10 then c = 0 ;R(); end ; for i = 0 ,N - 1 do if a[i][ 9 ]~ = - 1 then j = a[i][ 2 ];a[i][ 2 ] = getParamEx (a[i][ 1 ][ 0 ],a[i][ 0 ],"LAST").param_value;k = 0xFFFFFF ; if j~ = a[i][ 2 ] then if tonumber(j) > tonumber(a[i][ 2 ]) then k = 0xFFCCCC ; end ; if tonumber(j) < tonumber(a[i][ 2 ]) then k = 0xCCCCFF ; end ; end ;j = CL[a[i][ 1 ][ 1 ]]; if tonumber(a[i][ 1 ][ 5 ]) = = 0 then j = 0x666666 ; end ; if f then SetColor (T,a[i][ 9 ],QTABLE_NO_INDEX,k,j, - 1 , - 1 ); end ; if tonumber(a[i][ 2 ]) = = 0 then if f then SetColor (T,a[i][ 9 ], 1 , 0 , 0xFFFFFF , - 1 , - 1 ); end ; end ; if f then SetCell (T,a[i][ 9 ], 1 ,a[i][ 0 ]); end ; if f then SetCell (T,a[i][ 9 ], 2 ,d0(a[i][ 1 ][ 5 ])); end ; if f then SetCell (T,a[i][ 9 ], 3 ,d0(a[i][ 2 ])); end ; if f then SetCell (T,a[i][ 9 ], 4 , string.format ( "%1.2f" ,a[i][ 2 ] * a[i][ 1 ][ 3 ] * a[i][ 1 ][ 5 ])); end ; if f then SetCell (T,a[i][ 9 ], 5 , string.format ( "%1.2f" ,a[i][ 1 ][ 6 ])); end ; if f then SetCell (T,a[i][ 9 ], 6 ,d0( string.format ( "%1.3f" ,a[i][ 1 ][ 7 ]))); end ; if f then SetCell (T,a[i][ 9 ], 7 , string.format ( "%1.2f" ,a[i][ 2 ]/a[i][ 1 ][ 7 ] * 100 - 100 )); end ;j = a[i][ 5 ][a[i][ 1 ][ 4 ] - 1 ]; if f then SetCell (T,a[i][ 9 ], 8 ,d0(j)); end ;j = a[i][ 2 ]/j * 100 - 100 ; if j > 5 then if f then SetColor (T,a[i][ 9 ], 9 , 0xCCCCFF , 0 , - 1 , - 1 ); end ; end ; if j < - 5 then if f then SetColor (T,a[i][ 9 ], 9 , 0xFFCCCC , 0 , - 1 , - 1 ); end ; end ; if f then SetCell (T,a[i][ 9 ], 9 , string.format ( "%1.2f" ,j)); end ; end ; end ; SetWindowCaption (T,"R = "..SP[0].." + " .. M[ 0 ] .. " = "..SV[0].." /" .. SR[ 0 ] .. " D = "..SP[1].." + " .. M[ 1 ] .. " = "..SV[1].." /" .. SR[ 1 ] .. " E = "..SP[2].." + " .. M[ 2 ] .. " = "..SV[2].." /" .. SR[ 2 ]); end
function R() local i,j,k,l;l = 0 ;SP[ 0 ] = 0 ;SP[ 1 ] = 0 ;SP[ 2 ] = 0 ;SV[ 0 ] = 0 ;SV[ 1 ] = 0 ;SV[ 2 ] = 0 ;SR[ 0 ] = 0 ;SR[ 1 ] = 0 ;SR[ 2 ] = 0 ; for i = 0 ,N - 1 do a[i][ 2 ] = getParamEx (a[i][ 1 ][ 0 ],a[i][ 0 ],"LAST").param_value;SP[a[i][ 1 ][ 1 ]] = tonumber(SP[a[i][ 1 ][ 1 ]]) + a[i][ 1 ][ 6 ];j = a[i][ 2 ]/a[i][ 1 ][ 7 ] * 100 - 100 ; if j > 1 then SR[a[i][ 1 ][ 1 ]] = SR[a[i][ 1 ][ 1 ]] + a[i][ 1 ][ 6 ]; end ;SV[a[i][ 1 ][ 1 ]] = SV[a[i][ 1 ][ 1 ]] + (a[i][ 2 ] - a[i][ 1 ][ 7 ]) * a[i][ 1 ][ 5 ] * a[i][ 1 ][ 3 ];j = a[i][ 2 ]/a[i][ 1 ][ 7 ] * 100 - 100 ;k = 0 ;j = a[i][ 2 ]/a[i][ 1 ][ 7 ] * 100 - 100 ; if j < - 5 and a[i][ 2 ]~ = 0 then k = 1 ; end ; if a[i][ 1 ][ 5 ] > 0 then j = a[i][ 2 ]/a[i][ 5 ][a[i][ 1 ][ 4 ] - 1 ] * 100 - 100 ; if j > 3 or j < - 3 then k = 1 ; end ; end ; if k = = 0 and a[i][ 9 ]~ = - 1 then l = 1 ;a[i][ 9 ] = - 1 ; end ; if k~ = 0 and a[i][ 9 ] = = - 1 then if f then a[i][ 2 ] = 0 ;a[i][ 9 ] = InsertRow (T, - 1 ); end ; end ; end ; if l~ = 0 then if f then Clear (T); end ;i = 0 ; for i = 0 ,N - 1 do if a[i][ 9 ]~ = - 1 then a[i][ 2 ] = 0 ; if f then a[i][ 9 ] = InsertRow (T, - 1 ); end ; end ; end ; end ;C = C + 1 ; end
function OnStop () f = false ; end
function b(n) local i = 0 ;a[n][ 1 ][ 5 ] = 0 ;a[n][ 1 ][ 6 ] = 0 ; while i < a[n][ 1 ][ 4 ] do a[n][ 1 ][ 5 ] = a[n][ 1 ][ 5 ] + a[n][ 5 ][i];a[n][ 1 ][ 6 ] = a[n][ 1 ][ 6 ] + a[n][ 5 ][i] * a[n][ 5 ][i + 1 ] * a[n][ 1 ][ 3 ];i = i + 2 ; end ; if a[n][ 1 ][ 5 ]~ = 0 then a[n][ 1 ][ 7 ] = a[n][ 1 ][ 6 ]/a[n][ 1 ][ 5 ]/a[n][ 1 ][ 3 ]; else a[n][ 1 ][ 7 ] = a[n][ 5 ][a[n][ 1 ][ 4 ] - 1 ]; end ; end
function d0 (s) s = tonumber(s); if s = = math.floor (s) then s = math.floor (s) end return tostring(s); end
function e() f = false ; message ( "Файл бракованный!" ); sleep ( 5000 ); end
function main () local i,j,s;CL = { 0 , 0x9900 , 0x99 };f = true ;c = 0 ;C = 0 ;N = 0 ;T = 0 ;a = {};M = {};M[ 0 ] = 0 ;M[ 1 ] = 0 ;M[ 2 ] = 0 ;SP = {};SV = {};SR = {};F = io.open ( getScriptPath () .. "//T","r"); if F = = nil then e(); return ; end ; for l in F:lines() do s = l:sub( 1 , 1 ); if s = = "_" then loadstring(l:sub( 2 ))(); end ; if s~ = "-" and s~ = "_" then i = l:find( "\1" ); if i = = nil then e(); return ; end ;a[N] = {};a[N][ 1 ] = {};a[N][ 1 ][ 0 ] = l:sub( 1 ,i - 1 );l = l:sub(i + 1 );i = l:find( "\2" ); if i = = nil then e(); return ; end ;a[N][ 0 ] = l:sub( 1 ,i - 1 ); if l:sub(i + 2 ,i + 2 )~ = "\3" or l:sub(i + 4 ,i + 4 )~ = "\t" then e(); return ; end ;a[N][ 1 ][ 1 ] = l:sub(i + 1 ,i + 1 );a[N][ 1 ][ 2 ] = l:sub(i + 3 ,i + 3 );l = l:sub(i + 5 );a[N][ 1 ][ 3 ] = getParamEx (a[N][ 1 ][ 0 ],a[N][ 0 ],"LOTSIZE").param_value;i = l:find( "\t" ); if i = = nil then e(); return ; end ;a[N][ 2 ] = 0 ;l = l:sub(i + 1 );a[N][ 3 ] = 0 ;a[N][ 4 ] = 0 ;a[N][ 5 ] = {};j = 0 ; while l:sub( 1 , 1 )~ = "#" do i = l:find( "\t" ); if i = = nil then e(); return ; end ;s = l:sub( 1 ,i - 1 );l = l:sub(i + 1 );i = s:find( ":" ); if i = = nil then e(); return ; end ;a[N][ 5 ][j] = s:sub( 1 ,i - 1 );a[N][ 5 ][j + 1 ] = s:sub(i + 1 );j = j + 2 ; end ;a[N][ 1 ][ 4 ] = j;a[N][ 6 ] = {};a[N][ 7 ] = {};a[N][ 8 ] = {};j = 0 ; while j < 12 do a[N][ 6 ][j] = 0 ;a[N][ 7 ][j] = 0 ;a[N][ 8 ][j] = 0 ;j = j + 1 ; end ;l = l:sub(i + 1 );j = 0 ; while j < 12 do i = l:find( "\4" ); if i = = nil then break ; end ;i = l:find( ":" ); if i = = nil then e(); return ; end ;a[N][ 6 ][j] = l:sub( 2 ,i - 1 );l = l:sub(i + 1 );i = l:find( ":" ); if i = = nil then e(); return ; end ;a[N][ 7 ][j] = l:sub( 2 ,i - 1 );l = l:sub(i + 1 );i = l:find( "\4" ); if i = = nil then e(); return ; end ;a[N][ 8 ][j] = l:sub( 2 ,i - 1 );l = l:sub(i + 1 );j = j + 1 ; end ;a[N][ 9 ] = - 1 ;b(N);N = N + 1 ; end ; end ;F:close();T = AllocTable (); AddColumn (T, 1 ,"Тикер", true ,QTABLE_STRING_TYPE, 8 ); AddColumn (T, 2 ,"Кол", true ,QTABLE_STRING_TYPE, 6 ); AddColumn (T, 3 ,"Цена", true ,QTABLE_STRING_TYPE, 12 ); AddColumn (T, 4 ,"Сумма", true ,QTABLE_STRING_TYPE, 12 ); AddColumn (T, 5 ,"Затраты", true ,QTABLE_STRING_TYPE, 12 ); AddColumn (T, 6 ,"Med", true ,QTABLE_STRING_TYPE, 12 ); AddColumn (T, 7 ,"%", true ,QTABLE_STRING_TYPE, 12 ); AddColumn (T, 8 ,"Last", true ,QTABLE_STRING_TYPE, 12 ); AddColumn (T, 9 ,"%", true ,QTABLE_STRING_TYPE, 12 ); CreateWindow (T); SetWindowPos (T, 0 , 0 , 900 , 560 );R();F = io.open ( getScriptPath () .. "//LOG","w"); if F = = nil then e(); return ; end ; message ( "Скрипт запущен, акций: " .. N); while f do sleep ( 1500 );r(); end ;F:close();F = io.open ( getScriptPath () .. "//TTT","w"); if F = = nil then e(); return ; end ;i = 0 ; while i < N do F:write(a[i][ 1 ][ 0 ] .. "\ 1 " .. a[i][ 0 ] .. "\ 2 " .. a[i][ 1 ][ 1 ] .. "\ 3 " .. a[i][ 1 ][ 2 ] .. "\t" .. d0(a[i][ 2 ]) .. "\t");j = 0 ; while j < a[i][ 1 ][ 4 ] do F:write(a[i][ 5 ][j] .. ":" .. d0(a[i][ 5 ][j + 1 ]) .. "\t");j = j + 2 ; end ;F:write( "#" );j = 0 ; while j < 12 do F:write(d0(a[i][ 6 ][j]) .. ":" .. d0(a[i][ 7 ][j]) .. ":" .. d0(a[i][ 8 ][j]) .. "\ 4 ");j = j + 1 ; end ;F:write( "\n" );i = i + 1 ; end ;F:close(); message ( "Скрипт остановлен!" ); end
Последняя версия, ругается на "attempt to perform arithmetic on a nil value". если отрезать SP, SV, SR - работает: рисует таблицу, меняет в ней данные, записывает результаты в файл. Вот прям ща и работает - советует акции Nokia продать. ::
для полной картины не хватает содержимого файла "//T"
Пользователь
Сообщений: Регистрация: 25.09.2020
15.10.2020 14:44:10
Sergey Gorokhov, Ну уж это файл я точно не дам - там информация о моих сделках содержится. Но по коду разобраться в его структуре вполне возможно !
Пользователь
Сообщений: Регистрация: 23.01.2015
15.10.2020 14:46:23
Владимир, как и ожидалось у Вас в a[N][1][1] попадает строка, а не число. надо чтобы было число. Потому что SP[2] и SP["2"] - это разные вещи Исправьте например так:
Код
function r()local i,j,k;c=c+1;if c==10 then c=0;R();end;for i=0,N-1 do if a[i][9]~=-1 then j=a[i][2];a[i][2]=getParamEx(a[i][1][0],a[i][0],"LAST").param_value;k=0xFFFFFF;if j~=a[i][2]then if tonumber(j)>tonumber(a[i][2]) then k=0xFFCCCC;end;if tonumber(j)<tonumber(a[i][2]) then k=0xCCCCFF;end;end;j=CL[a[i][1][1]];if tonumber(a[i][1][5])==0 then j=0x666666;end;if f then SetColor(T,a[i][9],QTABLE_NO_INDEX,k,j,-1,-1);end;if tonumber(a[i][2])==0 then if f then SetColor(T,a[i][9],1,0,0xFFFFFF,-1,-1);end;end;if f then SetCell(T,a[i][9],1,a[i][0]);end;if f then SetCell(T,a[i][9],2,d0(a[i][1][5]));end;if f then SetCell(T,a[i][9],3,d0(a[i][2]));end;if f then SetCell(T,a[i][9],4,string.format("%1.2f",a[i][2]*a[i][1][3]*a[i][1][5]));end;if f then SetCell(T,a[i][9],5,string.format("%1.2f",a[i][1][6]));end;if f then SetCell(T,a[i][9],6,d0(string.format("%1.3f",a[i][1][7])));end;if f then SetCell(T,a[i][9],7,string.format("%1.2f",a[i][2]/a[i][1][7]*100-100));end;j=a[i][5][a[i][1][4]-1];if f then SetCell(T,a[i][9],8,d0(j));end;j=a[i][2]/j*100-100;if j>5 then if f then SetColor(T,a[i][9],9,0xCCCCFF,0,-1,-1);end;end;if j<-5 then if f then SetColor(T,a[i][9],9,0xFFCCCC,0,-1,-1);end;end;if f then SetCell(T,a[i][9],9,string.format("%1.2f",j));end;end;end;SetWindowCaption(T,"R="..SP[0].."+"..M[0].."="..SV[0].."/"..SR[0].." D="..SP[1].."+"..M[1].."="..SV[1].."/"..SR[1].." E="..SP[2].."+"..M[2].."="..SV[2].."/"..SR[2]);end
function R()local i,j,k,l;l=0;SP[0]=0;SP[1]=0;SP[2]=0;SV[0]=0;SV[1]=0;SV[2]=0;SR[0]=0;SR[1]=0;SR[2]=0;for i=0,N-1 do a[i][2]=getParamEx(a[i][1][0],a[i][0],"LAST").param_value;SP[a[i][1][1]]=tonumber(SP[a[i][1][1]])+a[i][1][6];j=a[i][2]/a[i][1][7]*100-100;if j > 1 then SR[a[i][1][1]]=SR[a[i][1][1]]+a[i][1][6];end;SV[a[i][1][1]]=SV[a[i][1][1]]+(a[i][2]-a[i][1][7])*a[i][1][5]*a[i][1][3];j=a[i][2]/a[i][1][7]*100-100;k=0;j=a[i][2]/a[i][1][7]*100-100;if j<-5 and a[i][2]~=0 then k=1;end;if a[i][1][5]>0 then j=a[i][2]/a[i][5][a[i][1][4]-1]*100-100;if j>3 or j<-3 then k=1;end;end;if k==0 and a[i][9]~=-1 then l=1;a[i][9]=-1;end;if k~=0 and a[i][9]==-1 then if f then a[i][2]=0;a[i][9]=InsertRow(T,-1);end;end;end;if l~=0 then if f then Clear(T);end;i=0;for i=0,N-1 do if a[i][9]~=-1 then a[i][2]=0;if f then a[i][9]=InsertRow(T,-1);end;end;end;end;C=C+1;end
function OnStop() f=false;end
function b(n) local i=0;a[n][1][5]=0;a[n][1][6]=0;while i<a[n][1][4] do a[n][1][5]=a[n][1][5]+a[n][5][i];a[n][1][6]=a[n][1][6]+a[n][5][i]*a[n][5][i+1]*a[n][1][3];i=i+2;end;if a[n][1][5]~=0 then a[n][1][7]=a[n][1][6]/a[n][1][5]/a[n][1][3];else a[n][1][7]=a[n][5][a[n][1][4]-1];end;end
function d0(s) s=tonumber(s);if s==math.floor(s) then s=math.floor(s) end return tostring(s);end
function e() f=false;message("Файл бракованный!");sleep(5000);end
function main() local i,j,s;CL={0,0x9900,0x99};f=true;c=0;C=0;N=0;T=0;a={};M={};M[0]=0;M[1]=0;M[2]=0;SP={};SV={};SR={};F=io.open(getScriptPath().."//T","r");if F==nil then e();return;end;for l in F:lines() do s=l:sub(1,1);if s=="_" then loadstring(l:sub(2))();end;if s~="-" and s~="_" then i=l:find("\1");if i==nil then e();return;end;a[N]={};a[N][1]={};a[N][1][0]=l:sub(1,i-1);l=l:sub(i+1);i=l:find("\2");if i==nil then e();return;end;a[N][0]=l:sub(1,i-1);if l:sub(i+2,i+2)~="\3" or l:sub(i+4,i+4)~="\t" then e();return;end;a[N][1][1]=tonumber(l:sub(i+1,i+1));a[N][1][2]=l:sub(i+3,i+3);l=l:sub(i+5);a[N][1][3]=getParamEx(a[N][1][0],a[N][0],"LOTSIZE").param_value;i=l:find("\t");if i==nil then e();return;end;a[N][2]=0;l=l:sub(i+1);a[N][3]=0;a[N][4]=0;a[N][5]={};j=0;while l:sub(1,1)~="#" do i=l:find("\t");if i==nil then e();return;end;s=l:sub(1,i-1);l=l:sub(i+1);i=s:find(":");if i==nil then e();return;end;a[N][5][j]=s:sub(1,i-1);a[N][5][j+1]=s:sub(i+1);j=j+2;end;a[N][1][4]=j;a[N][6]={};a[N][7]={};a[N][8]={};j=0;while j<12 do a[N][6][j]=0;a[N][7][j]=0;a[N][8][j]=0;j=j+1;end;l=l:sub(i+1);j=0;while j<12 do i=l:find("\4");if i==nil then break;end;i=l:find(":");if i==nil then e();return;end;a[N][6][j]=l:sub(2,i-1);l=l:sub(i+1);i=l:find(":");if i==nil then e();return;end;a[N][7][j]=l:sub(2,i-1);l=l:sub(i+1);i=l:find("\4");if i==nil then e();return;end;a[N][8][j]=l:sub(2,i-1);l=l:sub(i+1);j=j+1;end;a[N][9]=-1;b(N);N=N+1;end;end;F:close();T=AllocTable();AddColumn(T,1,"Тикер",true,QTABLE_STRING_TYPE,8);AddColumn(T,2,"Кол",true,QTABLE_STRING_TYPE,6);AddColumn(T,3,"Цена",true,QTABLE_STRING_TYPE,12);AddColumn(T,4,"Сумма",true,QTABLE_STRING_TYPE,12);AddColumn(T,5,"Затраты",true,QTABLE_STRING_TYPE,12);AddColumn(T,6,"Med",true,QTABLE_STRING_TYPE,12);AddColumn(T,7,"%",true,QTABLE_STRING_TYPE,12);AddColumn(T,8,"Last",true,QTABLE_STRING_TYPE,12);AddColumn(T,9,"%",true,QTABLE_STRING_TYPE,12);CreateWindow(T);SetWindowPos(T,0,0,900,560);R();F=io.open(getScriptPath().."//LOG","w");if F==nil then e();return;end;message("Скрипт запущен, акций: "..N);while f do sleep(1500);r();end;F:close();F=io.open(getScriptPath().."//TTT","w");if F==nil then e();return;end;i=0;while i<N do F:write(a[i][1][0].."\1"..a[i][0].."\2"..a[i][1][1].."\3"..a[i][1][2].."\t"..d0(a[i][2]).."\t");j=0;while j<a[i][1][4] do F:write(a[i][5][j]..":"..d0(a[i][5][j+1]).."\t");j=j+2;end;F:write("#");j=0;while j<12 do F:write(d0(a[i][6][j])..":"..d0(a[i][7][j])..":"..d0(a[i][8][j]).."\4");j=j+1;end;F:write("\n");i=i+1;end;F:close();message("Скрипт остановлен!");end
Не вы, магический шар: , но Владимир не понял знаков шара
Надо делать так, как надо. А как не надо - делать не надо.
Пользователь
Сообщений: Регистрация: 25.09.2020
15.10.2020 15:06:52
Старатель, И слава Богу, если попадает строка! Я уже ПРИНУДИТЕЛЬНО начал таблицы в "tostring" заворачивать! И плакался не раз, что руки-ноги бы этим "изобретателям динамической типизации" повыдёргивал с пожизненным запретом подходить к компу блиде, чем на километр! Если это строка, то почему tonumber на неё периодически ругается? Судя по всему, там то, что в данный момент интерпретатору в головожопу вдарит.
Надо делать так, как надо. А как не надо - делать не надо.
Пользователь
Сообщений: Регистрация: 23.01.2015
15.10.2020 15:14:27
Цитата
Владимир написал: Нет, ничего не смущает А что должно смущать?
ответ уже был дан:
Цитата
Sergey Gorokhov написал: Потому что SP[2] и SP["2"] - это разные вещи
Пользователь
Сообщений: Регистрация: 25.09.2020
15.10.2020 15:14:38
Старатель, Охренеть! Работает, и даже заголовок выводится! И что, это чудо сотворил один-единственный tonumber(SP[a[i][1][1]])?! Но ведь там же одна сплошная арифметика, и всё с такими же ячейками! Почему SR, SV и другие элементы работают? Их ведь не заворачивали в tonumber!
Пользователь
Сообщений: Регистрация: 25.09.2020
15.10.2020 15:16:56
Sergey Gorokhov, Спасибо я в курсе, что это разные вещи. Как в курсе и того, что этот долбаный "антиллехтуал" определяет тип данных как ему моча в голову вдарит! У меня ВСЕ элементы изначально строки, и заношу я их в таблицы именно как строки! Но в подавляющем большинстве случаев там с какого-то бодуна вдруг оказываются числа!
Пользователь
Сообщений: Регистрация: 25.09.2020
15.10.2020 15:21:20
Sergey Gorokhov,Вот, я писал в другой ветке 07.10.2020 22:23:20 Теперь крыша едет от преобразования типов: я заглатываю исходную информацию из файла (там, естественно, строки) и распихиваю её по своим таблицам (а там уже и строки, и целочисленные поля, и поля с плавающей точкой). Но я ПОНЯТИЯ НЕ ИМЕЮ по каким соображениям она присваивает данные и передаёт аргументы какого-то типа. Если строки - ругается math.floor, если предварительно поставить s=tonumber(s) - ругается на этот оператор (вернее, возвращает nil). Я уже до ручки дошёл: перед вызовом функции обуваю аргумент в tostring, а внутри функции переворачиваю его в tonumber - пофиг: "attempt to concatenate a nil value (local 's')".
Пользователь
Сообщений: Регистрация: 23.01.2015
15.10.2020 15:24:27
Владимир, Вынужден сделать второе предупреждение. не допускайте матерных и нецензурных слов при общении на форуме.
Пользователь
Сообщений: Регистрация: 27.01.2017
15.10.2020 15:25:33
А спецификацию языка недосуг прочитать:
Цитата
Приведения типов
Lua обеспечивает автоматическое преобразование между числами и строками во время выполнения программ. Любая числовая операция, примененная к строке, пытается преобразовать эту строку в число:
Lua применяет подобные преобразования не только в арифметических операциях, но и в других местах, где ожидается число, таких как аргумент math.sin. Верно и обратное — каждый раз, когда Lua находит число там, где ожидает строку, он преобразует это число в строку:
print(10 .. 20) --> 1020
(Операция .. служит в Lua для конкатенации строк. Когда вы записываете ее сразу после числа, вы должны отделить их друг от друга при помощи пробела; иначе Lua решит, что первая точка — это десятичная точка числа.)
Сегодня мы не уверены, что эти автоматические приведения типов были хорошей идеей в дизайне Lua. Как правило, лучше на них не рассчитывать. Они удобны в некоторых местах; но добавляют сложности как языку, так и программам, которые их используют. В конце концов, строки и числа — это разные вещи, несмотря на все эти преобразования. Сравнение вроде 10="10" дает в результате false, поскольку 10 — это число, а "10" — это строка.
Если вам нужно явно преобразовать строку в число, то вы можете воспользоваться функцией tonumber, которая возвращает nil, если строка не является правильным числом Lua:
line = io.read() -- читает строку n = tonumber(line) -- пытается преобразовать ее в число if n == nil then error(line .. " is not a valid number") else print(n*2) end
Для преобразования числа в строку вы можете использовать функцию tostring или конкатенировать число с пустой строкой: print(tostring(10) == "10") --> true print(10 .. "" == "10") --> true Эти преобразования всегда работают.
Отрывок из книги: Роберту Иерузалимски. «Программирование на языке Lua».
Возможно Вы привыкли, что компилятор вам дает безопасность типов. Но в lua это не так.
Вы в начале задаете индексы как числа, а потом обращаетесь к ним как к строке С нашей стороны было сделано предположение что Вам нужны индексы - числа, а не строки. Если нужны строки то используйте их везде
Код
function r()local i,j,k;c=c+1;if c==10 then c=0;R();end;for i=0,N-1 do if a[i][9]~=-1 then j=a[i][2];a[i][2]=getParamEx(a[i][1][0],a[i][0],"LAST").param_value;k=0xFFFFFF;if j~=a[i][2]then if tonumber(j)>tonumber(a[i][2]) then k=0xFFCCCC;end;if tonumber(j)<tonumber(a[i][2]) then k=0xCCCCFF;end;end;j=CL[a[i][1][1]];if tonumber(a[i][1][5])==0 then j=0x666666;end;if f then SetColor(T,a[i][9],QTABLE_NO_INDEX,k,j,-1,-1);end;if tonumber(a[i][2])==0 then if f then SetColor(T,a[i][9],1,0,0xFFFFFF,-1,-1);end;end;if f then SetCell(T,a[i][9],1,a[i][0]);end;if f then SetCell(T,a[i][9],2,d0(a[i][1][5]));end;if f then SetCell(T,a[i][9],3,d0(a[i][2]));end;if f then SetCell(T,a[i][9],4,string.format("%1.2f",a[i][2]*a[i][1][3]*a[i][1][5]));end;if f then SetCell(T,a[i][9],5,string.format("%1.2f",a[i][1][6]));end;if f then SetCell(T,a[i][9],6,d0(string.format("%1.3f",a[i][1][7])));end;if f then SetCell(T,a[i][9],7,string.format("%1.2f",a[i][2]/a[i][1][7]*100-100));end;j=a[i][5][a[i][1][4]-1];if f then SetCell(T,a[i][9],8,d0(j));end;j=a[i][2]/j*100-100;if j>5 then if f then SetColor(T,a[i][9],9,0xCCCCFF,0,-1,-1);end;end;if j<-5 then if f then SetColor(T,a[i][9],9,0xFFCCCC,0,-1,-1);end;end;if f then SetCell(T,a[i][9],9,string.format("%1.2f",j));end;end;end;SetWindowCaption(T,"R="..SP[0].."+"..M[0].."="..SV[0].."/"..SR[0].." D="..SP[1].."+"..M[1].."="..SV[1].."/"..SR[1].." E="..SP[2].."+"..M[2].."="..SV[2].."/"..SR[2]);end
function R()local i,j,k,l;l=0;SP["0"]=0;SP["1"]=0;SP["2"]=0;SV["0"]=0;SV["1"]=0;SV["2"]=0;SR["0"]=0;SR["1"]=0;SR["2"]=0;for i=0,N-1 do a[i][2]=getParamEx(a[i][1][0],a[i][0],"LAST").param_value;SP[a[i][1][1]]=tonumber(SP[a[i][1][1]])+a[i][1][6];j=a[i][2]/a[i][1][7]*100-100;if j > 1 then SR[a[i][1][1]]=SR[a[i][1][1]]+a[i][1][6];end;SV[a[i][1][1]]=SV[a[i][1][1]]+(a[i][2]-a[i][1][7])*a[i][1][5]*a[i][1][3];j=a[i][2]/a[i][1][7]*100-100;k=0;j=a[i][2]/a[i][1][7]*100-100;if j<-5 and a[i][2]~=0 then k=1;end;if a[i][1][5]>0 then j=a[i][2]/a[i][5][a[i][1][4]-1]*100-100;if j>3 or j<-3 then k=1;end;end;if k==0 and a[i][9]~=-1 then l=1;a[i][9]=-1;end;if k~=0 and a[i][9]==-1 then if f then a[i][2]=0;a[i][9]=InsertRow(T,-1);end;end;end;if l~=0 then if f then Clear(T);end;i=0;for i=0,N-1 do if a[i][9]~=-1 then a[i][2]=0;if f then a[i][9]=InsertRow(T,-1);end;end;end;end;C=C+1;end
function OnStop() f=false;end
function b(n) local i=0;a[n][1][5]=0;a[n][1][6]=0;while i<a[n][1][4] do a[n][1][5]=a[n][1][5]+a[n][5][i];a[n][1][6]=a[n][1][6]+a[n][5][i]*a[n][5][i+1]*a[n][1][3];i=i+2;end;if a[n][1][5]~=0 then a[n][1][7]=a[n][1][6]/a[n][1][5]/a[n][1][3];else a[n][1][7]=a[n][5][a[n][1][4]-1];end;end
function d0(s) s=tonumber(s);if s==math.floor(s) then s=math.floor(s) end return tostring(s);end
function e() f=false;message("Файл бракованный!");sleep(5000);end
function main() local i,j,s;CL={0,0x9900,0x99};f=true;c=0;C=0;N=0;T=0;a={};M={};M[0]=0;M[1]=0;M[2]=0;SP={};SV={};SR={};F=io.open(getScriptPath().."//T","r");if F==nil then e();return;end;for l in F:lines() do s=l:sub(1,1);if s=="_" then loadstring(l:sub(2))();end;if s~="-" and s~="_" then i=l:find("\1");if i==nil then e();return;end;a[N]={};a[N][1]={};a[N][1][0]=l:sub(1,i-1);l=l:sub(i+1);i=l:find("\2");if i==nil then e();return;end;a[N][0]=l:sub(1,i-1);if l:sub(i+2,i+2)~="\3" or l:sub(i+4,i+4)~="\t" then e();return;end;a[N][1][1]=l:sub(i+1,i+1);a[N][1][2]=l:sub(i+3,i+3);l=l:sub(i+5);a[N][1][3]=getParamEx(a[N][1][0],a[N][0],"LOTSIZE").param_value;i=l:find("\t");if i==nil then e();return;end;a[N][2]=0;l=l:sub(i+1);a[N][3]=0;a[N][4]=0;a[N][5]={};j=0;while l:sub(1,1)~="#" do i=l:find("\t");if i==nil then e();return;end;s=l:sub(1,i-1);l=l:sub(i+1);i=s:find(":");if i==nil then e();return;end;a[N][5][j]=s:sub(1,i-1);a[N][5][j+1]=s:sub(i+1);j=j+2;end;a[N][1][4]=j;a[N][6]={};a[N][7]={};a[N][8]={};j=0;while j<12 do a[N][6][j]=0;a[N][7][j]=0;a[N][8][j]=0;j=j+1;end;l=l:sub(i+1);j=0;while j<12 do i=l:find("\4");if i==nil then break;end;i=l:find(":");if i==nil then e();return;end;a[N][6][j]=l:sub(2,i-1);l=l:sub(i+1);i=l:find(":");if i==nil then e();return;end;a[N][7][j]=l:sub(2,i-1);l=l:sub(i+1);i=l:find("\4");if i==nil then e();return;end;a[N][8][j]=l:sub(2,i-1);l=l:sub(i+1);j=j+1;end;a[N][9]=-1;b(N);N=N+1;end;end;F:close();T=AllocTable();AddColumn(T,1,"Тикер",true,QTABLE_STRING_TYPE,8);AddColumn(T,2,"Кол",true,QTABLE_STRING_TYPE,6);AddColumn(T,3,"Цена",true,QTABLE_STRING_TYPE,12);AddColumn(T,4,"Сумма",true,QTABLE_STRING_TYPE,12);AddColumn(T,5,"Затраты",true,QTABLE_STRING_TYPE,12);AddColumn(T,6,"Med",true,QTABLE_STRING_TYPE,12);AddColumn(T,7,"%",true,QTABLE_STRING_TYPE,12);AddColumn(T,8,"Last",true,QTABLE_STRING_TYPE,12);AddColumn(T,9,"%",true,QTABLE_STRING_TYPE,12);CreateWindow(T);SetWindowPos(T,0,0,900,560);R();F=io.open(getScriptPath().."//LOG","w");if F==nil then e();return;end;message("Скрипт запущен, акций: "..N);while f do sleep(1500);r();end;F:close();F=io.open(getScriptPath().."//TTT","w");if F==nil then e();return;end;i=0;while i<N do F:write(a[i][1][0].."\1"..a[i][0].."\2"..a[i][1][1].."\3"..a[i][1][2].."\t"..d0(a[i][2]).."\t");j=0;while j<a[i][1][4] do F:write(a[i][5][j]..":"..d0(a[i][5][j+1]).."\t");j=j+2;end;F:write("#");j=0;while j<12 do F:write(d0(a[i][6][j])..":"..d0(a[i][7][j])..":"..d0(a[i][8][j]).."\4");j=j+1;end;F:write("\n");i=i+1;end;F:close();message("Скрипт остановлен!");end
Nikolay, Недосуг! Достаточно было увидеть: i="string" - это строка i=12345 - это уже число i={} - а теперь таблица i=true - а теперь boollean i="" - а теперь опять строка!
См. выше, что я говорил про "изобретателей" - возможно, там и были "матерные и нецензурные слова".
Пользователь
Сообщений: Регистрация: 25.09.2020
15.10.2020 15:35:57
Sergey Gorokhov, Мне нужно, чтобы я ЗНАЛ, какого типа мои переменные и был уверен, что она не поменяет свой тип через миллисекунду. Повторяю: я ВСЕ свои данные заношу как строки (впрочем, Вы это могли увидеть по коду). А вот как интерпретатор их ВОСПРИНИМАЕТ - этого я уже не знаю.
Пользователь
Сообщений: Регистрация: 23.01.2015
15.10.2020 15:47:21
Цитата
Владимир написал: Sergey Gorokhov , Какие ещё "матерные и нецензурные слова"?!
Вы прекрасно понимаете о чем речь, если нет перечитайте свои посты еще раз. Еще одно предупреждение и Вас заблокируют. Не используйте ненормативную лексику при написании сообщений.
Цитата
Владимир написал: , Мне нужно, чтобы я ЗНАЛ, какого типа мои переменные и был уверен, что она не поменяет свой тип через миллисекунду. Повторяю: я ВСЕ свои данные заношу как строки (впрочем, Вы это могли увидеть по коду). А вот как интерпретатор их ВОСПРИНИМАЕТ - этого я уже не знаю.
Проблема не в интерпретаторе, а в Вашем понимании что строка НЕ равно число. У Вас в Вашем же коде, индексы SP заданы как числа, а Вы пытаетесь обратиться к ним как к строкам. О чем Вам уже три человека сказали. Вы говорите что Вам нужны индексы строки, тогда почему Вы где-то используете числа а где-то строки?? проще и надежней везде использовать однотипный способ получения данных.
Вы сами запутались уже в своем же коде.
Вот это a[i][1][1] - должно быть числом а не строкой, о чем и было сказано выше
Пользователь
Сообщений: Регистрация: 25.09.2020
15.10.2020 15:51:48
Кстати, правильно мне советовал робот продать Нокию. Не послушался, а она начала падать.
Пользователь
Сообщений: Регистрация: 25.09.2020
15.10.2020 16:08:10
Sergey Gorokhov,Перечитал. Не нашёл ни единого примера "матерных матерных и нецензурных слов". "Головожопа", штоле, здесь считается "ненормативной лексикой"?
Ну не делайте из меня идиота! я прекрасно знаю, что строка НЕ равно число! В моём коде индексы SP НЕ "заданы как числа", и я НЕ "пытаюсь обратиться к ним как к строкам". Я лишь ПРЕДПОЛАГАЮ, что раз уж эта антиллехтуальная сволочь не даёт мне возможность самостоятельно описать тип данных, то должна же она ХОТЬ ЧТО-ТО соображать!
Я НЕ "использую числа а где-то строки" - Я НЕ ИМЕЮ ВОЗМОЖНОСТИ самостоятельно описать тип данных, а потому ВЫНУЖДЕН полагаться на антиллехт этого придурка! И у меня ВЕЗДЕ "однотипный способ получения данных" - код я Вам ПРИВЁЛ.
А это НЕ задание SP как числа - это всё тот же грёбаный "антиллехт"! Вот если написать: float SP=0; это было бы уже задание SP как числа! Не говоря уже про int SP=0; - о таком я и мечтать не смею!
Цитата
И наша рекомендация, на оборот, везде в индексах использовать числа, а не строки.
Блин, я ПЕРЕДАВАЛ! Ещё хуже! Только на строки надежда, ибо в Lua вообще ничего нет, кроме строк! Кстати, для интерпретатора это НОРМАЛЬНО! Между прочим, я вообще отказался передавать в таблицы Lua и числа, и строки -- язык путает ключи с индексами, а потому надежнее перебить все строки таблицы заново! Маразм? Конечно! А что делать?
А это НЕ задание SP как числа - это всё тот же грёбаный "антиллехт"! Вот если написать: float SP=0; это было бы уже задание SP как числа! Не говоря уже про int SP=0; - о таком я и мечтать не смею!
Цитата
И наша рекомендация, на оборот, везде в индексах использовать числа, а не строки.
Блин, я ПЕРЕДАВАЛ! Ещё хуже! Только на строки надежда, ибо в Lua вообще ничего нет, кроме строк! Кстати, для интерпретатора это НОРМАЛЬНО! Между прочим, я вообще отказался передавать в таблицы Lua и числа, и строки -- язык путает ключи с индексами, а потому надежнее перебить все строки таблицы заново! Маразм? Конечно! А что делать?
слушай, хорош бредить...
Пасхалочка для Алексея Иванникова:
Пользователь
Сообщений: Регистрация: 21.02.2015
15.10.2020 17:57:02
Цитата
написал:
Цитата
написал: ,
Цитата
Ваши посты переданы модератору для анализа.
::
Цитата
Разве? А это что?
А это НЕ задание SP как числа - это всё тот же грёбаный "антиллехт"! Вот если написать: float SP=0; это было бы уже задание SP как числа! Не говоря уже про int SP=0; - о таком я и мечтать не смею!
Цитата
И наша рекомендация, на оборот, везде в индексах использовать числа, а не строки.
Блин, я ПЕРЕДАВАЛ! Ещё хуже! Только на строки надежда, ибо в Lua вообще ничего нет, кроме строк! Кстати, для интерпретатора это НОРМАЛЬНО! Между прочим, я вообще отказался передавать в таблицы Lua и числа, и строки -- язык путает ключи с индексами, а потому надежнее перебить все строки таблицы заново! Маразм? Конечно! А что делать?
слушай, хорош бредить...
Вот я же говорил, Владимир, человек не адекватный.
Пользователь
Сообщений: Регистрация: 25.09.2020
16.10.2020 09:22:38
Sergey Gorokhov, Значит, говорите, "a[i][1][1] должно быть числом а не строкой"? Допустим. А "j", простите, ЧЕМ должно быть после j=a[i][1][1]? Я ведь ему присваиваю именно СТРОКУ, если Вам верить! Так с какого же бодуна j вдруг оказывается ЧИСЛОМ, и message(i..": SP["..j.."]="..SP[j]) вдруг даёт правильный результат, а message(i..": SP["..a[i][1][1].."]="..SP[j]) - неправильный?
Ладно, попробую ещё раз, предельно аккуратно присваивать переменным при инициализации именно тот тип данных, который там должен быть по смыслу. Целочисленные типы разработчики украли, но можно завернуть string.sub перед присвоением хотя бы в tonumber. Это в чистом виде Ваш совет:"И наша рекомендация, наоборот, везде в индексах использовать числа, а не строки. передавайте число а не строку в a[N][1][1]". Думаете, поможет? Ох, сомневаюсь! Я ведь это УЖЕ ДЕЛАЛ (хотя писал быстро, мог где-то что-то напутать), и пришёл к вывод, что надёжнее, наоборот, заворачивать всё как раз в tostring, а в числовой вид переводить непосредственно перед "арифметикой". Так и сделаю, если хранение в таблицах числовых данных снова начнёт глючить.
Пользователь
Сообщений: Регистрация: 23.01.2015
16.10.2020 10:09:00
Владимир, Если Вы сомневаетесь в компетенции поддержки, зачем тогда вообще спрашивать совета у поддержки? Спросите у того кому вверите.
Пользователь
Сообщений: Регистрация: 25.09.2020
16.10.2020 10:23:22
Sergey Gorokhov, Если бы я сомневался в компетенции поддержки, я бы вообще с вами не разговаривал. И вера - это не про меня: я должен убедиться в правильности (или неправильности) любого положения. В данном случае, я хочу разобраться, что лучше: хранить данные в таблицах именно как строки или как то, что они представляют по смыслу. Начну со второго.
Пользователь
Сообщений: Регистрация: 27.01.2017
16.10.2020 10:50:45
Странно, как мы все эти годы пишем на языке. И на других языках. И как-то все пишется. И строки из таблиц удаляются. Да, есть проблемы с переходом на новую версию, но они не столь критичны.
Может, все же, надо изучить язык прежде чем мысли озвучивать, да и другим советовать.
Владимир, к сведению, если хотите чтобы в таблице были только числовые индексы (и даже целочисленные), то это не сложно сделать.
Вот несложный конструктор:
Код
local typedT = function(key_type, value_type, allow_nil)
local val_t = {}
local proxy = {}
if allow_nil == nil then allow_nil = true end
local check_type = function(value, c_type)
if (c_type or '') == '' then return true end
if (('integer|float'):find(c_type)) then
return math.type(value) == c_type
end
return type(value) == c_type
end
local mt = {
__index = val_t,
__newindex = function (_, k, v)
if not check_type(k, key_type) then
error("attempt to index with "..(type(k) == 'number' and math.type(k) or type(k)).. " type", 2)
end
if (not allow_nil and v == nil) or (v ~= nil and not check_type(v, value_type)) then
error("attempt to set a value "..(type(v) == 'number' and math.type(v) or type(v)).. " type", 2)
end
val_t[k] = v
end
}
setmetatable(proxy, mt)
return proxy
end
local t = typedT('number')
Также можно сделать только readonly объекты, можно сделать и объекты заданного типа, просто с ними придется работать не как с переменными, а через getter и setter. Было бы желание.
Пользователь
Сообщений: Регистрация: 25.09.2020
16.10.2020 11:36:22
Nikolay, Строки-то из таблиц удаляются, только что при этом происходит с их идентификаторами? У меня вдруг начинает писать в неудалённую строку по другому месту, а вставляемые строки иногда вставляются не в конец таблицы, а через несколько промежуточных (пустых) строк. Это я говорю, разумеется, не про таблицы Lua, а только про таблицы визуализации - роботу они вообще не нужны, а для человека бывают весьма полезны.
Вот я и изучаю язык, в описании которого сказано: а) программист НЕ МОЖЕТ самостоятельно описать тип своих данных. б) Данные могут ПОМЕНЯТЬ свой тип в любой момент, если интерпретатор посчитает это нужным. В) В языке НЕТ целочисленных типов вообще - есть только NUMBER, который (теоретически) может быть и целочисленным, но это НИКАК не зависит от воли и желания программиста. г) В описании языка действительно говорится про ИНДЕКСЫ, но фактически никаких индексов в языке тоже НЕТ - есть только КЛЮЧИ, а это "две большие разницы". д) Насколько я вижу по коду, Ваш конструктор не устанавливает типы данных, а лишь определяет их, а возвращает и вообще proxy, который описан как таблица! Вы уверены, что Ваш local t = typedT('number') имеет действительно числовой (не говоря уже про целочисленный) тип? А если сразу после этого сделать t=""? И если вместо обычного описания int a; float b; string c; приходится ТАК извращаться, то это просто УБИЙСТВЕННАЯ характеристику языку! Кому и зачем это надо? Я уж лучше в момент записи данных в таблицы буду принудительно их заворачивать в tostring или tonumber (ещё не решил) и, при необходимости, "разворачивать" их в нужный тип в нужный момент. Если она И ПОСЛЕ ЭТОГО начнёт путать типы данных - это уже в морг.
Пользователь
Сообщений: Регистрация: 30.05.2020
16.10.2020 14:48:50
Цитата
Владимир написал: А если сразу после этого сделать t=""?
А если чай посолить?
Пользователь
Сообщений: Регистрация: 25.09.2020
16.10.2020 14:56:55
Незнайка, Если чай посолить, он будет солёный. А толку от всех этих трепыханий нуль целых хрен десятых.
Пользователь
Сообщений: Регистрация: 30.05.2020
16.10.2020 15:28:53
Владимир, замечательно. Теперь если перейти от обыденных примеров к программированию, то тоже самое, какой тип вы в переменную (или ячейку таблицы) положите, тот потом оттуда и достанете. Для вашего случая
Владимир написал: Но я ПОНЯТИЯ НЕ ИМЕЮ по каким соображениям она присваивает данные и передаёт аргументы какого-то типа.
Значит, мало практики ещё. Это вы ещё с вещественными числами мало работали. Когда обнаружите, что 0.1 + 0.2 ~= 0.3 ваш мир перевернётся. Не представляю, как вы это переживёте, если уже на типах вы сыпитесь.
Пользователь
Сообщений: Регистрация: 25.09.2020
16.10.2020 16:35:49
Незнайка, Да неужели? Не подскажете, почему же в моём примере a[i][1][1] - строка, а после j=a[i][1][1j вдруг оказывается ЧИСЛОМ? И почему добрая половина моих переменных, которые я ВСЕ ДО ЕДИНОГО заносил как строки вдруг оказываются числами? Так что не надо БРЕХАТЬ, милок, я СОВСЕМ НЕ ТО достаю, что положил - это только В НОРМАЛЬНЫХ языках такое происходит, но не в Lua или JS. Так что Вы ТОЖЕ "ПОНЯТИЯ НЕ ИМЕЕТЕ по каким соображениям она присваивает данные и передаёт аргументы какого-то типа". Как и 99% всех здесь присутствующих, включая службу поддержки.
Пользователь
Сообщений: Регистрация: 30.05.2020
16.10.2020 16:49:22
Владимир, дружочек, если за 40 лет горе-программист ничему не научился, то это о чём-то говорит. Вряд ли кто-то уже сможет вбить знания в его тупую башку. Пациент безнадёжен...
Пользователь
Сообщений: Регистрация: 25.09.2020
16.10.2020 17:09:52
Незнайка, Что, лапуль, перешли на тяфтяфки? Так и должно быть, ибо по делу Вам сказать тупо НЕЧЕГО.
Пользователь
Сообщений: Регистрация: 23.01.2015
16.10.2020 17:17:16
Цитата
Владимир написал: это только В НОРМАЛЬНЫХ языках такое происходит, но не в Lua или JS
В чем проблема выводить данные по DDE (или odbc) и ловить их в своем приложении на любом "нормальном" языке?