[Top][All Lists]
[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)