Re: [ctypes-users] ctypes-users Digest, Vol 41, Issue 3
Brought to you by:
theller
From: <jas...@ma...> - 2009-10-18 20:41:38
|
I also need to call a function that will include a Vector of strings. I guess this will have the same issue. Any suggestions on the best approach. Can the function be chnaged in the source so that it does not use vector or is it better to wrap in C and then send into the C++ DLL. Regards Jason -----Original Message----- From: cty...@li... To: cty...@li... Sent: Sun, Oct 18, 2009 1:04 pm Subject: ctypes-users Digest, Vol 41, Issue 3 Send ctypes-users mailing list submissions to cty...@li... To subscribe or unsubscribe via the World Wide Web, visit https://lists.sourceforge.net/lists/listinfo/ctypes-users r, via email, send a message with subject or body 'help' to cty...@li... You can reach the person managing the list at cty...@li... When replying, please edit your Subject line so it is more specific han "Re: Contents of ctypes-users digest..." oday's Topics: 1. Re: calling function with a string (Thomas Stover) 2. Re: calling function with a string (Mark Tolonen) --------------------------------------------------------------------- Message: 1 ate: Sat, 17 Oct 2009 08:32:41 -0500 rom: Thomas Stover <th...@ws...> ubject: Re: [ctypes-users] calling function with a string o: cty...@li... essage-ID: <4AD...@ws...> ontent-Type: text/plain; charset=ISO-8859-1; format=flowed <jas...@ma...> wrote in message > Hi Users > > Am trying out the ctypes module. > I have a dll with a function expecting the following. > double priceFromYield( > double Yield, // number of percentage points > double Coupon, // assumed face value = 100 > double compfreq, // compounding frequency of yield > int settleDays, // number of settlement days > string TodaysDate, // today's date - trade date > string DatedDate, // dated date - issue date > string FirstCpnDate, // first coupon date > string LastCpnDate, // last coupon date prior to maturity > string MaturityDate, // maturity date > string Tenor, // coupon tenor: "6m", "1y" > string DayCount, // day count conventions > string RollConv, // roll conventions of business days > string Calendar, // holiday calendar > string CouponTpye // coupon type > ); > "string" is a C++ object. ctypes knows nothing about it. Also, a C++ function looks "different"...declare it as a "C" function. If you control the source code, use "const char *" instead of "string" and make sure to declare the function extern "C", e.g.: extern "C" __declspec(dllexport) double priceFromYield( double Yield, // number of percentage points double Coupon, // assumed face value = 100 double compfreq, // compounding frequency of yield int settleDays, // number of settlement days const char* TodaysDate, // today's date - trade date const char* DatedDate, // dated date - issue date const char* FirstCpnDate, // first coupon date const char* LastCpnDate, // last coupon date prior to maturity const char* MaturityDate, // maturity date const char* Tenor, // coupon tenor: "6m", "1y" const char* DayCount, // day count conventions const char* RollConv, // roll conventions of business days const char* Calendar, // holiday calendar const char* CouponTpye // coupon type ) { ...code... } The Python code needs to declare the result type and arguments: from ctypes import * dll=CDLL('mydll') dll.priceFromYield.restype = c_double dll.priceFromYield.argtypes = [ c_double,c_double,c_double,c_int, c_char_p,c_char_p,c_char_p,c_char_p,c_char_p, c_char_p,c_char_p,c_char_p,c_char_p,c_char_p ] dll.priceFromYield(1,1,1,1,'a','b','c','d','e','f','g','h','i','j') I posted this quickly...ask if anything is unclear. -Mark ometimes it is also possible to wrap C++ in C, then use ctypes. It's oing to be compiler specific though. Certainly not ideal, but if it is hird party code... his quickly gets insane. For instance, at best, C++ exceptions could all shims that set a flag in an event loop or something that latter ets picked up by the C wrapper. It's probably more annoying that alling C from Fortran. Don't worry, eventually the world will submit to the unyielding wesomeness of C and python for every situation. :) ----------------------------- Message: 2 ate: Sat, 17 Oct 2009 08:51:19 -0700 rom: "Mark Tolonen" <met...@gm...> ubject: Re: [ctypes-users] calling function with a string o: cty...@li... essage-ID: <hbcp5l$jkj$1...@ge...> ontent-Type: text/plain; format=flowed; charset="iso-8859-1"; reply-type=original Thomas Stover" <th...@ws...> wrote in message ews:4AD...@ws...... > <jas...@ma...> wrote in message > > >> Hi Users >> > > >> Am trying out the ctypes module. >> I have a dll with a function expecting the following. >> double priceFromYield( >> double Yield, // number of percentage points >> double Coupon, // assumed face value = 100 >> double compfreq, // compounding frequency of yield >> int settleDays, // number of settlement days >> string TodaysDate, // today's date - trade date >> string DatedDate, // dated date - issue date >> string FirstCpnDate, // first coupon date >> string LastCpnDate, // last coupon date prior to >> maturity >> string MaturityDate, // maturity date >> string Tenor, // coupon tenor: "6m", "1y" >> string DayCount, // day count conventions >> string RollConv, // roll conventions of business days >> string Calendar, // holiday calendar >> string CouponTpye // coupon type >> ); >> > > "string" is a C++ object. ctypes knows nothing about it. Also, a C++ > function looks "different"...declare it as a "C" function. > > If you control the source code, use "const char *" instead of "string" > and > make sure to declare the function extern "C", e.g.: > > extern "C" __declspec(dllexport) double priceFromYield( > double Yield, // number of percentage points > double Coupon, // assumed face value = 100 > double compfreq, // compounding frequency of yield > int settleDays, // number of settlement days > const char* TodaysDate, // today's date - trade date > const char* DatedDate, // dated date - issue date > const char* FirstCpnDate, // first coupon date > const char* LastCpnDate, // last coupon date prior to > maturity > const char* MaturityDate, // maturity date > const char* Tenor, // coupon tenor: "6m", "1y" > const char* DayCount, // day count conventions > const char* RollConv, // roll conventions of business days > const char* Calendar, // holiday calendar > const char* CouponTpye // coupon type > ) > { > ...code... > } > > The Python code needs to declare the result type and arguments: > > from ctypes import * > dll=CDLL('mydll') > dll.priceFromYield.restype = c_double > dll.priceFromYield.argtypes = [ > c_double,c_double,c_double,c_int, > c_char_p,c_char_p,c_char_p,c_char_p,c_char_p, > c_char_p,c_char_p,c_char_p,c_char_p,c_char_p > ] > dll.priceFromYield(1,1,1,1,'a','b','c','d','e','f','g','h','i','j') > > I posted this quickly...ask if anything is unclear. > > -Mark > > Sometimes it is also possible to wrap C++ in C, then use ctypes. It's going to be compiler specific though. Certainly not ideal, but if it is third party code... This quickly gets insane. For instance, at best, C++ exceptions could call shims that set a flag in an event loop or something that latter gets picked up by the C wrapper. It's probably more annoying that calling C from Fortran. Don't worry, eventually the world will submit to the unyielding awesomeness of C and python for every situation. :) There's also SWIG (http://www.swig.org/). It can nicely wrap C++ functions nd classes. -Mark ------------------------------ ------------------------------------------------------------------------------ ome build with us! The BlackBerry(R) Developer Conference in SF, CA s the only developer event you need to attend this year. Jumpstart your eveloping skills, take BlackBerry mobile applications to market and stay head of the curve. Join us from November 9 - 12, 2009. Register now! ttp://p.sf.net/sfu/devconference ------------------------------ _______________________________________________ types-users mailing list typ...@li... ttps://lists.sourceforge.net/lists/listinfo/ctypes-users nd of ctypes-users Digest, Vol 41, Issue 3 ****************************************** |