Vorrei chiamare le mie funzioni C all'interno di una libreria condivisa dagli script Python. I problemi si verificano quando si passano i puntatori, gli indirizzi a 64 bit sembrano essere troncati a indirizzi a 32 bit all'interno della funzione chiamata. Sia Python che la mia libreria sono a 64 bit.Python sta passando l'indirizzo del puntatore a 32 bit alle funzioni C
I seguenti codici di esempio illustrano il problema. Lo script Python stampa l'indirizzo dei dati passati alla funzione C. Quindi, l'indirizzo ricevuto viene stampato dall'interno della funzione C chiamata. Inoltre, la funzione C dimostra che è a 64 bit stampando la dimensione e l'indirizzo della creazione locale di memoria. Se il puntatore viene utilizzato in qualsiasi altro modo, il risultato è un segfault.
CMakeLists.txt
cmake_minimum_required (VERSION 2.6)
add_library(plate MODULE plate.c)
plate.c
#include <stdio.h>
#include <stdlib.h>
void plate(float *in, float *out, int cnt)
{
void *ptr = malloc(1024);
fprintf(stderr, "passed address: %p\n", in);
fprintf(stderr, "local pointer size: %lu\n local pointer address: %p\n", sizeof(void *), ptr);
free(ptr);
}
test_plate.py
import numpy
import scipy
import ctypes
N = 3
x = numpy.ones(N, dtype=numpy.float32)
y = numpy.ones(N, dtype=numpy.float32)
plate = ctypes.cdll.LoadLibrary('libplate.so')
print 'passing address: %0x' % x.ctypes.data
plate.plate(x.ctypes.data, y.ctypes.data, ctypes.c_int(N))
uscita pitone-2,7
In [1]: eseguire ../test_plate.py
indirizzo passando: 7f9a09b02320
indirizzo superato: 0x9b02320
dimensione del puntatore locale: 8
locale indirizzo del puntatore: 0x7f9a0949a400
@eryksun Windows 'long' ancora solo 32 bit su Windows a 64 bit? – Aya
Su Windows a 64 bit un 'long' è a 32 bit e un' long long' è a 64 bit. – eryksun
@eryksun Strano, ma suppongo che abbia il pregio di essere coerente. – Aya