Меню

Attempt to call global a nil value ошибка

When executing this code I get an error «attempt to call global ‘forId’ (a nil value)”

function execute(args)
    local itemid = 526
    local bone = forId(itemid) -- this is where the error occurs
end

function forId(bid) 
    local xp = 0.0
    if bid == 526 or bid == 528 or bid == 2530 or bid == 2859 then
        xp = 4.5
    elseif bid == 3179 or bid == 3180 or bid == 3183 or bid == 3185 then
        xp = 5.0
    elseif bid == 530 then
        xp = 53
    elseif bid == 532 or bid == 3125 then
        xp = 15
    elseif bid == 4812 then
        xp = 22.5
    elseif bid == 7839 then
        xp = 30
    elseif bid == 6812 then
        xp = 50
    elseif bid == 536 then
        xp = 72
    end
    local bone = Bone:new(bid, xp)
    return bone
end

Bone = class(function(b, id, xp)
    b.id = id
    b.xp = xp
end)

Can anyone tell me why?

Doug Currie's user avatar

Doug Currie

40.3k1 gold badge95 silver badges119 bronze badges

asked Apr 17, 2011 at 15:19

Connor's user avatar

Lua processes and executes files line by line so the order you define them and use them can be important. In this case though it appears you aren’t providing all the code because it looks like you are defining forID as a global but the error implies otherwise. You can simply try altering the order the functions are defined in to see if it works.

Bone = class(function(b, id, xp)
    b.id = id
    b.xp = xp
end)

function forId(bid) 
    local xp = 0.0
    if bid == 526 or bid == 528 or bid == 2530 or bid == 2859 then
        xp = 4.5
    elseif bid == 3179 or bid == 3180 or bid == 3183 or bid == 3185 then
        xp = 5.0
    elseif bid == 530 then
        xp = 53
    elseif bid == 532 or bid == 3125 then
        xp = 15
    elseif bid == 4812 then
        xp = 22.5
    elseif bid == 7839 then
        xp = 30
    elseif bid == 6812 then
        xp = 50
    elseif bid == 536 then
        xp = 72
    end
    local bone = Bone:new(bid, xp)
    return bone
end

function execute(args)
    local itemid = 526
    local bone = forId(itemid) -- this is where the error occurs
end

But since you haven’t provided the full code this might just cause the error to shift elsewhere.

answered Apr 17, 2011 at 18:22

Arrowmaster's user avatar

ArrowmasterArrowmaster

9,0732 gold badges28 silver badges25 bronze badges

try caching it as a local first, especially if your using module:

local forId = forId //or _G.forId
local bone = forId(itemid)

answered Apr 17, 2011 at 16:03

Necrolis's user avatar

NecrolisNecrolis

25.5k3 gold badges63 silver badges101 bronze badges

1

i think, you should include a library file at first, like i.e.

dofile(core.app_path() .. "\strategies\standard\include\helper.lua");

( the exact command can be found in the documentaries of your software. )

answered Jan 18, 2016 at 19:38

T.Todua's user avatar

T.ToduaT.Todua

51.1k19 gold badges223 silver badges225 bronze badges

bLib = {}
bLib['mimgui'],     imgui         = pcall(require, 'mimgui')
bLib['ffi'],         ffi         = pcall(require, 'ffi')
bLib['inicfg'],     inicfg         = pcall(require, 'inicfg')
bLib['encoding'],     encoding     = pcall(require, 'encoding')
bLib['fAwesome5'],     fa             = pcall(require, 'fAwesome5')
bLib['Events'],        sampev         = pcall(require, 'samp.events')
bLib['requests'],    requests     = pcall(require, 'requests')
bLib['Matrix3X3'],    Matrix3X3     = pcall(require, 'matrix3x3')
bLib['Vector3D'],    Vector3D     = pcall(require, 'vector3d')
bLib['effil'],        effil         = pcall(require, 'effil')
bLib['Memory'],        memory         = pcall(require, 'memory')
bLib['bit'],        bit         = pcall(require, 'bit')
bLib['Copas'],        copas         = pcall(require, 'copas')
bLib['Http'],        http         = pcall(require, 'copas.http')

