The new syntax is as follows.  If you want the structure itself, use (:struct foo).  If you want a pointer to it, use (:pointer (:struct foo)).   The latter should be identical to the old style bare struct specification, except for the annoying deprecation warning, of course.<br>

<br>The issues I can identify, with their resolutions:<br><br>1) Using mem-aref with the (:pointer (:struct ...)) spec gives the wrong pointer.<br><br>I have fixed an error which should now return the correct pointer for an offset of 0.  For an offset of 1, it returns the base pointer +8 bytes, which is not what the old style gives (+ 4 bytes), but it seems to me correct, as I understand the index to refer to the number of whole structures.   Pull ee90bfd517 and try.<br>

<br>2) The plist form representing the structure is not desirable.<br><br>You can have any CL representation of the structure you like; you need to define a method cffi:translate-from-foreign for your type class.  You are getting the default, a plist translation, because no such method is defined.   See for example how I <a href="http://repo.or.cz/w/antik.git/blob/1ee407c69525b84b441f8cf7b48ac590e78bd635:/foreign-array/complex-types.lisp#l50">translate complex numbers</a> to CL complex numbers.  You can even return a pointer if you want, but this probably isn't the specification to use if you want the pointer.<br>

<br><br><div class="gmail_quote">On Mon, Feb 13, 2012 at 10:22 AM, Ryan Pavlik <span dir="ltr"><<a href="mailto:reply%2Bi-1614209-ba246666762196459413560690eb7d3a39c7c7ee-838019@reply.github.com">reply+i-1614209-ba246666762196459413560690eb7d3a39c7c7ee-838019@reply.github.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I've pulled the latest and it appears the semantics have changed for mem-aref, but there is still no way to get the old behavior.  Here is a complete example, though it doesn't use the test system definitions because actual foreign calls and definitions aren't really the problem:<br>


<br>
```<br>
(asdf:load-system :cffi)<br>
<br>
(cffi:defcstruct my-struct<br>
  (x :short)<br>
  (y :short))<br>
<br>
(defun test-old-ref ()<br>
  (declare (notinline cffi:mem-ref cffi:mem-aref))<br>
  (cffi:with-foreign-object (ptr '(:struct my-struct) 2)<br>
    (format t "~&Old-ref style:~%ptr : ~A~%aref: ~A~%"<br>
            ptr (cffi:mem-aref ptr 'my-struct 1))))<br>
<br>
(defun test-new-ref ()<br>
  (cffi:with-foreign-object (ptr '(:struct my-struct) 2)<br>
    (format t "~&New-ref style:~%ptr : ~A~%aref: ~A~%"<br>
           ptr<br>
           (cffi:mem-aref ptr '(:struct my-struct) 1))))<br>
<br>
(defun test-new-ptr-ref ()<br>
  (cffi:with-foreign-object (ptr '(:struct my-struct) 2)<br>
    (format t "~&New-ref with :pointer style:~%ptr : ~A~%aref: ~A~%"<br>
           ptr<br>
           (cffi:mem-aref ptr '(:pointer (:struct my-struct)) 1))))<br>
<br>
(progn<br>
  (test-old-ref)<br>
  (test-new-ref)<br>
  (test-new-ptr-ref))<br>
```<br>
<br>
The output I get, sans style-warnings about bare structs:<br>
<br>
```<br>
Old-ref style:<br>
ptr : #.(SB-SYS:INT-SAP #X7FFFEEFCFFF0)<br>
aref: #.(SB-SYS:INT-SAP #X7FFFEEFCFFF4)<br>
New-ref style:<br>
ptr : #.(SB-SYS:INT-SAP #X7FFFEEFCFFF0)<br>
aref: (Y 0 X 0)<br>
New-ref with :pointer style:<br>
ptr : #.(SB-SYS:INT-SAP #X7FFFEEFCFFF0)<br>
aref: #.(SB-SYS:INT-SAP #X00000000)<br>
```<br>
<br>
Note that in the first example, with the original semantics, if you mem-aref a pointer to an array of `my-struct`, you get a pointer to the array element.  In the new style, with `(:struct my-struct)`, you get the values parsed into a list, which is not particularly useful; it conses, and you almost certainly have to re-parse a possibly long list for a single element.  In the new style with `:pointer`, it appears to dereference the Nth element in an *array of pointers to my-struct*, which is not at all what we want.<br>


<br>
The latter differs from the behavior before I updated, which seemed to return a *pointer* to the Nth element in an array-of-pointers.  None of the above are like the old behavior.<br>
<br>
---<br>
<div class="im">Reply to this email directly or view it on GitHub:<br>
</div><a href="https://github.com/cffi/cffi/pull/2#issuecomment-3941718" target="_blank">https://github.com/cffi/cffi/pull/2#issuecomment-3941718</a><br>
</blockquote></div><br>