in reply to Trees using Inline::C

SV* get_parent(SV* obj) { Node *node = (Node *)SvIV(SvRV(obj)); if(node != NULL && node->parent != NULL) return new( "Node", node->parent->name, node->parent->desc, node->parent->branch_length ); else return NULL; // not sure }
but i would prefer to set parent to NULL inside the new function, and add an iditional member named "class" to your struct treeNode to ensure the same class name

Replies are listed 'Best First'.
Re^2: Trees using Inline::C
by rvosa (Curate) on Aug 01, 2005 at 00:31 UTC
    Thanks for your reply! But, is that efficient memory usage? Memory has already been allocated when:
    my $parent = Node->new('Homo_neanderthalensis', 'Hominid', 5.02);
    was called, and it seems like this new call to
    return new( /*..etc...*/);
    goes the same route? Or am I missing something? Thanks again!
      sure. you are right; but see, a (Node *) has no information about its (SV *). A workaround would be
      typedef struct treeNode { char* name; char* desc; char* class; //in case we need it double branch_length; SV* obj; // the perlobj SV* obj_ref; // the ref to the perlobj struct treeNode *parent; } Node; SV* new(char* class, char* name, char* desc, double branch_length) { Node* node = malloc(sizeof(Node)); node->obj_ref = newSViv(0); node->obj = newSVrv(obj_ref, class); node->class = savepv(class); node->name = savepv(name); node->desc = savepv(desc); node->branch_length = branch_length; node->parent = NULL; // no parent yet sv_setiv(node->obj, (IV)node); SvREADONLY_on(node->obj); return node->obj_ref; } SV* get_parent(SV* obj) { Node *node = (Node *)SvIV(SvRV(obj)); if(node != NULL && node->parent != NULL) return node->parent->obj_ref; else return NULL; // not sure }
      HTH
        Thanks eskar! Will give that a try.