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

numpyles 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

Posts les plus consultés de ce blog

Erreur Symfony : "Une exception a été levée lors du rendu d'un modèle"

Détecter les appuis sur les touches fléchées en JavaScript

Une chaîne vide donne "Des erreurs ont été détectées dans les arguments de la ligne de commande, veuillez vous assurer que tous les arguments sont correctement définis"