Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lua-尝试对字段';执行算术时出错';——这发生在for循环的末尾_Lua - Fatal编程技术网

Lua-尝试对字段';执行算术时出错';——这发生在for循环的末尾

Lua-尝试对字段';执行算术时出错';——这发生在for循环的末尾,lua,Lua,我正在为Ti nspire CX CAS计算器开发一个程序,在执行时,它在第52行指示一个错误,这显示在“area”函数中for循环的末尾。 对不起我的英语 local coX = {0,2,2,0} local coY = {0,0,2,0} local xmax = 2 local ymax = 2 -- Matriz de coordenadas para función "on.paint(gc)" function conCoor(x,y) local nx = x

我正在为Ti nspire CX CAS计算器开发一个程序,在执行时,它在第52行指示一个错误,这显示在“area”函数中for循环的末尾。 对不起我的英语

local coX = {0,2,2,0}
local coY = {0,0,2,0}
local xmax = 2
local ymax = 2

-- Matriz de coordenadas para función "on.paint(gc)"
function conCoor(x,y)
    local nx = x
    for i=1, #x do
        table.insert(nx,i*2,y[i])       
    end
    return nx
end

-- Valor absoluto
function math.abs(valor)
    if valor < 0 then
        valor = valor*(-1)
    end
    return valor
end

-- Inercia del polígono respecto el eje X
function inerciex(x,y)
    local E = 0
    local z =0
    for i = 1, #x-1 do
        E = (x[i+1]-x[i])*(y[i+1]+y[i])*((y[i+1])^2+(y[i])^2)
        z = E + z
    end
    return math.abs(z/12)
end

-- Inercia del polígono respecto el eje Y
function inerciey(x,y)
    local E = 0
    local z =0
    for i = 1, #x-1 do
        E = (y[i+1]-y[i])*(x[i+1]+x[i])*((x[i+1])^2+(x[i])^2)
        z = E + z
    end
    return math.abs(z/12)
end

-- Área del poligono
function area(x,y)
    local A = 0
    local z = 0
    for i = 1, #x-1 do
        A = (y[i]*x[i+1]-x[i]*y[i+1])
        z = A + z
    end -- Line 52, the line in question
    return math.abs(z/2)
end

-- Centro de masa del polígono (eje x)
function centroix(x,y)
    local Ac = area(x,y)
    local z = 0
    local cx = 0
    for i = 1, #x-1 do
        cx = (x[i]+x[i+1])*(x[i]*y[i+1]-x[i+1]*y[i])
        z = cx + z
    end
    return z/(6*Ac)
end

-- Centro de masa del polígono (eje y)
function centroiy(x,y)
    local Ac = area(x,y)
    local z = 0
    local cx = 0
    for i = 1, #x-1 do
        cx = (y[i]+y[i+1])*(x[i]*y[i+1]-x[i+1]*y[i])
        z = cx + z
    end
    return z/(6*Ac)
end

-- Escala de figura
function escala(xmax,ymax)
    local sc = 0
    if xmax > ymax then
        sc = 81/xmax
    else
        sc = 81/ymax
    end
    return math.floor(sc)
end

-- Coordenadas del origen en pantalla
function oriDispX(x,y,xmax,ymax)
    return math.floor(212 + (-1)*centroix(x,y)*escala(xmax,ymax))
end

function oriDispY(x,y,xmax,ymax)
    return math.floor(105 + (-1)*centroiy(x,y)*escala(xmax,ymax))
end

-- Cambio de coordenadas real
function coorCamb(x,y,xmax,ymax)
    -- Escalado de coordenadas
    local escx = x
    local escy = y
    local orix = oriDispX(escx,escy,xmax,ymax)
    local oriy = oriDispY(escx,escy,xmax,ymax)
    for i = 1, #escx do
        escx[i] = math.floor(escx[i]*escala(xmax,ymax))
        escy[i] = math.floor(escy[i]*escala(xmax,ymax))
    end
    -- Cambio de coordenadas
    for i = 1, #escx do
        escx[i] = escx[i] + orix
        escy[i] = escy[i] + oriy
    end
    return conCoor(escx,escy)
end

function on.paint(gc)
    local ox = oriDispX(coX,coY,xmax,ymax)
    local oy = oriDispY(coX,coY,xmax,ymax)
    local c = coorCamb(coX,coY,xmax,ymax)
    gc:drawPolyLine(c)
    gc:drawLine(ox-3,oy,ox+3,oy)
    gc:drawLine(ox,oy-3,ox,oy+3)
    gc:fillArc(ox-1,oy-1,2,2,0,360)
    gc:fillArc(212-1,105-1,2,2,0,360)
    gc:drawString(tostring(area(coX,coY)),10,10)
    platform.window:invalidate()
end

您的代码假定X和Y数组的大小相等(因为您对X和Y数组都使用i索引),或者至少Y从不小于X。但是,i索引从1运行到X数组的大小,这对于较小的Y数组无效

因此,如果Y数组小于X数组,则会得到该错误。下面是证据:

function area(x,y)
  local A = 0
  local z = 0
  for i = 1, #x-1 do
    A = (y[i]*x[i+1]-x[i]*y[i+1])
    z = A + z
  end
  return math.abs(z/2)
end

print(area({1,2,3},{4,5,6})) -- OK
print(area({1,2,3},{4,5})) -- ERROR

解决方案是在整个脚本开始时初始化变量和表,然后调用新值​​在on.paint函数中使用“var.recall”。

传递到
area()
的输入参数可能是错误的。错误到底是什么?@tonypdmtr-错误消息在标题中。您如何调用代码?我同意@EgorSkriptunoff;输入可能不正确,但我们不知道要查找什么,除非您告诉我们它是如何进行的。
function area(x,y)
  local A = 0
  local z = 0
  for i = 1, #x-1 do
    A = (y[i]*x[i+1]-x[i]*y[i+1])
    z = A + z
  end
  return math.abs(z/2)
end

print(area({1,2,3},{4,5,6})) -- OK
print(area({1,2,3},{4,5})) -- ERROR