таблица lua.сбой сортировки при «попытке сравнить nil со строкой»

#lua #embedded-linux #yocto

#lua #встроенный-linux #yocto

Вопрос:

Я пытаюсь использовать lua на встроенном устройстве Linux. table.sort выдает проводную ошибку attempt to compare nil with string . Я привязал именно этот код к своему локальному интерпретатору lua, и он сработал. Что может вызвать такое поведение? Встроенный lua компилируется yocto .

 # lua
Lua 5.3.5  Copyright (C) 1994-2018 Lua.org, PUC-Rio
> a={}
> a[#a 1]="foo"
> a[#a 1]="baar"
> a[#a 1]="baar_1"
> a[#a 1]="baar_2"
> print(a[0])
nil
> print(#a)  
4
> for i=0,#a do print (a[i]) 
>> end
nil
foo
baar
baar_1
baar_2
> table.sort(a)
attempt to compare nil with string
stack traceback:
        [C]: in function 'table.sort'
        stdin:1: in main chunk
        [C]: in ?
> table.sort(a, function(x,y) print(x); print(y); return x < y end)
foo
baar_2
nil
baar_2
stdin:1: attempt to compare nil with string
stack traceback:
        stdin:1: in function <stdin:1>
        [C]: in function 'table.sort'
        stdin:1: in main chunk
        [C]: in ?
>  for key, val in pairs(a) do print(key, val) end
1       foo
2       baar
3       baar_1
4       baar_2
> 
  
  • (в обновлении # 1 добавлена печать)
  • (обновление # 2 добавило печать в table.sort)
  • (обновление # 3 добавило цикл над ключом / значением)

Комментарии:

1. Введите print(a[0]) и print(#a) в вашей консоли; затем for i=0,#a do print (a[i]) end . Вы можете увидеть nil или неожиданные индексы, такие как ноль.

2. @AlexanderMashin вы правы, a[0] nil и когда я перебираю таблицу, она начинается с 0, а не с 1

3. a[0] должно быть nil , поскольку массивы Lua начинаются с единицы. Вопрос в том, table.sort пытается ли сравнивать несуществующее значение, например a[0] .

4. Вот еще одна идея : table.sort(a, function(x,y) print(x); print(y); return x < y end) . Опять же, есть шанс увидеть неожиданные nil.

5. Где вы взяли исходный код, который вы скомпилировали? кажется, изначально были некоторые проблемы с yocto с 5.3 (кажется, некоторые библиотеки и функции не работали должным образом), но это было некоторое время назад.