Help with defcallback / CFFI

Discussion of Common Lisp

Help with defcallback / CFFI

Postby joeish80829 » Sun Nov 10, 2013 10:02 pm

I think the issue is with my callback function but not 100% when i run the c code and print
with these 2 lines(from c callback):

Code: Select all
cout << "a = " << "(" << "" << "," << _a << ")" << endl ;
          cout << "b = " << "(" << "" << "," << _b << ")" << endl;

i get 53 elements printed not icluding the other printf output
and in the lisp code i converterd

when i print with this line(from lisp defcallback):
Code: Select all
(format t "~%x~a~%b~a" _a _b)


in the defcallback i get 114 elements

Hoping someone can look at my code and tell me if my coding is off ....the functions you wont recognize are opencv functions
with correctly lispified names i/e cvSeqSort = seq-sort ... If requested will post the wrappers ....
the -> is a macro for with-foreign-slots (and if not a pointer just a getf for a plist)
Code: Select all
;;;;;;;;C CODE;;;;;;;;;;;;;;;;;;;
      #include <cv.h>
      #include <highgui.h>
      using namespace std;

      static int cmp_func( const void* _a, const void* _b, void* userdata )
      {
        //cout << "test";
      //cout <<_a << _b;
          CvPoint* a = (CvPoint*)_a;
          CvPoint* b = (CvPoint*)_b;
          cout << "a = " << "(" << "" << "," << _a << ")" << endl ;
          cout << "b = " << "(" << "" << "," << _b << ")" << endl;
          int y_diff = a->y - b->y;
          int x_diff = a->x - b->x;
          return y_diff ? y_diff : x_diff;
      }


      int main()
      {
          CvMemStorage* storage = cvCreateMemStorage(0);
          CvSeq* seq = cvCreateSeq( CV_32SC2, sizeof(CvSeq), sizeof(CvPoint), storage );
          int i;
   
          printf("\n=== Test sequence sorting ===");

          for( i= 0; i < 10; i++ )
          {
              CvPoint pt;
              pt.x = rand() % 1000;  // 1000 以内的随机数
              pt.y = rand() % 1000;
              cvSeqPush( seq, &pt );
          }
   
          printf("\nOriginal point set:\n");
          for( i = 0; i < seq->total; i++ )
          {
              CvPoint* pt = (CvPoint*)cvGetSeqElem( seq, i );
              printf( "(%d,%d)\n", pt->x, pt->y );
          }

          cvSeqSort( seq, cmp_func, 0 /* userdata is not used here */ );
   
          /* print out the sorted sequence */
          printf("\nAfter sorting:\n");
          for( i = 0; i < seq->total; i++ )
          {
              CvPoint* pt = (CvPoint*)cvGetSeqElem( seq, i );
              printf( "(%d,%d)\n", pt->x, pt->y );
          }
   
          cvClearSeq( seq );   // Sequence clearing should be done before storage clearing
          cvReleaseMemStorage( &storage );
      }

[code];;;;;;;;;;;;;;;;;;;;;;;;;LISP CODE;;;;;;;;;;;;;;;;;;;;
(defcallback cmp-func :void  ((_a :pointer) (_b :pointer) (user-data :pointer) (a :int) (b :int) (y-diff :int) (x-diff :int))
  (format t "~%x~a~%b~a" _a _b)
  (setf a (mem-aref _a '(:struct cv-point)))
  (setf b (mem-aref _b '(:struct cv-point)))
                    ;(format t "~%a~a~%b~a" a b)
  (setf y-diff (- (-> cv-point a y) (-> cv-point b y)))
  (setf x-diff (- (-> cv-point a x) (-> cv-point b x)))
  (if y-diff y-diff x-diff))[/code]



(defun seq-sort-example ()
  (let* ((storage (create-mem-storage 0))
     (seq (create-seq +32sc2+ (size-of cv-seq) (size-of cv-point) storage)))
    (format t "~%=== Test sequence sorting ===")
    (with-foreign-object (pt '(:struct cv-point))
      (dotimes (i 10)
    (setf (foreign-slot-value pt '(:struct cv-point) 'x) (random 1000)
          (foreign-slot-value pt '(:struct cv-point) 'y) (random 1000))
    (seq-push seq pt)))

    (with-foreign-object (pt '(:pointer (:struct cv-point)))
      (format t "~%Original point set:~%")
      (dotimes (i (-> cv-seq seq total))
    (setf pt (get-seq-elem seq i))
    (format t "(~a, ~a)~%" (-> cv-point pt x) (-> cv-point pt y)  )))
    (seq-sort seq (callback cmp-func) (null-pointer))
    (with-foreign-object (pt '(:pointer (:struct cv-point)))
      (format t "~%After sorting:~%")
      (dotimes (i (-> cv-seq seq total))
    (setf pt (get-seq-elem seq i))
    (format t "(~a, ~a)~%" (-> cv-point pt x) (-> cv-point pt y)  )))
    (clear-seq seq)
    (release-mem-storage storage)))
joeish80829
 
Posts: 153
Joined: Tue Sep 03, 2013 5:32 am

Return to Common Lisp

Who is online

Users browsing this forum: Bing [Bot] and 4 guests

cron