2011-06-09 3 views
1

J'essaie d'obtenir des données d'un module qui est un objet partagé entouré de ctypes. Les données étant un tableau numérique, j'ai utilisé le tableau numpy pour stocker les données. Mais j'ai appris que je ne comprends pas comment organiser le tableau en mémoire.Comment est-ce que la matrice NIP est organisée en mémoire?

Si j'avais une fonction C qui remplirait un tableau comme ci-dessous:

int filler(int* a,int length){ 
     int i=0; 
     for(i=0;i<length;i++){ 
       a[i]=i; 
     } 
     return 0; 
} 

alors j'appeler cette fonction en python utilisant ctypes

import ctypes 
import numpy 
lib = ctypes.cdll.LoadLibrary("libname")  
data = numpy.zeros((1,10),dtype=numpy.int16) 
lib.filler(data.ctypes.data,ctypes.c_int(10)) 
print data 

Mais ma sortie est de cette façon.

dtype=numpy.int16 
[[0 0 1 0 2 0 3 0 4 0]] 

Cela serait logique si int était 32 bits, mais je suppose que C int sont 16 bits (GCC dans openSUSE dans une machine intel x86). J'ai essayé de courir avec dtypes étant 32 bits et étrangement je reçois le résultat que je veux:

dtype=numpy.int32 
[[0 1 2 3 4 5 6 7 8 9]] 

Essayer de comprendre ce qui se passe j'ai couru avec int8 et je suis la suivante:

dtype=numpy.int8 
[[0 0 0 0 1 0 0 0 2 0]] 

J'ai jeté un coup d'oeil à des documents numpy, mais jusqu'ici je n'ai pas trouvé quelle est la réponse.

Répondre

2

Cela serait logique si int était 32 peu, mais je suppose que C int 16 bits sont (GCC dans openSUSE dans une machine intel x86 ). J'ai essayé de courir avec dtypes étant 32 bits et étrangement j'obtenir le résultat Je veux:

pas étrange du tout: votre supposition est fausse, et la machine est de 32 bits avec un 32 bits int et 16 bits court int .. sauf si vous en faites (plutôt admirable) retrocomputing!

Vérifiez sizeof (int) et multipliez par 8, ou simplement stocker des nombres dans un int et les imprimer, pour vous convaincre.

Questions connexes