Ich möchte meine C-Funktionen in einer gemeinsam genutzten Bibliothek aus Python-Skripten aufrufen. Probleme beim Übergeben von Zeigern, die 64-Bit-Adressen scheinen innerhalb der aufgerufenen Funktion auf 32-Bit-Adressen abgeschnitten zu sein. Python und meine Bibliothek sind 64bit.Python übergibt 32-Bit-Zeigeradresse an C-Funktionen
Die folgenden Beispielcodes veranschaulichen das Problem. Das Python-Skript gibt die Adresse der Daten aus, die an die C-Funktion übergeben werden. Dann wird die empfangene Adresse aus der aufgerufenen C-Funktion gedruckt. Darüber hinaus beweist die C-Funktion, dass es 64-Bit ist, indem die Größe und die Adresse des lokal erstellten Speichers gedruckt werden. Wenn der Zeiger auf andere Weise verwendet wird, ist das Ergebnis ein 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))
Output aus Python-2,7
in [1]: run ../test_plate.py
vorbei Adresse: 7f9a09b02320
weitergegeben Adresse: 0x9b02320
lokale Zeigergröße: 8
lokale Pointer-Adresse: 0x7f9a0949a400
@eryksun Ist ein Windows 'long' immer noch nur 32-Bit auf 64-Bit Windows? – Aya
Auf 64-Bit-Windows ist ein 'Long' 32-Bit und ein' Long-Long' ist 64-Bit. – eryksun
@eryksun Seltsam, aber ich denke, es hat die Tugend, konsequent zu sein. – Aya