Функции onInit, onStop, onClose

Страницы: Пред. 1 2 3 След.
RSS
Функции onInit, onStop, onClose
 
Магический шар подсказывает, что ТС путается в типах данных: положил в массив с ключом одного типа, а ищет в ячейке с ключом другого типа. Естественно, там nil
Надо делать так, как надо. А как не надо - делать не надо.
 
Владимир,
У Вас есть понимание что фраза "полная версия кода которая не работает." означает что в коде должно быть всё для того чтобы его можно было запустить и получить ошибку?
 
Ну и какой тип у a[i][1][1] Вы через message не увидите.
Добавьте в вывод хотя бы
message(i..": type(a[i][1][1]) "..type(a[i][1][1]))
 
Sergey Gorokhov, SP- строка (массив) на три числа, а - сложное, разветвлённое дерево объектов с разнообразной информацией по тикерам, отследить которое не представляется возможным. В частности, этот код выполняется в "большом" прерывании, инициализация - в main, визуализация результатов - малом,обновление - в разных местах.
 
Sergey Gorokhov, Сергей, я 40 лет программистом, причём системщик, был даже когда-то в соавторы бортовой операционки включён. Поверьте, я кое-что смыслю в программировании.  :smile:  
 
Цитата
Владимир написал:
Sergey Gorokhov, SP- строка (массив) на три числа, а - сложное, разветвлённое дерево объектов с разнообразной информацией по тикерам, отследить которое не представляется возможным. В частности, этот код выполняется в "большом" прерывании, инициализация - в main, визуализация результатов - малом,обновление - в разных местах.
В виде КОДА а не слов.
Цитата
Владимир написал:
Sergey Gorokhov, Сергей, я 40 лет программистом, причём системщик, был даже когда-то в соавторы бортовой операционки включён. Поверьте, я кое-что смыслю в программировании.  ::  

Для того чтобы выложить "полную версию кода которая не работает" не надо быть программистом
 
Sergey Gorokhov, Не вижу смысла. Тем более, что я за это время самостоятельно разобрался, почему возникают глюки.
 
Цитата
Владимир написал:
Sergey Gorokhov, Не вижу смысла. Тем более, что я за это время самостоятельно разобрался, почему возникают глюки.
Цитата
Sergey Gorokhov написал:
4) Если не хотите сотрудничать то увы ничем помочь не можем.
 
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
 
Цитата
Владимир написал:
Я абсолютно точно знаю, что мне пришлось бы МЕСЯЦ рассказывать, что и как делает код
НЕ надо ничего рассказывать.

Цитата
Владимир написал:
Вы хотели отслеживать a? Ну, рискните - вот её описание:
Никто у Вас не спрашивал "описание"

нужен просто код. Всё.
без слов.
без объяснений.
скопировать содержимое проблемного lua файла и вставить сюда.
так можно?
 
Sergey Gorokhov, Нет, нельзя. Что Вы с ним делать-то будете? Тем более, без описания.
 
Цитата
Владимир написал:
Что Вы с ним делать-то будете?
Читать.
Воспроизводить
Анализировать
И в итоге выдать решение проблемы или по крайней мере объяснить.
Цитата
Владимир написал:
Тем более, без описания.
но мне не нужно, поверьте я тоже программист и тоже с нехилым опытом.
 
Цитата
Владимир написал:
Нет, нельзя
почему? есть внятное объяснение?
Сомнение в нашей компетенции не является основанием.
 
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 продать.  :smile:  
 
Цитата
Владимир написал:
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 продать.  ::  

для полной картины не хватает содержимого файла "//T"
 
Sergey Gorokhov, Ну уж это файл я точно не дам - там информация о моих сделках содержится. Но по коду разобраться в его структуре вполне возможно :lol: !  
 
Владимир,
как и ожидалось у Вас в 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
 
