Здравствуйте, гость ( Вход | Регистрация )

2 страниц V < 1 2  
Ответить в эту темуОткрыть новую тему
> ffi создание указателя на многомерный массив
Cockney
сообщение 8.8.2022, 23:58
Сообщение #21


********

Master
Сообщений: 1.395
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 21043
Пользователь №: 16.156



Код
local arr_type = ffi.typeof("int[$][$]", 10, 10)
arr = ffi.new(arr_type)


типа того
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 9.8.2022, 0:39
Сообщение #22


***********

Модератор UOPilot
Сообщений: 9.462
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27674
Пользователь №: 11.279



new создаст объект, а не указатель. Если в тип добавить *, то все равно создаст объект.
при
arr = arr+1
происходит превращение из int[10][10] в int*[10], но указатель дает двигать.
Т.е. по сути дела вроде как работать будет, но при этом будет мусорить изначальными объектами, которые потом вообще хрен удалишь скорее всего после таких приколов.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 9.8.2022, 0:58
Сообщение #23


********

Master
Сообщений: 1.395
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 21043
Пользователь №: 16.156



Цитата(DarkMaster @ 9.8.2022, 0:39) *

new создаст объект, а не указатель. Если в тип добавить *, то все равно создаст объект.
при
arr = arr+1
происходит превращение из int[10][10] в int*[10], но указатель дает двигать.
Т.е. по сути дела вроде как работать будет, но при этом будет мусорить изначальными объектами, которые потом вообще хрен удалишь скорее всего после таких приколов.




значит нужно взять адрес объекта, чего скорее всего ffi не даст сделать
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 9.8.2022, 1:23
Сообщение #24


***********

Модератор UOPilot
Сообщений: 9.462
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27674
Пользователь №: 11.279



Адрес могу предоставть - это не проблема. Проблема создать на него указатель. Собственно это и есть изначальная проблема.
У нас есть ctype, у нас есть адрес, есть снаружи созданный ctype по этому адресу. Проблема в том чтобы объяснить луа, что объект ctype лежит по такому-то адресу...
С другими типами это норм делалось через каст... А тут на ровном месте бред какакой-то...

Я результат не могу из либы вернуть... Ну точнее могу, но это будет int*, если делать по старой схеме. Обращение к элементам в итоге будет:
result[y*6+x] ну это же бред ппц...


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 9.8.2022, 10:45
Сообщение #25


********

Master
Сообщений: 1.395
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 21043
Пользователь №: 16.156



а из си можно сразу вернуть int[][] например так int[10][10] get() ? как тогда отработает обращение к результату вызова ?
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 9.8.2022, 11:32
Сообщение #26


***********

Модератор UOPilot
Сообщений: 9.462
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27674
Пользователь №: 11.279



То упадет в обморок при виде скобок...


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 9.8.2022, 17:11
Сообщение #27


********

Master
Сообщений: 1.395
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 21043
Пользователь №: 16.156



Цитата(Cockney @ 8.8.2022, 23:58) *

Код
local arr_type = ffi.typeof("int[$][$]", 10, 10)
arr = ffi.new(arr_type)


типа того



А если сначала вызвать ffi.typeof, потом cdef в котором arr_type get() функция и потом это функцию вызвать, она отдаст адрес
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 9.8.2022, 18:13
Сообщение #28


***********

Модератор UOPilot
Сообщений: 9.462
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27674
Пользователь №: 11.279



declaration specifier expected near 'arr_type'


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 9.8.2022, 20:23
Сообщение #29


********

Master
Сообщений: 1.395
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 21043
Пользователь №: 16.156



Напомни, а тайпдеф ты пробовал делать внутри cdef ?
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 9.8.2022, 21:48
Сообщение #30


********

Master
Сообщений: 1.395
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 21043
Пользователь №: 16.156



Код
 local ffi = require("ffi")
ffi.cdef([[
    typedef int int2d[10][10];
]])
local ptr = 0xDEAD
local arr = ffi.cast("int2d*", ptr)
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 10.8.2022, 2:33
Сообщение #31


***********

Модератор UOPilot
Сообщений: 9.462
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27674
Пользователь №: 11.279



Спасибо. Чую долго бы я еще развлекался...
Итоговое безобразие получилось такое:
Код
local ffi = require("ffi")
ffi.cdef([[
    typedef int int2d[10];
]])

local int100 = ffi.new("int[100]")
for i = 0, 100 do
    int100[i] = i
end

local arr = ffi.cast("int2d*", int100)
log(tostring(arr[0][1]))
log(tostring(arr[1][1]))

Размерность сделал в typedef на одну меньше иначе пришлось бы указатель каждый раз разименовывать через [0] и по факту получить доп размерность. Фишки luajit.
указатель на int100 улетает в либу, результат в луа.

Сообщение отредактировал DarkMaster - 10.8.2022, 2:34


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

2 страниц V < 1 2
Ответить в эту темуОткрыть новую тему
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 16.4.2024, 15:32
Designed by Nickostyle