Ctypes et Python 3 : un sérieux problème de fonction de rappel pour mon projet
Ce code C illustré ci-dessous produit une sortie contenant 7x7 valeurs flottantes en traitant une matrice contenant 7x3 valeurs entières en entrée. (En fait, la taille de la matrice d'entrée peut être de 7000 x 3. Le nombre de colonnes est fixe mais le nombre de lignes peut changer)
input
1 0 0
2 1 0
3 1 2
4 0 0
5 4 0
6 4 5
7 5 6
cfun.c
#include<stdio.h>
#include<stdlib.h>
float** nrm_matrix(int **A, int R) {
float** ped=(float**)malloc(R*sizeof(float*));
for (int i = 0; i < R; i++){
ped[i]=(float*)malloc(sizeof(float)*R);
}
for(int i=0; i<R; i++){
for(int j=0;j<R;j++){
ped[i][j]=A[0][0]+0.8;
ped[j][i]=A[6][0]+0.3;
}
}
return ped;
free(ped);
}
pour une raison impérieuse, j'ai créé une fonction en utilisant couple pointeur float ** nrm_matrix (int ** A, int R). Cette fonction fonctionne correctement dans l'environnement C et donne le résultat suivant, comme mentionné précédemment :
output
7.30 7.30 7.30 7.30 7.30 7.30 7.30
1.80 7.30 7.30 7.30 7.30 7.30 7.30
1.80 1.80 7.30 7.30 7.30 7.30 7.30
1.80 1.80 1.80 7.30 7.30 7.30 7.30
1.80 1.80 1.80 1.80 7.30 7.30 7.30
1.80 1.80 1.80 1.80 1.80 7.30 7.30
1.80 1.80 1.80 1.80 1.80 1.80 7.30
Je veux appeler cette fonction à partir de python 3. Et j'ai compilé le code C et préparé le fichier test.py comme indiqué ci-dessous:
gcc -o nrm.so --shared -fPIC cfun.c
test.py
import numpy as np
import ctypes
from ctypes import *
dll = ctypes.CDLL("./nrm.so")
nrmfunc = dll.nrm_matrix
nrmfunc.argtypes = POINTER(POINTER(c_int)), c_int
nrmfunc.restype = ctypes.c_float
x=np.matrix([[1, 0, 0], #<------------input file as a matrix
[2, 1, 0],
[3, 1, 2],
[4, 0, 0],
[5, 4, 0],
[6, 4, 5],
[7, 5, 6]])
rows = 7
y=nrmfunc(x, rows)
print(y)
Traceback (most recent call last):
File "C:\Users\Casper\Desktop\sorulacak\test.py", line 29, in <module>
y=nrmfunc(x, rows)
ctypes.ArgumentError: argument 1: <class 'TypeError'>: expected LP_LP_c_long instance instead of matrix
Lorsque j'exécute ce code, j'obtiens cette erreur. J'essaie depuis exactement cinq jours, mais je n'arrive pas à résoudre le problème. Je suis novice en codage. Aidez-moi, s'il vous plaît. Comment résoudre ce problème???
Solution du problème
numpy
les tableaux sont des tableaux à deux dimensions et non des tableaux de pointeurs. Effectuez les modifications suivantes :
test.c
#include <stdio.h>
#include <stdlib.h>
#ifdef _WIN32
# define API __declspec(dllexport)
#else
# define API
Commentaires
Enregistrer un commentaire