Владимир, мельком глянул
Код
a[N][1][1]=l:sub(i+1,i+1)
ничего не смущает?
Надо делать так, как надо. А как не надо - делать не надо.
 
Старатель,
я раньше успел))

Владимир,
остальной код не проверял но наверняка там есть и другие похожие ошибки.
 
Цитата
Sergey Gorokhov написал:
я раньше успел))
Не вы, магический шар: #41, но Владимир не понял знаков шара  :lol:
Надо делать так, как надо. А как не надо - делать не надо.
 
Старатель, И слава Богу, если попадает строка! Я уже ПРИНУДИТЕЛЬНО начал таблицы в "tostring" заворачивать! И плакался не раз, что руки-ноги бы этим "изобретателям динамической типизации" повыдёргивал с пожизненным запретом подходить к компу блиде, чем на километр! Если это строка, то почему tonumber на неё периодически ругается? Судя по всему, там то, что в данный момент интерпретатору в головожопу вдарит.

Нет, ничего не смущает А что должно смущать?  :smile:  
 
Владимир,
Код
a[i][1][1] ~= 2
SP[a[i][1][1]] ~= SP[2]
SP["2"] = nil
Надо делать так, как надо. А как не надо - делать не надо.
 
Цитата
Владимир написал:
Нет, ничего не смущает А что должно смущать?    
ответ уже был дан:
Цитата
Sergey Gorokhov написал:
Потому что SP[2] и SP["2"] - это разные вещи
 
Старатель, Охренеть! Работает, и даже заголовок выводится! И что, это чудо сотворил один-единственный tonumber(SP[a[i][1][1]])?! Но ведь там же одна сплошная арифметика, и всё с такими же ячейками! Почему SR, SV и другие элементы работают? Их ведь не заворачивали в tonumber!
 
Sergey Gorokhov, Спасибо я в курсе, что это разные вещи. Как в курсе и того, что этот долбаный "антиллехтуал" определяет тип данных как ему моча в голову вдарит! У меня ВСЕ элементы изначально строки, и заношу я их в таблицы именно как строки! Но в подавляющем большинстве случаев там с какого-то бодуна вдруг оказываются числа!
 
Sergey Gorokhov,Вот, я писал в другой ветке 07.10.2020 22:23:20
Теперь крыша едет от преобразования типов: я заглатываю исходную информацию из файла (там, естественно, строки) и распихиваю её по своим таблицам (а там уже и строки, и целочисленные поля, и поля с плавающей точкой). Но я ПОНЯТИЯ НЕ ИМЕЮ по каким соображениям она присваивает данные и передаёт аргументы какого-то типа. Если строки - ругается math.floor, если предварительно поставить s=tonumber(s) - ругается на этот оператор (вернее, возвращает nil). Я уже до ручки дошёл: перед вызовом функции обуваю аргумент в tostring, а внутри функции переворачиваю его в tonumber - пофиг: "attempt to concatenate a nil value (local 's')".
 
Владимир,
Вынужден сделать второе предупреждение.
не допускайте матерных и нецензурных слов при общении на форуме.
 
А спецификацию языка недосуг прочитать:
Цитата
Приведения типов

Lua обеспечивает автоматическое преобразование между числами и строками во время выполнения программ. Любая числовая операция, примененная к строке, пытается преобразовать эту строку в число:

print("10" + 1)         --> 11
print("10 + 1")         --> 10 + 1
print("-5.3e-10"*"2")   --> -1.06e-09
print("hello" + 1)      -- ОШИБКА (невозможно преобразовать "hello")

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
 
Sergey Gorokhov, Какие ещё "матерные и нецензурные слова"?!

Nikolay, Недосуг! Достаточно было увидеть:
i="string" - это строка
i=12345 - это уже число
i={} - а теперь таблица
i=true - а теперь boollean
i="" - а теперь опять строка!

См. выше, что я говорил про "изобретателей" - возможно, там и были "матерные и нецензурные слова".  :smile:  
 
