If you want to be complient with GMP/MPFR/FLINT you should change the signature of

    mpfr_t* my_function (mpfr_t *_coef)

to

    void my_function(mfpr_ptr result, mpfr_ptr input, slong len)

And such function should not do any allocation at all.

Le 05/02/2017 à 11:40, Vincent Delecroix a écrit :
If you had a look at the code I provided you can check that what you did
is very wrong.

mpfr_t is already an array. The type "mpfr_t * x" make no sense at all.

Le 05/02/2017 à 11:38, mmarco a écrit :
I am afraid I didn't explain my problem well enough.

My problem is not to write c++ code with mpfr. That is solved
It is also not to call c++ libraries from cython code that involves plain
mpfr numbers. That is also solved.
My problem is to do so with functions that involve *arrays *(or lists, or
vectors) of mpfr numbers.

In particular, assume that i have writen a c++ library that provides a
function my_function that takes an array of mpfr numbers and returns
another array of mpfr numbers. So I try to write some cython code to
interface in from sage:

#clang C++
#clib my_library


include 'cysignals/signals.pxi'


from sage.libs.mpfr cimport *
from sage.rings.real_mpfr cimport RealNumber
from sage.rings.real_mpfr import RealField


cdef extern from "my_library.h":
    mpfr_t* my_function (mpfr_t *_coef)


def my_cython_function(values):
    cdef mpfr_t* cvalues = <mpfr_t*>
sage_malloc(sizeof(mpfr_t)*len(values))
    cdef mpfr_t tempnum
    cdef mpfr_t* rop
    for i,v in enumerate(values):
        tempnum = values[i].value
        mpfr_init(cvalues[i])
        mpfr_set(cvalues[i], tempnum, MPFR_RNDN)
    sig_on
    rop = my_function(cvalues)
    sig_off


This code is suppopsed to just create an array of mpfr objects to be
passed
to my_function, and another array to get the result of that function.
When
I try to compile it I get the following error:


---------------------------------------------------------------------------

UnicodeDecodeError                        Traceback (most recent call
last)
/home/mmarco/sage/local/lib/python2.7/site-packages/IPython/core/
interactiveshell.pyc in run_code(self, code_obj, result)
   2896             if result is not None:
   2897                 result.error_in_exec = sys.exc_info()[1]
-> 2898             self.showtraceback()
   2899         else:
   2900             outflag = 0

/home/mmarco/sage/local/lib/python2.7/site-packages/IPython/core/
interactiveshell.pyc in showtraceback(self, exc_tuple, filename,
tb_offset,
exception_only)
   1822                     except Exception:
   1823                         stb = self.InteractiveTB.
structured_traceback(etype,
-> 1824                                             value, tb, tb_offset=
tb_offset)
   1825


   1826                     self._showtraceback(etype, value, stb)

/home/mmarco/sage/local/lib/python2.7/site-packages/IPython/core/ultratb.pyc

in structured_traceback(self, etype, value, tb, tb_offset,
number_of_lines_of_context)
   1404         self.tb = tb
   1405         return FormattedTB.structured_traceback(
-> 1406             self, etype, value, tb, tb_offset,
number_of_lines_of_context)
   1407


   1408

/home/mmarco/sage/local/lib/python2.7/site-packages/IPython/core/ultratb.pyc

in structured_traceback(self, etype, value, tb, tb_offset,
number_of_lines_of_context)
   1312             # Verbose modes need a full traceback
   1313             return VerboseTB.structured_traceback(
-> 1314                 self, etype, value, tb, tb_offset,
number_of_lines_of_context
   1315             )
   1316         else:

/home/mmarco/sage/local/lib/python2.7/site-packages/IPython/core/ultratb.pyc

in structured_traceback(self, etype, evalue, etb, tb_offset,
number_of_lines_of_context)
   1162
   1163         formatted_exception =
self.format_exception_as_a_whole(etype
, evalue, etb, number_of_lines_of_context,
-> 1164
 tb_offset)
   1165


   1166         colors = self.Colors  # just a shorthand + quicker name
lookup

/home/mmarco/sage/local/lib/python2.7/site-packages/IPython/core/ultratb.pyc

in format_exception_as_a_whole(self, etype, evalue, etb,
number_of_lines_of_context, tb_offset)
   1111             return ""
   1112
-> 1113         last_unique, recursion_repeat =
find_recursion(orig_etype,
evalue, records)
   1114
   1115         frames = self.format_records(records, last_unique,
recursion_repeat)

/home/mmarco/sage/local/lib/python2.7/site-packages/IPython/core/ultratb.pyc

in find_recursion(etype, value, records)
    453     # quarter of the traceback (250 frames by default) is
repeats,
and find the
    454     # first frame (from in to out) that looks different.
--> 455     if not is_recursion_error(etype, value, records):
    456         return len(records), 0
    457

/home/mmarco/sage/local/lib/python2.7/site-packages/IPython/core/ultratb.pyc

in is_recursion_error(etype, value, records)
    439     # a recursion error.
    440     return (etype is recursion_error_type) \
--> 441            and "recursion" in str(value).lower() \
    442            and len(records) > 500
    443

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position
1158:
ordinal not in range(128)




I tried to circunvent  this problem by using c++ vectors instead of
malloc'ed arrays, but then it is the c++ compilet which complains abput
creating vectors of mpfr_t objects.

Thoughts?


--
You received this message because you are subscribed to the Google Groups 
"sage-devel" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sage-devel+unsubscr...@googlegroups.com.
To post to this group, send email to sage-devel@googlegroups.com.
Visit this group at https://groups.google.com/group/sage-devel.
For more options, visit https://groups.google.com/d/optout.

Reply via email to