for lib, bool in pairs(bLib) do
    if not bool then
        ShowPlayerMessage('Библиотека ' .. lib .. ' не найдена. Запуск скрипта остановлен!', 0x2DF61C)
        break
    end
end

function ShowPlayerMessage(message, color)
    sampAddChatMessage("[CheatHelper] {FFFFFF}" .. message, color or 0x2DF61C)
end

Главная » Основные форумы » Программирование на языке Lua

Страницы:
1

 

Serge


Пользователь

Сообщений: 10
Регистрация: 09.06.2022

#1

09.06.2022 14:55:30

Где ошибка?

MyVar = foo(1,2)—>attempt to call a nil value (global ‘foo’)

function foo(a,b)
   return a + b
end

 

Nikolay


Пользователь

Сообщений: 698
Регистрация: 27.01.2017

#2

09.06.2022 14:57:46

В момент вызова foo она еще не определена.
Код в теле скрипта выполняется построчно вниз, определяя контекст.

https://nick-nh.github.io/
https://github.com/nick-nh/qlua

 

Serge


Пользователь

Сообщений: 10
Регистрация: 09.06.2022

#3

09.06.2022 15:48:21

Цитата
Nikolay написал:
В момент вызова foo она еще не определена.
Код в теле скрипта выполняется построчно вниз, определяя контекст.

Благодарю)

 

Владимир


Пользователь

Сообщений: 1588
Регистрация: 25.09.2020

#4

09.06.2022 16:16:52

Nikolay, Как это «в момент вызова foo она еще не определена»? У меня в скрипте первой функцией стоит main, а за ней ещё десятка два, обычно по алфавиту. Всегда все всё прекрасно видят. Да и Квик перед запуском делает что-то вроде компиляции кода.

 

Serge


Пользователь

Сообщений: 10
Регистрация: 09.06.2022

#5

09.06.2022 17:12:44

Цитата
Владимир написал:
Nikolay, Как это «в момент вызова foo она еще не определена»? У меня в скрипте первой функцией стоит main, а за ней ещё десятка два, обычно по алфавиту. Всегда все всё прекрасно видят. Да и Квик перед запуском делает что-то вроде компиляции кода.

Это зависит из какой области вызывается выражение

Если вызов переменной (функции) происходит из main() а сама переменная объявлена за пределами main() (например в body() или во внешнем подключенном файле), то ошибки не будет,
тк код внутри main() выполняется после кода из body()

Но если объявление также как и вызов внутри main() то порядок имеет значение — сперва объявление, потом обращение.

 

Serge


Пользователь

Сообщений: 10
Регистрация: 09.06.2022

#6

09.06.2022 17:18:56

например, так работает:
function main()
   PrintDbgStr(tostring(foo())) —>1
end

function foo()
   return 1
end

а так — нет:

function main()

   PrintDbgStr(tostring(foo()))—>attempt to call a nil value (global ‘foo’)

   function foo()
       return 1
   end

end

 

nikolz


Пользователь

Сообщений: 2487
Регистрация: 30.01.2015

#7

09.06.2022 18:20:16

Цитата
Владимир написал:
Nikolay, Как это «в момент вызова foo она еще не определена»? У меня в скрипте первой функцией стоит main, а за ней ещё десятка два, обычно по алфавиту. Всегда все всё прекрасно видят. Да и Квик перед запуском делает что-то вроде компиляции кода.

Функция main — это дополнительный поток для скрипта и вызывается основным потоком квик после того как весь скрипт загружен,  
и все функции в этот момент уже определены.
—————————
Учите мат часть.

 

Владимир


Пользователь

Сообщений: 1588
Регистрация: 25.09.2020

#8

09.06.2022 19:10:00

