Size: a a a

2020 August 14

ВС

Владимир Столяров... in Go-go!
Jefferson
cannot convert data (type []byte) to type unsafe.Pointer
а конструкция вида
hdr := (*reflect.SliceHeader)(unsafe.Pointer(&data))
in.data = (*C.uchar)(hdr.Data)
источник

J

Jefferson in Go-go!
Владимир Столяров
а конструкция вида
hdr := (*reflect.SliceHeader)(unsafe.Pointer(&data))
in.data = (*C.uchar)(hdr.Data)
Сейчас снчала первый вариант проверю
источник

J

Jefferson in Go-go!
С помощью github.com/rainycape/dl получаю указатель на функцию из shared-либы:
lib, err := dl.Open("./lib.so", 0)

var 
MyFunc
func(in *C.MyStruct, out *C.MyStruct, ptr uintptr) int
lib.Sym("MyFunc", &MyFunc)

Вызываю:
in := (*C.
MyStruct
)(unsafe.Pointer(new(C.
MyStruct
)))
in.data = (*C.uchar)(&data[0])
in.len = (C.ulong)(len(data))

out := (*C.
MyStruct
)(unsafe.Pointer(new(C.
MyStruct
)))

status := MyFunc(in, out, 0)

Ловлю ошибку: cgo argument has Go pointer to Go pointer
Что не так?
источник

p

pragus in Go-go!
Jefferson
С помощью github.com/rainycape/dl получаю указатель на функцию из shared-либы:
lib, err := dl.Open("./lib.so", 0)

var 
MyFunc
func(in *C.MyStruct, out *C.MyStruct, ptr uintptr) int
lib.Sym("MyFunc", &MyFunc)

Вызываю:
in := (*C.
MyStruct
)(unsafe.Pointer(new(C.
MyStruct
)))
in.data = (*C.uchar)(&data[0])
in.len = (C.ulong)(len(data))

out := (*C.
MyStruct
)(unsafe.Pointer(new(C.
MyStruct
)))

status := MyFunc(in, out, 0)

Ловлю ошибку: cgo argument has Go pointer to Go pointer
Что не так?
Всё так.
источник

Y

Yaroslav in Go-go!
Александр Попов
да причем тут указатель
эммм нуу потому что в С\С++ с массивами можно работать через указатели, и желание скастить []byte к unsigned char* вполне себе нормально
источник

Y

Yaroslav in Go-go!
тебе нужен указатель на начало массива + его размер
источник

p

pragus in Go-go!
Jefferson
Подскажите, как []byte к C.unsigned char* кастануть?
Пытаюсь сделать так:
in.data = (C.uchar)(data)
Но ловлю ошибку:
cannot convert data (type []byte) to type _Ctype_uchar
Кастинг указателя к структуре не будет работать
источник

J

Jefferson in Go-go!
unsigned char вроде не структура?
источник

p

pragus in Go-go!
Jefferson
unsigned char вроде не структура?
Но []byte - эта структура
источник

Y

Yaroslav in Go-go!
это массив
источник

ВС

Владимир Столяров... in Go-go!
таки нетъ
источник

ВС

Владимир Столяров... in Go-go!
это *reflect.SliceHeader
источник

p

pragus in Go-go!
Yaroslav
это массив
Нет.
источник

p

pragus in Go-go!
Yaroslav
это массив
Массив - это [64]byte, например
источник

Y

Yaroslav in Go-go!
pragus
Массив - это [64]byte, например
ок, спс
источник

I

Ivan in Go-go!
Yaroslav
это массив
Это слайс байтов
источник

J

Jefferson in Go-go!
Владимир Столяров
а конструкция вида
hdr := (*reflect.SliceHeader)(unsafe.Pointer(&data))
in.data = (*C.uchar)(hdr.Data)
Тоже ошибка:
cannot convert hdr.Data (type uintptr) to type *_Ctype_uchar
источник

p

pragus in Go-go!
Jefferson
С помощью github.com/rainycape/dl получаю указатель на функцию из shared-либы:
lib, err := dl.Open("./lib.so", 0)

var 
MyFunc
func(in *C.MyStruct, out *C.MyStruct, ptr uintptr) int
lib.Sym("MyFunc", &MyFunc)

Вызываю:
in := (*C.
MyStruct
)(unsafe.Pointer(new(C.
MyStruct
)))
in.data = (*C.uchar)(&data[0])
in.len = (C.ulong)(len(data))

out := (*C.
MyStruct
)(unsafe.Pointer(new(C.
MyStruct
)))

status := MyFunc(in, out, 0)

Ловлю ошибку: cgo argument has Go pointer to Go pointer
Что не так?
В cgo нельзя передавать указатели на гошные указатели
источник

ВС

Владимир Столяров... in Go-go!
Jefferson
Тоже ошибка:
cannot convert hdr.Data (type uintptr) to type *_Ctype_uchar
Тогда вторая строка через (*C.uchar)(unsafe.Pointer(hdr.Data))
источник

p

pragus in Go-go!
Yaroslav
а если &data[0] передать?
Вот это правильно :)
источник