Sergey Gorokhov, Мне нужно, чтобы я ЗНАЛ, какого типа мои переменные и был уверен, что она не поменяет свой тип через миллисекунду. Повторяю: я ВСЕ свои данные заношу как строки (впрочем, Вы это могли увидеть по коду). А вот как интерпретатор их ВОСПРИНИМАЕТ - этого я уже не знаю.
 
Цитата
Владимир написал:
Sergey Gorokhov , Какие ещё "матерные и нецензурные слова"?!
Вы прекрасно понимаете о чем речь, если нет перечитайте свои посты еще раз.
Еще одно предупреждение и Вас заблокируют.
Не используйте ненормативную лексику при написании сообщений.

Цитата
Владимир написал:
Sergey Gorokhov, Мне нужно, чтобы я ЗНАЛ, какого типа мои переменные и был уверен, что она не поменяет свой тип через миллисекунду. Повторяю: я ВСЕ свои данные заношу как строки (впрочем, Вы это могли увидеть по коду). А вот как интерпретатор их ВОСПРИНИМАЕТ - этого я уже не знаю.

Проблема не в интерпретаторе, а в Вашем понимании что строка НЕ равно число.
У Вас в Вашем же коде, индексы SP заданы как числа, а Вы пытаетесь обратиться к ним как к строкам.
О чем Вам уже три человека сказали.
Вы говорите что Вам нужны индексы строки, тогда почему Вы где-то используете числа а где-то строки??
проще и надежней везде использовать однотипный способ получения данных.

Вы сами запутались уже в своем же коде.

Вот это a[i][1][1] - должно быть числом а не строкой, о чем и было сказано выше #67
 
Кстати, правильно мне советовал робот продать Нокию. Не послушался, а она начала падать.  :smile:  
 
Sergey Gorokhov,Перечитал. Не нашёл ни единого примера "матерных матерных и нецензурных слов". "Головожопа", штоле, здесь считается "ненормативной лексикой"?

Ну не делайте из меня идиота! я прекрасно знаю, что строка НЕ равно число! В моём коде индексы SP НЕ "заданы как числа", и я НЕ "пытаюсь обратиться к ним как к строкам". Я лишь ПРЕДПОЛАГАЮ, что раз уж эта антиллехтуальная сволочь не даёт мне возможность самостоятельно описать тип данных, то должна же она ХОТЬ ЧТО-ТО соображать!

Я НЕ "использую числа а где-то строки" - Я НЕ ИМЕЮ ВОЗМОЖНОСТИ самостоятельно описать тип данных, а потому ВЫНУЖДЕН полагаться на антиллехт этого придурка! И у меня ВЕЗДЕ "однотипный способ получения данных" - код я Вам ПРИВЁЛ.
 
Цитата
Владимир написал:
Перечитал
Ваши посты переданы модератору для анализа.

Цитата
Владимир написал:
В моём коде индексы SP НЕ "заданы как числа"
Разве? А это что?
Код
SP[2]=0;


И наша рекомендация, на оборот, везде в индексах использовать числа, а не строки.
передавайте число а не строку в a[N][1][1]
Код
a[N][1][1]=tonumber(l:sub(i+1,i+1))
 
Sergey Gorokhov,
Цитата
Ваши посты переданы модератору для анализа.
:smile:
Цитата
Разве? А это что?
А это НЕ задание SP как числа - это всё тот же грёбаный "антиллехт"! Вот если написать:
float SP=0;
это было бы уже задание SP как числа! Не говоря уже про
int SP=0; - о таком я и мечтать не смею!
Цитата
И наша рекомендация, на оборот, везде в индексах использовать числа, а не строки.
Блин, я ПЕРЕДАВАЛ! Ещё хуже! Только на строки надежда, ибо в Lua вообще ничего нет, кроме строк! Кстати, для интерпретатора это НОРМАЛЬНО! Между прочим, я вообще отказался передавать в таблицы Lua и числа, и строки -- язык путает ключи с индексами, а потому надежнее перебить все строки таблицы заново! Маразм? Конечно! А что делать?
 
