Numeric C extension: bug or error ?

Discussion in 'Python' started by Philippe Grosse, Sep 30, 2003.

  1. Hi,

    I don't understand this strange behaviour:

    I compile this code :

    #include <Python.h>
    #include"Numeric/arrayobject.h"

    static PyObject *
    return_vector(PyObject *self, PyObject *args)
    {
    PyObject *input1;
    PyArrayObject *vector;

    if (!PyArg_ParseTuple(args, "O", &input1))
    return NULL;

    vector = (PyArrayObject
    *)PyArray_ContiguousFromObject(input1,PyArray_DOUBLE, 1, 1);

    if (vector == NULL)
    return NULL;

    return PyArray_Return(vector);

    }

    /* registration table */
    static struct PyMethodDef testMethods[] = {
    {"return_vector", return_vector, 1}, /* method name, C
    funcptr, always-tuple */
    {NULL, NULL} /* end of table marker */
    };

    /* module initializer */
    void inittest() /* called on first import */
    { /* name matters if loaded
    dynamically */
    (void) Py_InitModule("test",testMethods); /* mod name, table ptr */
    import_array(); /* indispensable pour utiliser les arrays */
    }

    Very simple: this module takes a Numeric array (vector) as argument and
    send this array back to python...

    If I compile it under macOSX, the result in python is:

    >>> import test
    >>> from Numeric import *
    >>> v=array([1.0,2.0,3.0,4.0],Float)
    >>> v

    array([ 1., 2., 3., 4.])
    >>> test.return_vector(v)

    array([ 1., 2., 3., 4.])

    but in linux the result is:

    >>> import test
    >>> from Numeric import *
    >>> v=array([1.0,2.0,3.0,4.0],Float)
    >>> v

    array([ 1., 2., 3., 4.])
    >>> test.return_vector(v)

    array([ 1.+0.j, 2.+0.j, 3.+0.j, 4.+0.j])

    Strange !!! the result is a complex array.
    The C vector is really complex because if I try to use it in the C module,
    the result is...incomplete.
    For example, if I try to multiply each item of the vector array by a
    scalar ( pi for example) in a loop, I get this result in python:


    >>> import test
    >>> from Numeric import *
    >>> v=array([1.0,2.0,3.0,4.0],Float)
    >>> test.return_vector(v)

    array([ 3.14159265+0.j, 0.+0.j, 6.28318531+0.j, 0.+0.j])

    It's the result of pi* 1.0, 0.0, 2.0, 0.0 ( the four first elements of the
    internal representation of the complex array ([ 1.+0.j, 2.+0.j, 3.+0.j,
    4.+0.j]).

    Anyone any idea where I'm going wrong?
    Thank you for any help.

    Philippe
     
    Philippe Grosse, Sep 30, 2003
    #1
    1. Advertising

  2. At some point, (Philippe Grosse) wrote:
    > Hi,
    >
    > I don't understand this strange behaviour:
    >
    > I compile this code :

    [code clipped; it looks good]
    ....
    > /* registration table */
    > static struct PyMethodDef testMethods[] = {
    > {"return_vector", return_vector, 1}, /* method name, C
    > funcptr, always-tuple */
    > {NULL, NULL} /* end of table marker */
    > };


    Instead of the magic constant "1", use METH_VARARGS.

    ....
    > Very simple: this module takes a Numeric array (vector) as argument and
    > send this array back to python...
    >
    > If I compile it under macOSX, the result in python is:
    >
    >>>> import test
    >>>> from Numeric import *
    >>>> v=array([1.0,2.0,3.0,4.0],Float)
    >>>> v

    > array([ 1., 2., 3., 4.])
    >>>> test.return_vector(v)

    > array([ 1., 2., 3., 4.])
    >
    > but in linux the result is:
    >
    >>>> import test
    >>>> from Numeric import *
    >>>> v=array([1.0,2.0,3.0,4.0],Float)
    >>>> v

    > array([ 1., 2., 3., 4.])
    >>>> test.return_vector(v)

    > array([ 1.+0.j, 2.+0.j, 3.+0.j, 4.+0.j])


    This isn't what I get; I get the same result under linux as you get
    from Mac OS X. Have you checked that the copies of the code are the
    same?

    --
    |>|\/|<
    /--------------------------------------------------------------------------\
    |David M. Cooke
    |cookedm(at)physics(dot)mcmaster(dot)ca
     
    David M. Cooke, Sep 30, 2003
    #2
    1. Advertising

  3. In article <>,
    (David M. Cooke) wrote:

    > At some point, (Philippe Grosse) wrote:
    > > Hi,
    > >
    > > I don't understand this strange behaviour:
    > >
    > > I compile this code :

    > [code clipped; it looks good]
    > ...
    > > /* registration table */
    > > static struct PyMethodDef testMethods[] = {
    > > {"return_vector", return_vector, 1}, /* method name, C
    > > funcptr, always-tuple */
    > > {NULL, NULL} /* end of table marker */
    > > };

    >
    > Instead of the magic constant "1", use METH_VARARGS.


    I have tried METH_VARARGS: same result

    >
    > ...
    > > Very simple: this module takes a Numeric array (vector) as argument and
    > > send this array back to python...
    > >
    > > If I compile it under macOSX, the result in python is:
    > >
    > >>>> import test
    > >>>> from Numeric import *
    > >>>> v=array([1.0,2.0,3.0,4.0],Float)
    > >>>> v

    > > array([ 1., 2., 3., 4.])
    > >>>> test.return_vector(v)

    > > array([ 1., 2., 3., 4.])
    > >
    > > but in linux the result is:
    > >
    > >>>> import test
    > >>>> from Numeric import *
    > >>>> v=array([1.0,2.0,3.0,4.0],Float)
    > >>>> v

    > > array([ 1., 2., 3., 4.])
    > >>>> test.return_vector(v)

    > > array([ 1.+0.j, 2.+0.j, 3.+0.j, 4.+0.j])

    >
    > This isn't what I get; I get the same result under linux as you get
    > from Mac OS X. Have you checked that the copies of the code are the
    > same?


    Yes, I'm sure, the codes are exactly the same.

    I use this command to compile under linux:

    [grosse@intercalcul dev_fortran]$ gcc -DNDEBUG -O3 -fomit-frame-pointer
    -pipe -mcpu=pentiumpro -march=i586 -ffast-math -fno-strength-reduce -fPIC
    -g -I/usr/include/python2.2 -c test.c -o test.o

    [grosse@intercalcul dev_fortran]$ gcc -shared -g -o test.so test.o

    I can understand where is the problem, I'm totaly confused.

    Thank you for your help
     
    Philippe Grosse, Oct 6, 2003
    #3
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. goetzie
    Replies:
    2
    Views:
    324
    goetzie
    Sep 21, 2006
  2. Replies:
    5
    Views:
    943
    X-Centric
    Jun 30, 2005
  3. darrel
    Replies:
    4
    Views:
    825
    darrel
    Jul 19, 2007
  4. jobs

    int to numeric numeric(18,2) ?

    jobs, Jul 21, 2007, in forum: ASP .Net
    Replies:
    2
    Views:
    968
    =?ISO-8859-1?Q?G=F6ran_Andersson?=
    Jul 22, 2007
  5. Daniel Berger

    [BUG] Bus Error in kstat extension

    Daniel Berger, Sep 28, 2004, in forum: Ruby
    Replies:
    9
    Views:
    222
    Charles Mills
    Sep 30, 2004
Loading...

Share This Page