Hey Lars

> -----Original Message-----
> From: [EMAIL PROTECTED] [mailto:numpy-
> [EMAIL PROTECTED] On Behalf Of Lars Friedrich
> Sent: 25 July 2006 12:50
> To: numpy-discussion@lists.sourceforge.net
> Subject: [Numpy-discussion] ctypes, numpy-array
> 
> Hello,
> 
> I would like to work with some data using python/numpy. The data is
> generated with C. To bring the data from C to python, I would like to
> use ctype. I am using python 2.4.3 on a windows-System.
> 
> To accomplish the described task, I have the following plan. Please tell
> me, if this is possible, respectively if there is a better way.
> 
> 1) In C, I write a .dll, that has a function
> int foo(PyObject *arg)
> 
> 2) In python, I generate a numpy-array with the appropriate size. e.g.
> a = zeros((3,3), dtype=int)
> 
> 3) From python, I call my .dll-function with a as an argument:
> windll.mydll.foo(a)

What's might be happening here is that a.ctypes.data is in fact being passed
to your function via ctypes's from_param magic (check the ctypes tutorial
for details).

In [10]: x = N.array([])

In [11]: x.ctypes.data
Out[11]: c_void_p(15502816)

In [12]: x._as_parameter_
Out[12]: 15502816
 
> 4) In the foo-function in the C-.dll I cast the pointer and access the
> data-field.
> PyArrayObject *myPtr = (PyArrayObject*) arg;
> myPtr->data[0] = 1;
> return 0;
>
> However, when I do this, I get an "AccessViolationError writing
> 0x000000000"

So what's probably happening here is that you already have a pointer to the
array's data which you then cast to a PyArrayObject pointer. Dereferencing
myPtr->data is looking for a pointer inside the array's data, which contains
zeros.

Here's a few things to try:

- look at ctypes's PyDLL option if you want to pass around Python objects

- Write your function as:

int foo(int* x);

Then do something like this:

x = N.array([...], dtype=N.intc)
mydll.foo.restype = None
mydll.foo.argtypes = [POINTER(c_int)]
mydll.foo(x.ctypes.data)

This might also work:

x = N.array([...], dtype=N.intc)
mydll.foo.restype = None
mydll.foo(x)

Cheers,

Albert


-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys -- and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Numpy-discussion mailing list
Numpy-discussion@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/numpy-discussion

Reply via email to