Собственно есть некоторый указатель на void либо просто number с адресом.
Нужно создать указатель на int[123][321] по этому адресу.
cast ругается на такие выкрутасы ну либо я что-то не так по синтаксису делаю.
В плюсах (парсер ffi примерно от туда) нельзя кастануть void* к int[][], но вроде можно кастануть к указателю на указатель
int **aptr = reinterpret_cast<int**>(void*)
aptr[100][200] = 0xdead
int **aptr = reinterpret_cast<int**>(void*)
aptr[100][200] = 0xdead
reinterpret_cast<int**>(reinterpret_cast<void*>(a));
еще вот такой урод можно испытать, сначала делаем
using arr_type = int[500][500]; // max size
void* ptr = 0;
*(reinterpret_cast<arr_type*>(ptr))[100][5] = 80;
орет invalid C type как только видит квадратные скобки внутри ffi.cast
причем прикастовать к int** не проблема... а вот размерности...
А ескейп работает ? Типа \[\]
Начинает орать про eof. Такое впечатление как-будто в чистый си строкой подставляет. Можешь написать именно через каст пример создания указателя на массив с размерностью?
я хз что есть reinterpret_cast и в чем разница...
А в чем сакральный смысл каста именно к размерности ? Каст к ** и дальше индексируй.
Reinterpret_cast - "я тут главный, я знаю что это работает, повинуйся, машина" если оно не кастит, то вряд ли это возможно... но т.к. в плюсах возможно все, то просто сам каст будет иметь зубодробительную длину
А каст луа многое может делать, копирование памяти там, или еще че, это же не просто указка на уровне компиляции, это работа с объектами, имхо
Тут парни чет нагородили
https://stackoverflow.com/questions/11869056/how-to-cast-simple-pointer-to-a-multidimensional-array-of-fixed-size
Вот смотри, у нас есть некоторый *int и последовательно записаны числа 1, 2, 3, 4, 5, 6, 7, 8, 9.
Если мы этот инт прикастуем просто к **int - нам это ничего не даст, т.к. мы не сможем обратиться по индексу. Ну прикастовали, какое значение будет у элемента [2][2]? Это может быть и 4 и 5 и 6 и т.д, т.к. мы не сказали чему равна вторая размерность, а **int этой информации не содержит. Поэтому мне и нужен указатель на некоторый массив с фиксированной шириной, чтобы обращаться по индексам.
https://stackoverflow.com/questions/1052818/create-a-pointer-to-two-dimensional-array
но как это применить в рамках ffi я честно говоря вообще хз...
Могу только посочувствовать и пожелать успехов
Если все-таки будет желание.
Наткнулся на такую весч:
local arr = ffi.typeof("int[$][$]", 10, 10)
log(tostring(arr))
arr[1][1] = 1
local arr = ffi.typeof("int[$][$]", 10, 10)
log(tostring(arr))
arr[1][1] = 1
void pass_arr_in_c(arr arrParam)
arr arr_cast(void* ptr)
Сначала тайпдеф, потом создать объектом с типом arr, как int[50] только arr без размерности, ибо в дефе уже задано
Так в ffi.cdef тайп дефе невозможно сделать что-то вроде:
ffi.cdef[[
typedef int[10][10] аrr_10_10;
]]
ffi.cdef[[
typedef int[10][10] аrr_10_10;
]]
local arr = ffi.typeof("int[$][$]", 10, 10)
ffi.cdef[[
typedef arr аrr_10_10;
]]
local arr_type = ffi.typeof("int[$][$]", 10, 10)
arr = ffi.new(arr_type)
new создаст объект, а не указатель. Если в тип добавить *, то все равно создаст объект.
при
arr = arr+1
происходит превращение из int[10][10] в int*[10], но указатель дает двигать.
Т.е. по сути дела вроде как работать будет, но при этом будет мусорить изначальными объектами, которые потом вообще хрен удалишь скорее всего после таких приколов.
Адрес могу предоставть - это не проблема. Проблема создать на него указатель. Собственно это и есть изначальная проблема.
У нас есть ctype, у нас есть адрес, есть снаружи созданный ctype по этому адресу. Проблема в том чтобы объяснить луа, что объект ctype лежит по такому-то адресу...
С другими типами это норм делалось через каст... А тут на ровном месте бред какакой-то...
Я результат не могу из либы вернуть... Ну точнее могу, но это будет int*, если делать по старой схеме. Обращение к элементам в итоге будет:
result[y*6+x] ну это же бред ппц...
а из си можно сразу вернуть int[][] например так int[10][10] get() ? как тогда отработает обращение к результату вызова ?
То упадет в обморок при виде скобок...
local arr_type = ffi.typeof("int[$][$]", 10, 10)
arr = ffi.new(arr_type)
declaration specifier expected near 'arr_type'
Напомни, а тайпдеф ты пробовал делать внутри cdef ?
local ffi = require("ffi")
ffi.cdef([[
typedef int int2d[10][10];
]])
local ptr = 0xDEAD
local arr = ffi.cast("int2d*", ptr)
Спасибо. Чую долго бы я еще развлекался...
Итоговое безобразие получилось такое:
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]))
Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)