Serge, При чём тут вооще «из какой области вызывается выражение»? Эта дура его НЕ ВИДИТ! Глобальные переменные у меня действительно объявлены до main, но, полагаю, и это не имеет значения (в смысле, НЕ ДОЛЖНО иметь значения). Я не помню, есть ли у меня неинициализированные глобальные переменные (скорее всего, нет), но, полаю, и это не должно иметь никакого значения — здесь переменные глобальные по умолчанию (что есть ещё один идиотизм языка). Я же говорил не о переменных, а о функциях, которые по определению «объявлены за пределами main».

Чо ещё за «body» здесь нарисовалось?  :smile: ЧАВО???!!! Что, ФУНКЦИИ «объявляются внутри main»?! Воистину, программисты вымерли!

nikolz, Лапуль, мне

НАСРАТЬ на всю эту клиническую мутоту с потоками, которая вдарила в головожопы создателей этого, с позволения сказать, «языка». Я в своё время потратил две или три недели, чтобы гарантированно перенести все операции именно в поток main (три стека для этого пришлось завести!), и с тех пор горя не знаю. Так В ГРОБУ я видел такую «матчасть» — учите сами! :wink:  

 

Serge


Пользователь

Сообщений: 10
Регистрация: 09.06.2022

#9

09.06.2022 20:07:58

Цитата
Владимир написал:
Serge, При чём тут вооще «из какой области вызывается выражение»? Эта дура его НЕ ВИДИТ! Глобальные переменные у меня действительно объявлены до main, но, полагаю, и это не имеет значения (в смысле, НЕ ДОЛЖНО иметь значения). Я не помню, есть ли у меня неинициализированные глобальные переменные (скорее всего, нет), но, полаю, и это не должно иметь никакого значения — здесь переменные глобальные по умолчанию (что есть ещё один идиотизм языка). Я же говорил не о переменных, а о функциях, которые по определению «объявлены за пределами main».

Чо ещё за «body» здесь нарисовалось?  :: ЧАВО???!!! Что, ФУНКЦИИ «объявляются внутри main»?! Воистину, программисты вымерли!

nikolz, Лапуль, мне   НАСРАТЬ на всю эту клиническую мутоту с потоками, которая вдарила в головожопы создателей этого, с позволения сказать, «языка». Я в своё время потратил две или три недели, чтобы гарантированно перенести все операции именно в поток main (три стека для этого пришлось завести!), и с тех пор горя не знаю. Так В ГРОБУ я видел такую «матчасть» — учите сами!  

Вы интересовались откуда взялось «боди» — об этм можно узнать из первых страниц документации по Qlua

https://euvgub.github.io/QLua_QUIK/index.html?page=1

в остальном, увы, не знаю как вам можно помочь…

 

Владимир


Пользователь

Сообщений: 1588
Регистрация: 25.09.2020

#10

09.06.2022 20:20:55

Serge, Да плевать мне, откуда взялось «боди»! Для полноценного программирования на Lua это нафиг не нужно.

А мне помогать не надо — мне помогли давно, в первые месяцы моего пребывания здесь. А теперь мой скрипт давно прекрасно работает и прекрасно зарабатывает. Я уже забыл, когда последний раз искал на свою жопу приключений и потому сроду не видывал диагностики, подобной той, которая вынесена в заголовок.

Страницы:
1

Читают тему (гостей: 1)

Attempt to call a nil value

Description: calling a function that doesn’t exist

printtt(«abc») — printtt is not a function

test() — calling before it’s defined, same error

Unexpected symbol near ‘something’

Description: an invalid character is placed next to a value/keyword/variable/function call

function abc()) end — unexpected symbol near ‘)’

a l= 15 — unexpected symbol near ‘l’

local a = 5] — unexpected symbol near ‘]’

Attempt to index global ‘variable’ (a nil value)

Description: indexing via [key] or .key for a variable that doesn’t exist

abc.x = 5 — abc is nil, error

abc = {} — abc defined here

