LINUX.ORG.RU
Ответ на: комментарий от monk

В смысле, не описывая поля структуры?

Не описывая структуру на лиспе. Вот как здесь:

(defcstruct (c-complex-double :class t-complex-double)
  (re :double)
  (im :double))

А зачем? Ведь с ними должны работать функции из подключаемой через cffi библиотеки.

Договоренность. Если передавать структуру, а не указатель на неё, то при вызове функции будут копироваться все поля структуры. Если структура достаточно большая, то это неудобно.

Я так понял мне это не нужно, но тем не менее я хочу попрактиковаться.

(defmacro with-pointer-to-complex-double ((symbol complex)
                                          &body code)
  `(with-foreign-object (,symbol '(:struct c-complex-double))
     (setf (mem-ref ,symbol '(:struct c-complex-double))
           ,complex)
     ,@code))

(defmacro show-value-from-pointer-to-complex-double (x)
  `(mem-ref ,x '(:struct c-complex-double)))


(defcfun cimag :double
  (z :pointer))
CL-FFTW-BINDINGS> (with-pointer-to-complex-double (x (complex 9 -4))
                    ;; здесь я представляю что x - указатель на
                    ;; структуру которая в лиспе не описана
                    (values
                     (cimag x)
                     (show-value-from-pointer-to-complex-double x)))
1.4582406633971333d-303
#C(9.0d0 -4.0d0)
CL-FFTW-BINDINGS> 

Здесь я делаю тоже самое, что и в коде здесь. Можно ли сделать так чтобы cimag работал с указателем на структуру?

ados ★★★★★
() автор топика
Ответ на: комментарий от ados

Не описывая структуру на лиспе. Вот как здесь

Можно если функции работают с указателями. Смотри https://common-lisp.net/project/cffi/manual/html_node/Tutorial_002dInitializi... . Там

CURL *curl_easy_init( );
void curl_easy_cleanup(CURL *handle);
описывается как
(defcfun "curl_easy_init" :pointer)
   
(defcfun "curl_easy_cleanup" :void
  (easy-handle :pointer))

Можно ли сделать так чтобы cimag работал с указателем на структуру?

Нет. Точнее этот вопрос надо адресовать разработчикам стандарта Си. Сейчас в стандарте указана передача по значению.

monk ★★★★★
()
Ответ на: комментарий от monk

Если передавать структуру, а не указатель на неё, то при вызове функции будут копироваться все поля структуры. Если структура достаточно большая, то это неудобно.

Если она достаточно большая, то будет передаваться только указатель на структуру.

anonymous
()
Ответ на: комментарий от monk

Ага. Кажется я начинаю что-то понимать. Выходит cimag просто не так реализована для любителей не описывать низкоуровневые структуры. Но что тогда передавалось функции cimag в коде здесь?

ados ★★★★★
() автор топика
Ответ на: комментарий от ados

Но что тогда передавалось функции cimag в коде здесь?

Ничего не передавалось. (make-double-complex 1.0d0 2.0d0) устанавливало значение в тот регистр процессора, из которого потом читал cimag. Если писать (setf a (make-double-complex 1.0d0 2.0d0)) (cimag a), то уже не работает.

monk ★★★★★
()
Ответ на: комментарий от monk

Вот теперь я понял. Вроде.

Спасибо тебе ещё раз. И извини что достаю своими вопросами уже не первый раз.

ados ★★★★★
() автор топика
Ответ на: комментарий от ados

И извини что достаю своими вопросами уже не первый раз.

Всё нормально. Тем более в этой теме я сам тень на плетень навёл своим кривым примером.

monk ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.