Ad

Passing Objects By Reference In Python With Ctypes

- 1 answer

I am trying to use ctypes to interface with c code. I am trying to pass obj by reference to c and I am using ndpointer function from numpy to pass to the function.

My C code:

#include<stdio.h>
#include<stdlib.h>
#include<math.h>


void sum(int *a, int *b, int *c, size_t m) {
    int ix;
    for (ix=0; ix<m; ix++) {
        printf("%d: (%d,%d)\n",ix, a[ix], b[ix]);
        c[ix] = a[ix] + b[ix];
    } 
}

Compiled it to a shared library on ubuntu 20.04 using

gcc -Wall -fPIC -shared -pedantic -shared test.c -o test.so

And my python wrapper is:

import ctypes
from numpy.ctypeslib import ndpointer
import numpy as np

add = ctypes.CDLL('testing_ctypes/test.so').sum
add.argtypes = [ndpointer(dtype=np.int64, ndim=1, flags="aligned, c_contiguous"), ndpointer(dtype=np.int64, ndim=1, flags="aligned, c_contiguous"), ndpointer(dtype=np.int64, ndim=1,flags="aligned, c_contiguous"), ctypes.c_size_t]
add.restype = None
def test_add(a, b):
    c = np.array([0,0,0], dtype=np.int64)
    add(a,b,c,5)
    return c

op = test_add(np.array([1, 10, 5], np.int64), np.array([5, 4, 6], np.int64))

When I run this code I get the output:

0: (1,5) 
1: (0,0)  
2: (10,4)  
3: (0,0)  
4: (5,6)

Why are the values not contiguous? I tried different flags given in numpy reference but none of them have any effect on output. I am super confused why this would be the output. Any help is appreciated!

Ad

Answer

Your C function takes int * arguments but your np.array is using 64-bit integers. In C, int is 4 bytes (32-bit). Try np.int32.

Ad
source: stackoverflow.com
Ad