When I had to do things like that, I would generally cast the pointer to an IV and pass it around as an IV ref on the Perl side, then manually unwrap it when needed on the C side. This is the approach used by PDL itself.
> On Mar 3, 2022, at 7:55 AM, Ingo Schmid <[email protected]> wrote: > > Hi, > > I'm working on PDL bindings (Inline:::Pdlpp) to the OpenCV (v4.5) tracking > class. I have created a wrapper (see header below). > > I would now need to persistently store pointers to MatWrapper and > TrackerWrapper - which are containers (structs) of the Mat and Tracker > objects. > > At the moment, I have them declared in the auto_include code (struct > TrackerWrapper * tw;). This would then prevent me from using multiple > trackers. I therefore am looking of passing the pointer back and forth. > > I tried using > > OtherPars => 'TrackerWrapper * tw, MatWrapper * mw', .. > > this and a typemap file, it is referenced in the TYPEMAPS field. However, > this results in unknown c type error TrackerWrapper when parsing the pd file. > I think it is never used, following what is said here > https://arxiv.org/pdf/1702.07753.pdf <https://arxiv.org/pdf/1702.07753.pdf>. > Which subset of c-types are allowed? > > Is the approach reasonable and I am doing something wrong? What is the way to > make a c struct persistent and accessible with perl/pp? > > There's Inline-C-Struct, does that work with pdl and if so, how? > > Any help is appreciated. I can share the full code (so far) upon request but > it is work in progress. > > Ingo > > typemap: > > TYPEMAP > > TrackerWrapper T_PTR > > MatWrapper T_PTR > > > > tracker_wrapper.h: > > > #ifdef __cplusplus > extern "C" { > #endif > > > // > struct cvType { > int u8c3 ; > int u8c1 ; > int f32c3 ; > int f32c1 ; > } cvT; > > int tw_init(); > //struct cvType cvT; > typedef struct TrackerWrapper TrackerWrapper; > struct TrackerWrapper * newTracker (int tracker_type); > int deleteTracker (struct TrackerWrapper *); > > struct bBox{ > int x; int y; int width; int height; > }; > > typedef struct MatWrapper MatWrapper; > struct MatWrapper * newMat (const int width, const int height, const int > type, void * data); > void * getData (struct MatWrapper * Mat); > int setData (struct MatWrapper * Mat, const int type, void * data); > > int init_tracker(struct TrackerWrapper * Tr, struct MatWrapper * frame, const > struct bBox * box ); > int update_tracker(struct TrackerWrapper *, struct MatWrapper *, struct bBox > * box); > int show_tracker (struct MatWrapper * frame, struct bBox * roi) ; > > #ifdef __cplusplus > } > #endif > > > > > > _______________________________________________ > pdl-general mailing list > [email protected] > https://lists.sourceforge.net/lists/listinfo/pdl-general
_______________________________________________ pdl-general mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/pdl-general
