Size: a a a

Русскоязычное сообщество Scheme

2021 July 10

y

yosk in Русскоязычное сообщество Scheme
А что передавать в scm->pointer? Если в первом случае причина падения понятна и вполне ожидаема (я просто 5 в scm->pointer передаю, с переменной эта 5 никак не связана), то второй выглядит как-то странно.
https://0x0.st/-OT8.pro
https://0x0.st/-OTN.pro
источник

A

Aragaer in Русскоязычное сообщество Scheme
источник

AZ

Aydar Zarifullin in Русскоязычное сообщество Scheme
Эта функция вроде просто возвращает указатель на схемный объект?
источник

A

Aragaer in Русскоязычное сообщество Scheme
вот да, похоже, что это не означает, что оно понимает, что это инт внутри. Соответственно сишный код лезет по указателю и что-то инкрементит. Получается тыква.
источник

A ß in Русскоязычное сообщество Scheme
да
источник

A

Aragaer in Русскоязычное сообщество Scheme
источник

y

yosk in Русскоязычное сообщество Scheme
Это я читал, но тут вроде про доступ к указателям на сишные переменные? За исключением `scm->pointer`, которая как-то непонятно работает.
источник

A

Aragaer in Русскоязычное сообщество Scheme
он как раз by-reference
источник

A

Aragaer in Русскоязычное сообщество Scheme
и в частности чтобы передать в ffi что-то, это что-то надо правильно сконструячить
источник

A

Aragaer in Русскоязычное сообщество Scheme
(define bv
 ;; An unsorted array of bytes.
 (u8-list->bytevector '(7 1 127 3 5 4 77 2 9 0)))
источник

A

Aragaer in Русскоязычное сообщество Scheme
вот такую штуку через bytevector->pointer превращают в то, что передают в qsort
источник

y

yosk in Русскоязычное сообщество Scheme
Точно, забыл про это, когда читал обратил внимание только на передачу указателя на функцию. Но все равно непонятно как получить указатель на схемную переменную.
источник

A ß in Русскоязычное сообщество Scheme
она нормально работает, просто для другого
источник

A ß in Русскоязычное сообщество Scheme
видимо тебе надо использовать bytevectors чтобы выделить память
источник

A

Aragaer in Русскоязычное сообщество Scheme
на схемную переменную никак. Надо сначала из нее сделать bytevector
источник

A

Aragaer in Русскоязычное сообщество Scheme
Wrapped pointers are untyped, so they are essentially equivalent to C void pointers. As in C, the memory region pointed to by a pointer can be accessed at the byte level. This is achieved using bytevectors (see Bytevectors). The (rnrs bytevectors) module contains procedures that can be used to convert byte sequences to Scheme objects such as strings, floating point numbers, or integers.
источник

y

yosk in Русскоязычное сообщество Scheme
Вроде получилось. Создать bytevector, записать число в bytevector, перевести bytevector в указатель, вызвать ffi-функцию с этим указателем, считать число с байтвектора. Не очень приятно, но работает. Все таки остальные варианты еще хуже.
источник

AZ

Aydar Zarifullin in Русскоязычное сообщество Scheme
Не знаю как можно сделать лучше, выделяем кусок памяти записываем в него нужное, всё как в C. Удобства байтвекторы тоже добавляют в том плане что чисткой памяти занимается схема. У меня была подобная задача на chicken scheme но там можно прямо из схемы вызвать malloc и получить "сырой" указатель.

В chicken scheme кстати тоже есть байтвекторы а ещё есть blob'ы это тоже кусок памяти управляемый схемой. Они от байтвекторов не сильно отличаются.

Целых три варианта сделать одно и то же..
источник

AZ

Aydar Zarifullin in Русскоязычное сообщество Scheme
Есть ли гарантия что gc в chicken scheme не перемещает байтвектор/блоб в памяти? А то я тут свой код переписал и только сейчас задумался...
источник

AZ

Aydar Zarifullin in Русскоязычное сообщество Scheme
Блобы и байтвекторы в чикене перемещаются в памяти, как и все остальные объекты которые не являются примитивами. Вот вроде с одной стороны было очевидно а с другой я например вообще слабо представляю как gc работает
источник