xyz[‘x’] = ‘abc’ — xyz is nil, error

Attempt to perform arithmetic on a nil value

Description: performing arithmetic (*, /, -, +, %, ^) on a nil value

print(xyz + 5) — error, xyz not defined

a = a + 5 — error, a not defined

Attempt to perform arithmetic on field ‘?’ (a nil value)

Description: performing arithmetic (*, /, -, +, %, ^) on a nil value

Attempt to compare nil with <TYPE>

Description: using a comparison operator (<, >, ~=, ==, >=, <=) in which one side is a nil value

print(x < y) — y is not defined

Malformed number near <NUMBER>

Description: the number has an invalid character next to it

print(12345aaa) — aaa makes it a malformed number

Unfinished capture | Malformed pattern

Description: the pattern is missing a closing ), or a closing ]

print(string.match(‘ABC’, ‘(‘)) — unfinished capture

print(string.match(‘ABC’, ‘[‘)) — malformed pattern

When you get an error, Lua provides a stack trace showing you where it originates from, where the error occurs, the function calls that led to the error, and the line number of where it occurred.

A general error will look like this:

file_location:LINE NUMBER: error message

file_location:LINE NUMBER: in <local/function> ‘FUNC’

file_location:LINE NUMBER: in main chunk

C:Usersuserlua_file.lua:5: attempt to perform arithmetic on a nil value (field ‘x’)

C:Usersuserlua_file.lua:5: in local ‘c’

C:Usersuserlua_file.lua:7: in local ‘b’

C:Usersuserlua_file.lua:9: in function ‘a’

C:Usersuserlua_file.lua:12: in main chunk

The code that resulted in this error is:

Here you can see the line number 5 after the file location, which tells us where the exact line with the code that resulted in the error. The stack traceback shows the functions that were called that led up to that.

First, function a is called at line 12, then function b is called at line 9 inside of a, then c is called at line 7 inside of function b, and finally at line 5, the error occurs inside of function c.

A note to add is that comments can offset the line number and make it appear as the error is in a line that doesn’t exist or doesn’t look like an error,

ВНИМАНИЕ! КОММЕНТАРИИ ПЕРВОГО УРОВНЯ В ВОПРОСАХ УПОРЯДОЧИВАЮТСЯ ПО ЧИСЛУ ПЛЮСИКОВ, А НЕ ПО ВРЕМЕНИ ПУБЛИКАЦИИ.

local stopped = false
function OnStop()
stopped = true
return 2000
end

function main ()
local SecCode = «GZZ9»
local PriceRTSBuy = getParamEx(«SPBFUT», SecCode, «LAST»).param_value
local LimitOrderBuy = {
[«ACTION»] =«NEW_ORDER»,
[«ACCOUNT»] =«SPBFUT000ve»,
[«OPERATION»] =«B»,
[«CLASSCODE»] =«SPBFUT»,
[«SECCODE»] = SecCode,
[«PRICE»] = (PriceRTSBuy — 50),
[«QUANTITY»] = 1,
[«TRAND_ID»] = 228322,
}
local Err_Order=SendTransaction(LimitOrderBuy)
message («Err_Order»)
end

avatar

  • 27 сентября 2019, 21:01
  • Ответить

    Еще

Hired, тут куча ошибок!

1) функция message должна иметь формат message(«Текст сообщения»,1)
2) в PriceRTSBuy Вы получаете строку, а вычитаете число. Может прокатить, а может быть баг. Нужно tostring(tonumber(PriceRTSBuy)-50)
3)[«QUANTITY»] = «1», —  в ключ количество нужно передавать строку
4) Номер транзакции тоже нужно взять в кавычки, т.е. дать строку

avatar

  • 27 сентября 2019, 21:14
  • Ответить

    Еще

pessimist, не помогло. указывает на ошибку в строке local Err_Order=SendTransaction(LimitOrderBuy). А если удалить её и message, то после запуска ничего не происходит и никакой реакции нет

