1 (2022-09-29 22:11:34 отредактировано Serg_)

Тема: Возвращаемые значения CreateDataSource по ссылке

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

Вот такой простенький код:

function my_CreateDataSource__HISTORY__wrapper(my_table_data_history_candle_)


local my_table_data_history_candle_, error_desc = CreateDataSource("TQBR", "SBER", INTERVAL_D1)  --Вызываем собсвенно CreateDataSource


--message(tostring(my_table_data_history_candle_:Size()))    --размер 3008, то есть не нулевой 

return 1

end


----------------------------------------------int main:--------------------------------------------

function main()

local my_table_data_history_candle={} 

local my_status = my_CreateDataSource__HISTORY__wrapper(my_table_data_history_candle)

message(tostring(my_table_data_history_candle:Size()))

end

-Таблицы в Lua передается по ссылке
-После завершения функции CreateDataSource - в таблице "my_table_data_history_candle_" - есть данные.
-Но, когда завершается функция my_CreateDataSource__HISTORY__wrapper - и я пытаюсь вывести размер - ничего не происходит, как будто бы - таблица, которую заполнила функция CreateDataSource - это не та таблица, которая была предана по ссылке.

То есть квик выдает ошибку: " attempt to call a nil value (method 'Size')" - то есть таблица пустая.

Не понимаю почему ??

2

Re: Возвращаемые значения CreateDataSource по ссылке

Вы смешали 2 понятия:
- передача таблицы в функцию по ссылке (да, это так)
- замена локального значения аргумента внутри функции новым значением

Когда вы внутрь my_CreateDataSource__HISTORY__wrapper() передали таблицу my_table_data_history_candle - то она передалась именно по ссылке. Это легко проверить, если в начале функции my_CreateDataSource__HISTORY__wrapper() добавить в аргумент функции my_table_data_history_candle_ элементы, по возвращении из функции добавленные элементы в таблице будут.

Но, как только вы сделали

local my_table_data_history_candle_, error_desc = CreateDataSource("TQBR", "SBER", INTERVAL_D1)

то в my_table_data_history_candle_ у вас уже совершенно другая таблица. Вы присвоили параметру функции полностью новое значение и теперь уже my_table_data_history_candle_ не содержит ссылки на переданую в него таблицу.
Можно было вообще написать

my_table_data_history_candle_ = 5

и тогда значение my_table_data_history_candle_ было бы целого типа и равно 5, но это вовсе не означало бы, что и "наружняя" таблица перестала бы существовать.

Для понимания поиграйтесь вот здесь
[url]https://qlua.ru/demo/[/url]
вот с таким кодом:

function get_table()
  return {'A','B'}
end

function print_table(t_)
  for _,v in pairs(t_) do
    print(v)
  end
end

function f(t)
  t.x = 'X'
  print('Внутри f() - начало:')
  print_table(t)

  t = get_table()
  t.Z = 'Z'

  print('Внутри f() - выход:')
  print_table(t)
end

local my_tbl = {'M', 'N'}
f(my_tbl)

print('Итог глобальная таблица:')
print_table(my_tbl)

В результате выполнения данного кода будет напечатано:

Внутри f() - начало:
M
N
X
Внутри f() - выход:
A
B
Z
Итог глобальная таблица:
M
N
X    <-- обратите внимание, X, добавленный внутри функции, остался в результатах, так что ссылка, все как и написано в документации

Можно поиграться с кодом, попереставлять в нем строчки, помедитировать над результатами smile (я так и сделал, с ходу сам не понял где подвох)

3

Re: Возвращаемые значения CreateDataSource по ссылке

Спасибо, я предполагал, что скорее всего так и есть, но вопрос в том, что получается - получить возвращённый результат именно в таблицу переданную по ссылке - не получится ?
То есть возвращенный результат всегда будет создавать свою таблицу ?
То есть только через дополнительное поэлементное копирование занести данные в мою таблицу ?

4

Re: Возвращаемые значения CreateDataSource по ссылке

Возвращайте таблицу как результат функции - и все будет отлично. Зачем что-то выдумывать?
Ну либо можно копировать из таблицы в таблицу, не переписывая полностью само значение аргумента функции, но зачем? это ресурсозатратно наверняка выйдет.

Передачи параметров функций "по ссылке" в общем смысле этого понимания - в Lua нет.

5

Re: Возвращаемые значения CreateDataSource по ссылке

Спасибо!