[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