[Cffi-devel] Fw: Fw: readded broken link from last post

Joeish W joeish80829 at yahoo.com
Sat Apr 26 13:18:57 UTC 2014


This is important to figure out so I thought I'd include the contents of my C++ interop.cpp file in a gist https://gist.github.com/W-Net-AI/11319737  and my rect.cpp  W-Net-AI/gist:11319776  you have my Lisp vector class wrappers so here is my Lisp rect  wrappers...the rect is a little involved for the purpose of overloading.


;; Rect_() 
;; Rect* cv_create_Rect()  
(defcfun ("cv_create_Rect" rect0) (:pointer mat)  
  "RECT constructor.") 
 
 
;; Rect_(_Tp _x, _Tp _y, _Tp _width, _Tp _height) 
;; Rect* cv_create_Rect4(int x, int y, int width, int height)  
(defcfun ("cv_create_Rect4" rect4) (:pointer rect)  
  "RECT constructor." 
  (x :int) 
  (y :int) 
  (width :int) 
  (height :int)) 
 
(defun rect (&optional x y width height) 
       (cond ((eq (or x y) nil) 
          (rect0)) 
         ((and x y) 
          (rect4 x y width height)) 
         (t nil)))

this is the rect-x i have been using:

;; _Tp x, y, width, height 
;; int cv_Rect_getX(Rect* self)  
(defcfun ("cv_Rect_getX" rect-x) :int 
  (self (:pointer rect))) 



 
   W-Net-AI/gist:11319776
- Gist is a simple way to share snippets of text and code with others.  
View on gist.github.com Preview by Yahoo  
 
On Saturday, April 26, 2014 6:06 AM, Willem Rein Oudshoorn <woudshoo at xs4all.nl> wrote:
 
Joeish W <joeish80829 at yahoo.com> writes:
>
>> Thank you very much for all the help recently,   actually the Rect is
>> a OpenCv C class here:
>> http://docs.opencv.org/trunk/modules/core/doc/basic_structures.html?highlight=rect#Rect_...does
>> your advice on making a defcstruct for it stand..
>
>Hm, maybe not.  But I do not know exactly what you need to do.
>
>> Remember, the same
>> code works evaluating the same way at the REPL creating a
>> vector<Rectt> like this:
>>
>>
>> Functions:
>>
>> ;; template < class T, class Alloc = allocator<T> > class vector
>> ;; vector_##t * carray_to_std_vector##tn( t * a, size_t len )
>> (defcfun ("carray_to_std_vectorr" %c-arr-to-vector-rect) (:pointer vector-rect)
>>   (a :pointer)
>>   (len :unsigned-int))
>
>It helps if you include or points to the C-functions
>carray_to_std_vectorr and std_vectorr_to_carray, because now I have to
>guess what they do.
>
>[Some code omitted]
>
>> (%c-arr-to-vector-rect
>>          (foreign-alloc :pointer :initial-contents 
>>                 (list (rect 1 2 3 4) 
>>                       (rect 5 6 7 8))) 2)
>>
>
>I am assuming `rect` is a function which calls a defcfun wrapper to
>create a Rect.
>
>
>> VECTOR-RECT-SIZE just gets the size of the vector
>>
>>
>> (dotimes (ic (%vector-rect-size faces))
>> (setf n (%vector-rect-to-c-array faces))
>> (format t "~a~%" (rect-x (mem-aref n :pointer ic))))
>> ; 
>> ; caught WARNING:
>> ;   undefined variable: N
>> ; 
>> ; compilation unit finished
>> ;   Undefined variable:
>> ;     N
>> ;   caught 1 WARNING condition
>> 1 <-- both x values
>> 5
>
>Yes, this works. However most likely not in the way you think it does.
>I think the following is happening:
>
>1. The call to %c-arr-to-vector-rect gets two arguments:
>   a. A pointer to a block of memory containging two pointers to
>      instances of Rect.
>
>      Argument 1: ---->   [pointer a |  pointer b ]  --> [RECT: 5 6 7 8]
>                            |
>                            v
>                       [RECT: 1 2 3 4]
>
>      Argument 2:  2
>
>2. The function `carray_to_std_vectorr` takes these two arguments to do
>   the following:
>
>   a. Create an array of 2 rectangles like this:
>
>          [ [RECT: * * * *] | [RECT: * * * *] ]
>
>   b. Copies the content of Argument 1 into this array:
>
>          [ [RECT: pointer a pointer b * *] | [RECT: * * * *]]
>
>   c. Returns the pointer to a vector wrapping the array constructed above.
>
>Now you can see that the constructed vector<Rect> is garbage.  
>But when you retrieve in lisp the values of this array you assume that
>the array is an array of pointers.  And as such it ignores it should be
>RECTs and just sees two pointers, pointer a and pointer b.
>
>Now your `rect-x` expects pointers and therefore it works.
>
>So it does work, but only because both mistakes (when creating the
>vector and when reading the vector) cancel each other out.
>If you use the array of rectangles in the OpenCV API, the OpenCV code
>will see garbage.
>
>(Note I cannot see all the code, because you give snippets without the
>underlying C-code and data structures, so I cannot be absolutely sure
>but I am pretty confident that this is what is going on.)
>
>Wim Oudshoorn.
>
>
>_______________________________________________
>Cffi-devel mailing list
>Cffi-devel at common-lisp.net
>http://common-lisp.net/cgi-bin/mailman/listinfo/cffi-devel
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.common-lisp.net/pipermail/cffi-devel/attachments/20140426/677a1354/attachment.html>


More information about the cffi-devel mailing list