Цитата
Владимир написал:
Sergey Gorokhov,  
Цитата
Ваши посты переданы модератору для анализа.
 ::
Цитата
Разве? А это что?
А это НЕ задание SP как числа - это всё тот же грёбаный "антиллехт"! Вот если написать:
float SP=0;
это было бы уже задание SP как числа! Не говоря уже про
int SP=0; - о таком я и мечтать не смею!
Цитата
И наша рекомендация, на оборот, везде в индексах использовать числа, а не строки.
Блин, я ПЕРЕДАВАЛ! Ещё хуже! Только на строки надежда, ибо в Lua вообще ничего нет, кроме строк! Кстати, для интерпретатора это НОРМАЛЬНО! Между прочим, я вообще отказался передавать в таблицы Lua и числа, и строки -- язык путает ключи с индексами, а потому надежнее перебить все строки таблицы заново! Маразм? Конечно! А что делать?
слушай, хорош бредить...
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Цитата
s_mike@rambler.ru написал:
Цитата
Владимир написал:
Sergey Gorokhov ,  
Цитата
Ваши посты переданы модератору для анализа.
  ::
 
Цитата
Разве? А это что?
 А это НЕ задание SP как числа - это всё тот же грёбаный "антиллехт"! Вот если написать:
float SP=0;
это было бы уже задание SP как числа! Не говоря уже про
int SP=0; - о таком я и мечтать не смею!  
Цитата
И наша рекомендация, на оборот, везде в индексах использовать числа, а не строки.
 Блин, я ПЕРЕДАВАЛ! Ещё хуже! Только на строки надежда, ибо в Lua вообще ничего нет, кроме строк! Кстати, для интерпретатора это НОРМАЛЬНО! Между прочим, я вообще отказался передавать в таблицы Lua и числа, и строки -- язык путает ключи с индексами, а потому надежнее перебить все строки таблицы заново! Маразм? Конечно! А что делать?
слушай, хорош бредить...
Вот я же говорил, Владимир, человек не адекватный.
 
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, а в числовой вид переводить непосредственно перед "арифметикой". Так и сделаю, если хранение в таблицах числовых данных снова начнёт глючить.
 
Владимир,
Если Вы сомневаетесь в компетенции поддержки, зачем тогда вообще спрашивать совета у поддержки?
Спросите у того кому вверите.
 
Sergey Gorokhov, Если бы я сомневался в компетенции поддержки, я бы вообще с вами не разговаривал. И вера - это не про меня: я должен убедиться в правильности (или неправильности) любого положения. В данном случае, я хочу разобраться, что лучше: хранить данные в таблицах именно как строки или как то, что они представляют по смыслу. Начну со второго.
 
Странно, как мы все эти годы пишем на языке. И на других языках.
И как-то все пишется. И строки из таблиц удаляются. Да, есть проблемы с переходом на новую версию, но они не столь критичны.


Может, все же, надо изучить язык прежде чем мысли озвучивать, да и другим советовать.

Владимир, к сведению, если хотите чтобы в таблице были только числовые индексы (и даже целочисленные), то это не сложно сделать.

Вот несложный конструктор:

Код
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.
Было бы желание.
 
Nikolay, Строки-то из таблиц удаляются, только что при этом происходит с их идентификаторами? У меня вдруг начинает писать в неудалённую строку по другому месту, а вставляемые строки иногда вставляются не в конец таблицы, а через несколько промежуточных (пустых) строк. Это я говорю, разумеется, не про таблицы Lua, а только про таблицы визуализации - роботу они вообще не нужны, а для человека бывают весьма полезны.

