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

2 страниц V  1 2 >  
Ответить в эту темуОткрыть новую тему
> ffi создание указателя на многомерный массив
DarkMaster
сообщение 7.8.2022, 20:11
Сообщение #1


***********

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



Собственно есть некоторый указатель на void либо просто number с адресом.
Нужно создать указатель на int[123][321] по этому адресу.
cast ругается на такие выкрутасы ну либо я что-то не так по синтаксису делаю.


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


********

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



В плюсах (парсер ffi примерно от туда) нельзя кастануть void* к int[][], но вроде можно кастануть к указателю на указатель

Код
int **aptr = reinterpret_cast<int**>(void*)
aptr[100][200] = 0xdead


Цитата(Cockney @ 7.8.2022, 22:41) *

В плюсах (парсер ffi примерно от туда) нельзя кастануть void* к int[][], но вроде можно кастануть к указателю на указатель

Код
int **aptr = reinterpret_cast<int**>(void*)
aptr[100][200] = 0xdead



если адрес задан как int a = ...., то скорее всего придется допонительный каст делать

Код
reinterpret_cast<int**>(reinterpret_cast<void*>(a));
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 7.8.2022, 23:40
Сообщение #3


********

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



еще вот такой урод можно испытать, сначала делаем

Код
using arr_type = int[500][500]; // max size


и проказничаем далее

Код
    void* ptr = 0;
    *(reinterpret_cast<arr_type*>(ptr))[100][5] = 80;
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 8.8.2022, 1:12
Сообщение #4


***********

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



орет invalid C type как только видит квадратные скобки внутри ffi.cast

причем прикастовать к int** не проблема... а вот размерности...


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


********

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



А ескейп работает ? Типа \[\]
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 8.8.2022, 1:29
Сообщение #6


***********

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



Начинает орать про eof. Такое впечатление как-будто в чистый си строкой подставляет. Можешь написать именно через каст пример создания указателя на массив с размерностью?
я хз что есть reinterpret_cast и в чем разница...


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


********

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



А в чем сакральный смысл каста именно к размерности ? Каст к ** и дальше индексируй.

Reinterpret_cast - "я тут главный, я знаю что это работает, повинуйся, машина" если оно не кастит, то вряд ли это возможно... но т.к. в плюсах возможно все, то просто сам каст будет иметь зубодробительную длину

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


***********

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



Цитата
А в чем сакральный смысл каста именно к размерности ? Каст к ** и дальше индексируй.

Чтобы первый индекс работал второй должен быть известен компилятору/интерпретатору.
Ну скажем прикастовал я к **, говорю дай мне элемент [5][2], а какой он по счету? Вторая размерность может быть 2, а может быть 10 и это будет совсем разный кусок памяти.


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


********

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



Цитата(DarkMaster @ 8.8.2022, 1:41) *

Чтобы первый индекс работал второй должен быть известен компилятору/интерпретатору.
Ну скажем прикастовал я к **, говорю дай мне элемент [5][2], а какой он по счету? Вторая размерность может быть 2, а может быть 10 и это будет совсем разный кусок памяти.



Не понял мысли особо, но это вроде про рваные массивы. Да, по идеи тут не прокатит моя схема, но с другой стороны а как ты логически видишь каст простого числа к адресу конкретного элемента не зная инфы о массиве ? Компилятор логически это не сможет вывести никак только по индексам одного элемента.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 8.8.2022, 2:11
Сообщение #10


********

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



Тут парни чет нагородили

https://stackoverflow.com/questions/1186905...y-of-fixed-size
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 8.8.2022, 2:39
Сообщение #11


***********

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



Вот смотри, у нас есть некоторый *int и последовательно записаны числа 1, 2, 3, 4, 5, 6, 7, 8, 9.
Если мы этот инт прикастуем просто к **int - нам это ничего не даст, т.к. мы не сможем обратиться по индексу. Ну прикастовали, какое значение будет у элемента [2][2]? Это может быть и 4 и 5 и 6 и т.д, т.к. мы не сказали чему равна вторая размерность, а **int этой информации не содержит. Поэтому мне и нужен указатель на некоторый массив с фиксированной шириной, чтобы обращаться по индексам.

Сообщение отредактировал DarkMaster - 8.8.2022, 4:16


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


***********

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



https://stackoverflow.com/questions/1052818...mensional-array
но как это применить в рамках ffi я честно говоря вообще хз...


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


********

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



Могу только посочувствовать и пожелать успехов
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 8.8.2022, 18:12
Сообщение #14


***********

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



Если все-таки будет желание.
Наткнулся на такую весч:
Цитата
-- Declare a struct with a parameterized field type and name:
ffi.cdef([[
typedef struct { $ $; } foo_t;
]], type1, name1)

-- Anonymous struct with dynamic names:
local bar_t = ffi.typeof("struct { int $, $; }", name1, name2)
-- Derived pointer type:
local bar_ptr_t = ffi.typeof("$ *", bar_t)

-- Parameterized dimensions work even where a VLA won't work:
local matrix_t = ffi.typeof("uint8_t[$][$]", width, height)

Собственно из вышеописанного:
Код
local arr = ffi.typeof("int[$][$]", 10, 10)
log(tostring(arr))
arr[1][1] = 1

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


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


********

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



Цитата(DarkMaster @ 8.8.2022, 18:12) *

Если все-таки будет желание.
Наткнулся на такую весч:

Собственно из вышеописанного:
Код
local arr = ffi.typeof("int[$][$]", 10, 10)
log(tostring(arr))
arr[1][1] = 1

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


Не, создается объект-тип, который дальше должен использоваться как
Код
void pass_arr_in_c(arr arrParam)
, например, или
Код
arr arr_cast(void* ptr)
, ну а дальше из луа обращаешься
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 8.8.2022, 19:00
Сообщение #16


***********

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



Цитата
void pass_arr_in_c(arr arrParam)

В таком варианте не понятно как его инициализировать перед передачей. Хотя сейчас не обо этом.
Цитата
arr arr_cast(void* ptr)

arr при этом должен быть объявлен в сdef. Как при этом может быть использван typeof не очень понимаю.
через ffi.cast с указанем этого типа индексируемый указатель создать не удалось.


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


********

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



Сначала тайпдеф, потом создать объектом с типом arr, как int[50] только arr без размерности, ибо в дефе уже задано
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 8.8.2022, 21:38
Сообщение #18


***********

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



Так в ffi.cdef тайп дефе невозможно сделать что-то вроде:
Код
ffi.cdef[[
   typedef int[10][10] аrr_10_10;
]]

оно уже выбьет ошибку. Или я что-то не понял?


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


********

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



Цитата(DarkMaster @ 8.8.2022, 21:38) *

Так в ffi.cdef тайп дефе невозможно сделать что-то вроде:
Код
ffi.cdef[[
   typedef int[10][10] аrr_10_10;
]]

оно уже выбьет ошибку. Или я что-то не понял?



Ffi.typeof()
Ffi.cdef и тут уже используешь тип arr_10_10
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 8.8.2022, 23:46
Сообщение #20


***********

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



Код
local arr = ffi.typeof("int[$][$]", 10, 10)
ffi.cdef[[
   typedef arr аrr_10_10;
]]

так что ли? declaration specifier expected near 'arr'
чувствую себя тормозом)


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

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

 

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