avatar

  • 27 сентября 2019, 21:20
  • Ответить

    Еще

Hired, а какую ошибку указывает, можно скрин?

avatar

  • 27 сентября 2019, 21:22
  • Ответить

    Еще

pessimist, [«QUANTITY»] = tostring(1) тоже не помогает.
ошибка: …script qluaza9vka vistavlenie.lua:20: attempt to call global ‘SendTransaction’ (a nil value), 20я строка это local Err_Order=SendTransaction(LimitOrderBuy)

avatar

  • 27 сентября 2019, 21:24
  • Ответить

    Еще

Hired, регистр имеет важное значение, Вы неправильно написали функцию :
sendTransaction

Первая буква должна быть маленькой 

avatar

  • 27 сентября 2019, 21:26
  • Ответить

    Еще

pessimist, хаха вот фэйл! спасибо! видимо на сегодня пора заканчивать 

avatar

  • 27 сентября 2019, 21:29
  • Ответить

    Еще

Hired, 
всегда — пожалуйста! 

avatar

  • 27 сентября 2019, 21:29
  • Ответить

    Еще

local stopped = false
function OnStop()
stopped = true
return 2000
end

function main ()
local SecCode = «GZZ9»
local PriceRTSBuy = getParamEx(«SPBFUT», SecCode, «LAST»).param_value
local LimitOrderBuy = {
[«ACTION»] =«NEW_ORDER»,
[«ACCOUNT»] =«SPBFUT000ve»,
[«OPERATION»] =«B»,
[«CLASSCODE»] =«SPBFUT»,
[«SECCODE»] = SecCode,
[«PRICE»] = (PriceRTSBuy — 50),
[«QUANTITY»] = 1,
[«TRAND_ID»] = 228322,
}
local Err_Order=SendTransaction(LimitOrderBuy)
message («Err_Order»)
end

avatar

  • 27 сентября 2019, 21:01
  • Ответить

    Еще

Hired, тут куча ошибок!

1) функция message должна иметь формат message(«Текст сообщения»,1)
2) в PriceRTSBuy Вы получаете строку, а вычитаете число. Может прокатить, а может быть баг. Нужно tostring(tonumber(PriceRTSBuy)-50)
3)[«QUANTITY»] = «1», —  в ключ количество нужно передавать строку
4) Номер транзакции тоже нужно взять в кавычки, т.е. дать строку

avatar

  • 27 сентября 2019, 21:14
  • Ответить

    Еще

pessimist, не помогло. указывает на ошибку в строке local Err_Order=SendTransaction(LimitOrderBuy). А если удалить её и message, то после запуска ничего не происходит и никакой реакции нет

avatar

  • 27 сентября 2019, 21:20
  • Ответить

    Еще

Hired, а какую ошибку указывает, можно скрин?

avatar

  • 27 сентября 2019, 21:22
  • Ответить

    Еще

pessimist, [«QUANTITY»] = tostring(1) тоже не помогает.
ошибка: …script qluaza9vka vistavlenie.lua:20: attempt to call global ‘SendTransaction’ (a nil value), 20я строка это local Err_Order=SendTransaction(LimitOrderBuy)

avatar

  • 27 сентября 2019, 21:24
  • Ответить

    Еще

Hired, регистр имеет важное значение, Вы неправильно написали функцию :
sendTransaction

Первая буква должна быть маленькой 

avatar

  • 27 сентября 2019, 21:26
  • Ответить

    Еще

pessimist, хаха вот фэйл! спасибо! видимо на сегодня пора заканчивать 

avatar

  • 27 сентября 2019, 21:29
  • Ответить

    Еще

Hired, 
всегда — пожалуйста! 

avatar

  • 27 сентября 2019, 21:29
  • Ответить

    Еще

Только зарегистрированные и авторизованные пользователи могут оставлять ответы.

Залогиниться

Зарегистрироваться

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Att ошибка на пионере
  • Atom ошибка при установке плагина