From mboxrd@z Thu Jan 1 00:00:00 1970 Received: (from majordomo@localhost) by pauillac.inria.fr (8.7.6/8.7.3) id GAA20577; Mon, 12 Jul 2004 06:46:24 +0200 (MET DST) X-Authentication-Warning: pauillac.inria.fr: majordomo set sender to owner-caml-list@pauillac.inria.fr using -f Received: from nez-perce.inria.fr (nez-perce.inria.fr [192.93.2.78]) by pauillac.inria.fr (8.7.6/8.7.3) with ESMTP id GAA20755 for ; Mon, 12 Jul 2004 06:46:23 +0200 (MET DST) Received: from web53205.mail.yahoo.com (web53205.mail.yahoo.com [206.190.39.221]) by nez-perce.inria.fr (8.12.10/8.12.10) with SMTP id i6C4kLEV027532 for ; Mon, 12 Jul 2004 06:46:22 +0200 Message-ID: <20040712044621.65581.qmail@web53205.mail.yahoo.com> Received: from [155.98.68.51] by web53205.mail.yahoo.com via HTTP; Sun, 11 Jul 2004 21:46:21 PDT Date: Sun, 11 Jul 2004 21:46:21 -0700 (PDT) From: Andy Yang Subject: Re: [Caml-list] Toplevel crashes when trying to call external functions To: John Prevost , ayerkes@speakeasy.net Cc: caml-list@inria.fr In-Reply-To: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Miltered: at nez-perce with ID 40F2179E.000 by Joe's j-chkmail (http://j-chkmail.ensmp.fr)! X-Loop: caml-list@inria.fr X-Spam: no; 0.00; caml-list:01 crashes:01 crashes:01 prevost:01 prevost:01 non-caml:01 curses:01 initscr:01 curses:01 non-caml:01 opaque:01 caml's:01 pointers:01 camlparam:01 camlreturn:01 Sender: owner-caml-list@pauillac.inria.fr Precedence: bulk Thanks a lot! You are correct about the pointer representation in Ocaml. However, just now I tried your codes, it still crashes. Actually, SAT_Manager is a pointer to a C++ class object. In order to use the C++ library in Ocaml, firstly a C wrapper is added onto the C++ code( this part has been tested. Calling from the C wrapper, these C++ objects work fine.) Then I tried to call these wrapper functions from Ocaml. One questions: Why do you mention C++ codes here? It seems that currently Ocaml support onlu C interfaces. Thanks a lot! Andy --- John Prevost wrote: > You shouldn't have to package up a non-caml managed > pointer in any > sort of caml structure at all. Take a look at > section 18.6 of the > manual, specifically the definitions of > curses_initscr and > curses_wrefresh. Any pointer that's outside the > caml heap (that is, > pretty much any pointer that you're getting from a > non-caml function) > can simply be treated as opaque, and you can use > Caml's type system to > make sure it's valid (as long as the C code always > handles these > pointers correctly.) > > I'd write your code like the following, based on > that: > > Caml code: > type sat_manager > external zchaff_InitManager : unit -> sat_manager > external zchall_ReadCnf : sat_manager -> string -> > unit > > C++ code: > value zchaff_InitManager(void) > { > CAMLparam0(); > CAMLreturn((value) SAT_InitManager()); > } > > void zchaff_ReadCnf(value mng, value filename) > { > CAMLparam2(mng, filename); > SAT_Manager solver = (void*)mng; > cout<<"solver = "< assert(solver != NULL); > char * fn = String_val(filename); > cout<<"file = "< read_cnf(solver, fn); > CAMLreturn0; > } > > One thing I wonder about, though, is the line: > > SAT_Manager solver = (void*)mng; > > shouldn't you be casting to something other than > (void*) here? Not > that I know anything about how the type SAT_Manager > is represented. > > John. > __________________________________ Do you Yahoo!? Yahoo! Mail - 50x more storage than other providers! http://promotions.yahoo.com/new_mail ------------------- To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/ Beginner's list: http://groups.yahoo.com/group/ocaml_beginners