Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Interfaçage autre langage Python Discussion :

Ctypes - Récupérer un tableau d'entier d'une fonction C


Sujet :

Interfaçage autre langage Python

  1. #1
    Membre actif
    Ctypes - Récupérer un tableau d'entier d'une fonction C
    Bonjour,

    J'appelle une fonction C qui renvoie un tableau d'entiers.
    Mais je n'arrive pas à récupérer le résultat côté Python.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    long * MaFunctionC() {
    	long *result;
    	result[0] = 0;
    	result[1] = 10;
    	result[2] = 20;
    	result[3] = 30;
    	return result;
    }



    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    MaLib = ctypes.cdll.LoadLibrary('MaLib.so')
    MaLib.MaFunctionC.restype = ct.c_long
    resultat = MaLib.MaFunctionC()
    i = 0
    while i <= 3:
        print("i : ", i)
        print("resultat[i] : ", resultat[i])
        i += 1


    J'ai ce message d'erreur : TypeError: 'int' object has no attribute '__getitem__'

  2. #2
    Expert éminent
    Salut,

    ct.c_long déclare un int Python et tu veux récupérer un tableau c.

    Fait un print(resultat) pour voir.

    C'est ton code c ? Parce que si il est simple, alors utilise CPython, pour de petits codes ça n'a rien de compliqué.

  3. #3
    Membre actif
    Citation Envoyé par VinsS Voir le message
    Fait un print(resultat) pour voir.
    Ca renvoie ça :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    <SimulationController.LP_c_long_Array_4 object at 0x7f05bec85c20>


    Citation Envoyé par VinsS Voir le message

    C'est ton code c ? Parce que si il est simple, alors utilise CPython, pour de petits codes ça n'a rien de compliqué.
    Oui, mais je n'ai mis que le petit bout important ici.

  4. #4
    Expert éminent
    Mouais, les arrays demandent une autre déclaration: restype = ctypes.POINTER(ctypes.c_float)

    Il y a des chances que ceci corresponde à ton besoin:
    https://stackoverflow.com/questions/...tion-in-ctypes

  5. #5
    Membre actif
    J'ai essayé :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    MaLib.MaFunctionC.restype = ct.ARRAY(ct.c_long, 4)


    mais ça me renvoie :

    resultat[0] : 140406211129088
    resultat[1] : 140406211447534
    resultat[2] : 0
    resultat[3] : 140406211450903

  6. #6
    Membre actif
    Citation Envoyé par VinsS Voir le message
    Mouais, les arrays demandent une autre déclaration: restype = ctypes.POINTER(ctypes.c_float)
    Il y a des chances que ceci corresponde à ton besoin:
    https://stackoverflow.com/questions/...tion-in-ctypes
    Quand on trouve ce qu'il faut, ça va mieux...et pourtant, j'en ai fait des recherches...

    Au final, je fais :
    Côté C
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    long * MaFunctionC() {
    	static long result[4];
    	result[0] = 0;
    	result[1] = 1;
    	result[2] = 2;
    	result[3] = 3;
    	return result;
    }

    Côté Python
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    MaLib = ctypes.cdll.LoadLibrary('MaLib.so')
    MaLib.MaFunctionC.restype = ct.POINTER(ct.c_long)
    resultat = MaLib.MaFunctionC()
    i = 0
    while i <= 3:
        print("i : ", i)
        print("resultat[i] : ", resultat[i])
        i += 1


    Et j'obtiens :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    resultat[0] : 0
    resultat[1] : 1
    resultat[2] : 2
    resultat[3] : 3

###raw>template_hook.ano_emploi###