[cffi-devel] Fw: Struct member changes when its assigned back to variable it was dereferenced from...do same in lisp fails

Joeish W joeish80829 at yahoo.com
Sun Nov 3 05:46:39 UTC 2013






On Saturday, November 2, 2013 10:44 PM, Joeish W <joeish80829 at yahoo.com> wrote:
 
here is the c code with explanation didn't add all code to keep it short but i know it is still long...if this seems daunting because all the code I added....pls know 1.  I worked on this a long time and added the minimal code i could think to explain the issue 2. if it does seem daunting...if you would be so kind as to look through this and tell me how i could edit my ? to make it easier to answer...with that being said... though this is a very simple post .... Im hoping at the end of the explanation you might be able to help me re-wrap my CV-SEQ struct so i get the same resultt as i do in c
>
>
>CvSeq* contours;  //hold the pointer to a contour in the memory block
>
>
>
>// adds data to CvSeq* contours with &contours call
>cvFindContours(imgGrayScale, storage, &contours, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));
>
>
>// This is how its supposed to work ....no matter how many times you dereference contours to get the h_next struct member
>// the value of contours->h_next  is always the same
>
>
>cout << "c1 = " << endl << " " << contours->h_next << endl << endl;  //output same as next line - see output below
>cout << "c2 = " << endl << " " << contours->h_next << endl << endl; //output same as above line see output below
>
>
>// If you assign contours->h_next to a new variable "c" 
>
>CvSeq* c = contours->h_next;
>
>
>// then cout contours->h_next the output of the below 2 cout's is  still the same as the output of the above 2 - see output below
>
>cout << "c3 = " << endl << " " << contours->h_next << endl << endl;
>cout << "c4 = " << endl << " " << contours->h_next << endl << endl;
>
>
>// but  if you assign contours->h_next back to contours the output of the next 2 couts is different than above 4 
>
>// see output below
>
> contours = contours->h_next;
>cout
 << "c5 = " << endl << " " << contours->h_next << endl << endl;
>cout << "c6 = " << endl << " " << contours->h_next << endl << endl;
>
>
>
>
>here is the cout output
>
>
>c1 = 
> 0x182f730
>
>
>c2 = 
> 0x182f730
>
>c3 = 
> 0x182f730
>
>c4 = 
> 0x182f730
>
>c5 = 
> 0x182f560
>
>c6 = 
> 0x182f560
>
>
>
>
>The struct CvSeq is defined as this
>
>#define CV_TREE_NODE_FIELDS(node_type)                               \ 
>    int       flags;             /* Miscellaneous flags.    
 */      \ 
>    int       header_size;       /* Size of sequence header. */      \ 
>    struct    node_type* h_prev; /* Previous sequence.       */      \ 
>    struct    node_type* h_next; /* Next sequence.           */      \ 
>    struct    node_type* v_prev; /* 2nd previous sequence.   */      \ 
>    struct    node_type* v_next  /* 2nd next sequence.       */ 
> 
>/* 
>   Read/Write sequence. 
>   Elements can be dynamically inserted to or deleted from the sequence. 
>*/ 
>#define CV_SEQUENCE_FIELDS()                                              \ 
>    CV_TREE_NODE_FIELDS(CvSeq);                                           \ 
>    int       total;          /* Total number of elements.            */  \ 
>    int       elem_size;      /* Size of
 sequence element in bytes.   */  \ 
>    schar*    block_max;      /* Maximal bound of the last block.     */  \ 
>    schar*    ptr;            /* Current write pointer.               */  \ 
>    int       delta_elems;    /* Grow seq this many at a time.        */  \ 
>    CvMemStorage* storage;    /* Where the seq is stored.             */  \ 
>    CvSeqBlock* free_blocks;  /* Free blocks
 list.                    */  \ 
>    CvSeqBlock* first;        /* Pointer to the first sequence block. */ 
> 
>typedef struct CvSeq 
>{ 
>    CV_SEQUENCE_FIELDS() 
>} 
>CvSeq;
>
>
>
>Im not getting the same thing as in lisp  with my struct like this - SWIG wrapped 
>
>
>(cffi:defcstruct cv-seq
>  (flags :int)
>  (header-size :int)
>  (h-prev :pointer)
>  (h-next :pointer)
>  (v-prev :pointer)
>  (v-next :pointer)
>  (total :int)
>  (elem-size :int)
>  (block-max :pointer)
>  (ptr :pointer)
>  (delta-elems :int)
>  (storage :pointer)
>  (free-blocks :pointer)
>  (first :pointer))
>
>
>
>
>with the below code my output is the same for both princ...not newline of course =)
>
>
>
>(with-foreign-object (contours '(:pointer (:struct cv-seq)))
>      (find-contours img-grayscale  storage contours
>             (size-of cv-contour) +retr-list+ 
>             +chain-approx-simple+
 (point 0 0))
>
>      (with-foreign-slots ((h-next) contours (:struct cv-seq))
>    (setf contours  h-next)
>    (princ contours)
>    (princ #\newline)
>    (setf contours  h-next)
>    (princ contours)))
>
>
>any help on fixing my struct, my coding or editing this post  =) is much appreciated
>
>
>Cheers!
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.common-lisp.net/pipermail/cffi-devel/attachments/20131102/250e3697/attachment.html>


More information about the cffi-devel mailing list