Вот я и изучаю язык, в описании которого сказано:
а) программист НЕ МОЖЕТ самостоятельно описать тип своих данных.
б) Данные могут ПОМЕНЯТЬ свой тип в любой момент, если интерпретатор посчитает это нужным.
В) В языке НЕТ целочисленных типов вообще - есть только NUMBER, который (теоретически) может быть и целочисленным, но это НИКАК не зависит от воли и желания программиста.
г) В описании языка действительно говорится про ИНДЕКСЫ, но фактически никаких индексов в языке тоже НЕТ - есть только КЛЮЧИ, а это "две большие разницы".
д) Насколько я вижу по коду, Ваш конструктор не устанавливает типы данных, а лишь определяет их, а возвращает и вообще proxy, который описан как таблица! Вы уверены, что Ваш local t = typedT('number') имеет действительно числовой (не говоря уже про целочисленный) тип? А если сразу после этого сделать t=""? И если вместо обычного описания int a; float b; string c; приходится ТАК извращаться, то это просто УБИЙСТВЕННАЯ характеристику языку! Кому и зачем это надо? Я уж лучше в момент записи данных в таблицы буду принудительно их заворачивать в tostring или tonumber (ещё не решил) и, при необходимости, "разворачивать" их в нужный тип в нужный момент. Если она И ПОСЛЕ ЭТОГО начнёт путать типы данных - это уже в морг.
 
Цитата
Владимир написал:
А если сразу после этого сделать t=""?
А если чай посолить?
 
Незнайка, Если чай посолить, он будет солёный. А толку от всех этих трепыханий нуль целых хрен десятых.
 
Владимир, замечательно.
Теперь если перейти от обыденных примеров к программированию, то тоже самое, какой тип вы в переменную (или ячейку таблицы) положите, тот потом оттуда и достанете.
Для вашего случая
Код
a[i][1][1] = "2"
P[a[i][1][1]] = P["2"]

a[i][1][1] = tonumber("2")
P[a[i][1][1]] = P[2]

Цитата
Владимир написал:
я 40 лет программистом
Цитата
Владимир написал:
Но я ПОНЯТИЯ НЕ ИМЕЮ по каким соображениям она присваивает данные и передаёт аргументы какого-то типа.
Значит, мало практики ещё.
Это вы ещё с вещественными числами мало работали. Когда обнаружите, что 0.1 + 0.2 ~= 0.3 ваш мир перевернётся.
Не представляю, как вы это переживёте, если уже на типах вы сыпитесь.
 
Незнайка, Да неужели? Не подскажете, почему же в моём примере a[i][1][1] - строка, а после j=a[i][1][1j вдруг оказывается ЧИСЛОМ? И почему добрая половина моих переменных, которые я ВСЕ ДО ЕДИНОГО заносил как строки вдруг оказываются числами?  :wink: Так что не надо БРЕХАТЬ, милок, я СОВСЕМ НЕ ТО достаю, что положил - это только В НОРМАЛЬНЫХ языках такое происходит, но не в Lua или JS. Так что Вы ТОЖЕ "ПОНЯТИЯ НЕ ИМЕЕТЕ по каким соображениям она присваивает данные и передаёт аргументы какого-то типа". Как и 99% всех здесь присутствующих, включая службу поддержки.
 
Владимир, дружочек, если за 40 лет горе-программист ничему не научился, то это о чём-то говорит.
Вряд ли кто-то уже сможет вбить знания в его тупую башку.
Пациент безнадёжен...
 
Незнайка, Что, лапуль, перешли на тяфтяфки? Так и должно быть, ибо по делу Вам сказать тупо НЕЧЕГО.  :wink:  
 
Цитата
Владимир написал:
это только В НОРМАЛЬНЫХ языках такое происходит, но не в Lua или JS

В чем проблема выводить данные по DDE (или odbc) и ловить их в своем приложении на любом "нормальном" языке?
Страницы: Пред. 1 2 3 След.
Читают тему
Наверх