chicken-users
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Chicken-users] Question on Chickens C++ interface.


From: felix
Subject: Re: [Chicken-users] Question on Chickens C++ interface.
Date: Mon, 26 Apr 2004 15:10:04 +0200
User-agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.6) Gecko/20040113

Matthias Heiler wrote:

A simplified source code example is:


BTW, the reason why this code segfaults was that C++
assumes here that SomeContainer::ptr refers to an array
of instances, *not* an array of pointers to instances.
Attached is a version that works (on my machine).

Note that it's still not the recommended method of
doing this ! :-)


cheers,
felix
(declare (uses extras lolevel srfi-4 tinyclos))

; Include into generated code, but don't parse:
#>
#include <cassert>
#include <iostream>

using namespace std; 

class SomeClass {
public:
  SomeClass(int i) : i(i) { }
  virtual int data() { return i; }
private:
  int i;
};

class SomeContainer {
public:
  SomeContainer() { }

  void pass_ptr(SomeClass** p, int sz) {
     ptr = p;
     size = sz;
     for (int i = 0; i < size; ++i) {
        cout << ptr[i]->data() << ' ';
     }
     cout << endl;
  }

  void check() {
     for (int i = 0; i < size; ++i) {
        assert(ptr[i]->data() == i);
     }
  }

private:
  SomeClass** ptr;
  int size;
};
<#

; Parse but don't embed:
#>?
<#

; Parse and embed:
#>!
SomeClass* make_some_class(int i) {
  return (new SomeClass(i));
}

void print_some_class(SomeClass* ptr) {
  cout << "SC: " << ptr->data() << endl;
}

SomeContainer* make_sc() {
  return (new SomeContainer);
}

void pass_ptr_sc(SomeContainer* obj, SomeClass** ptr, int sz) {
  obj->pass_ptr(ptr, sz);
}

void check_sc(SomeContainer* obj) {
  obj->check();
}

int ptr2int(void* ptr) {    // HACK
   cout << ptr << endl;
   return (reinterpret_cast<int>(ptr));
}

void* int2ptr(int i) {      // HACK
   return (reinterpret_cast<void*>(i));
}
<#

(define obj (make_sc))

(define vec (make-s32vector 1024 0))

(define sc5 (make_some_class 5))

(print_some_class sc5)

(print 'check1)

(do ((i 0 (+ 1 i)))
    ((= i 10))
  (let ((sc (make_some_class i)))          ; create object
    (print_some_class sc)                  ; show it works
    (s32vector-set! vec i (ptr2int sc))))  ; put it into s32vector

(print 'check2)
(do ((i 0 (+ 1 i)))             ; check if objects in vector still work
    ((= i 10))
  (print_some_class (int2ptr (s32vector-ref vec i))))

(print 'check3)
(print (object->pointer vec))
(print (object->pointer (make-locative vec)))

; the following line segfaults:
(pass_ptr_sc obj (make-locative vec) 10) ; pass vector to container

(print 'check4)
(check_sc obj)

(print 'done)

reply via email to

[Prev in Thread] Current Thread [Next in Thread]