lua 错误:尝试调用一个空值(字段 'getn')

以下是我使用 cairo 的 lua 代码片段

 cairo_set_source_rgba(cr, COLOR_FONT_R, COLOR_FONT_G, COLOR_FONT_B, 1)
  cairo_set_font_size(cr, 0.011 * WINDOW_HEIGHT)
  local ps_str = conky_parse("${exec ps -Ao comm,pcpu,%mem  --sort=-pcpu | head -n 15}")
  local processes = {}
  for line in string.gmatch(ps_str, '([^\n]+)') do
    table.insert(processes, line)
  end
  for line = 1,table.getn(processes) do
    cairo_move_to(cr, 0.213 * WINDOW_WIDTH, 0.443 * WINDOW_HEIGHT + line * 0.014 * WINDOW_HEIGHT)
    cairo_show_text(cr, processes[line])
  end
  cairo_stroke(cr)

但是,当我通过 conky 运行它时,我得到了以下错误(这是在离结束线五行的位置)。

我得到了错误:尝试调用一个空值(字段 'getn')

我尝试了一些在这里建议的东西,但我不确定如何修复它,所以想知道是否有一个简单的修复方法。

评论中的建议解决方案对上面的问题效果很好,但对以下问题无效:

function conky_geo_dotspiral(cx_str, cy_str, ...)
  local cx = conky_to_num(cx_str)
  local cy = conky_to_num(cy_str)
  local arms = math.ceil(24 / table.getn(arg)) * table.getn(arg)
  local rows = 10
  local radius0, radius1 = 50, 140
  local dotradius = 4
  for i,v_str in ipairs(arg) do
    v = conky_to_num(conky_parse(v_str))
    for j = i-1, arms - 1, table.getn(arg) do
      local p = j / arms
      for k = 0, v / rows  do
        local dx = cx + (radius0 + (radius1-radius0) * k/rows) * math.cos(p * 2*math.pi + k * math.pi/arms)
        local dy = cy + (radius0 + (radius1-radius0) * k/rows) * math.sin(p * 2*math.pi + k * math.pi/arms)
        cairo_arc (cr, dx, dy, dotradius, 0, 2 * math.pi)
        cairo_fill(cr)
      end
    end
  end
end

我得到了错误:

尝试调用一个空值(字段 'getn')

我尝试用 #arg 替换 table.getn (arg),但仍然出现错误。

conky:llua_do_call:函数 conky_geo_dotspiral 执行失败:conky_geometry.lua:155:尝试获取一个空值的长度(全局 'arg'
点赞
用户3236841
用户3236841

下面是修正过的代码片段:

cairo_set_source_rgba(cr, COLOR_FONT_R, COLOR_FONT_G, COLOR_FONT_B, 1)
cairo_set_font_size(cr, 0.011 * WINDOW_HEIGHT)
local ps_str = conky_parse("${exec ps -Ao comm,pcpu,%mem  --sort=-pcpu | head -n 15}")
local processes = {}
for line in string.gmatch(ps_str, '([^\n]+)') do
  table.insert(processes, line)
end
for line = 1,#processes do
  cairo_move_to(cr, 0.213 * WINDOW_WIDTH, 0.443 * WINDOW_HEIGHT + line * 0.014 * WINDOW_HEIGHT)
  cairo_show_text(cr, processes[line])
end
cairo_stroke(cr)

而修正后的第二个问题的代码片段如下:

function conky_geo_dotspiral(cx_str, cy_str, ...)
  local cx = conky_to_num(cx_str)
  local cy = conky_to_num(cy_str)
  local arms = math.ceil(24 / #arg) * #arg
  local rows = 10
  local radius0, radius1 = 50, 140
  local dotradius = 4
  for i,v_str in ipairs(arg) do
    v = conky_to_num(conky_parse(v_str))
    for j = i-1, arms - 1, #arg do
      local p = j / arms
      for k = 0, v / rows  do
        local dx = cx + (radius0 + (radius1-radius0) * k/rows) * math.cos(p * 2*math.pi + k * math.pi/arms)
        local dy = cy + (radius0 + (radius1-radius0) * k/rows) * math.sin(p * 2*math.pi + k * math.pi/arms)
        cairo_arc (cr, dx, dy, dotradius, 0, 2 * math.pi)
        cairo_fill(cr)
      end
    end
  end
  return ''
end

感谢对这段代码进行修正的所有建议。

2017-12-20 05:06:46