/*
ctypes_test1.c
L'objectif est d'avoir une soubroutine en C
qui peut être accédé depuis le langage Python.
Pour compiler depuis un Terminal :
gcc -shared -Wl,-soname,ctypes_test1 -o ctypes_test1.so -fPIC ctypes_test1.c
gcc -shared -o ctypes_test1.so -fPIC ctypes_test1.c
Pour les options,
c.f. https://gcc.gnu.org/onlinedocs/gcc/Option-Summary.html
L'option "-Wl,-soname,pyco1" me semble inutile.
********************************************************/
#include <stdio.h>
#include <string.h>
// c.f. https://www.tutorialspoint.com/c_standard_library/string_h.htm
int hellotest() {
//===============
printf("Hello Wolrd\n"); // ne sera écrit nulle part !
return 7;
} // hellotest
long multiplier(long a, long b) {
//===============================
//Attend deux entiers et les multiple
return a * b;
} // multiplier
// Ne fonctionne pas, le type float et le type double ne sont pas
// reconnus.
double multiplierfxf(double a, double b) {
//========================================
//Attend deux nombres à virgule et les multiplie
return a * b;
} // multiplierfxf
char *dit_papa(char *p) {
//=======================
// Retourne le string envoyé en argument, suivit de " papa".
return strcat(p, " papa");
}
char *dit_bonjour(char *p) {
//==========================
// Retourne "Bonjour " suivit du string envoyé en argument
// c.f. https://www.tutorialspoint.com/cprogramming/c_arrays.htm
char temp[100];
strcpy(temp, "Bonjour ");
return strcat(temp, p);
}
# ctypes_test1.py
# L'objectif est d'accéder à des routines écrites en langage C
# depuis un programme Python.
# c.f. https://docs.python.org/3/library/ctypes.html
import ctypes
montest = ctypes.CDLL("/home/bg/Bg2/Python/ctests/testsimple.so")
# Il faut donner le chemin complet du fichier .so à inclure.
# Sous Linux, un fichier .so correspond à une .dll sous Windows.
print(montest.hellotest())
# Par défaut, les type sont int ou long,
# donc, il n'y a pas de conversion à faire.
a = 12
#a = ctypes.c_int(12) # a le même effet que : a = 12
b = 11
c = montest.multiplier(a, b) # Ceci fonctionne bien !
print("a*b=", a, "*", b, "=", c)
print("Le type de c est :", type(c))
print()
#================================================
va = 1.1
vb = 1.2
# Converti en type "double" du langage C
cva = ctypes.c_double(va)
cvb = ctypes.c_double(vb)
#print(cva) # pour information
#print(cva.value) # pour information
# Indique que le type de retour de la fonction est "double"
montest.multiplierfxf.restype = ctypes.c_double
# Appelle de la fonction écrite en langage C
cvres = montest.multiplierfxf(cva, cvb)
print("va*vb =", cva.value, "*", vb, "=", cvres)
print("Le type de cvres est :", type(cvres))
print()
#================================================
mypystring = "le kiwi"
astr = ctypes.c_char_p(mypystring.encode('utf8'))
print(astr.value)
# Indique le type de la variable retournée par la fonction C
montest.dit_papa.restype = ctypes.c_char_p
cstrrep = montest.dit_papa(astr)
print(cstrrep)
print(astr.value) # L'appelle à la fonction a modifié la valeur de astr.value !
print("Le type de cstrrep est :", type(cstrrep))
print()
#================================================
# Indique le type de la variable retournée par la fonction C
montest.dit_bonjour.restype = ctypes.c_char_p
cret = montest.dit_bonjour(ctypes.c_char_p("Monsieur".encode('utf8')))
print(cret)
print("Le type de cret est :", type(cret))
# c.f. # Indique le type de la variable retournée par la fonction C
# 16.16.1.4 Fundamental data types :
# Ce paragraphe indique les correspondances entre les type en langage C
# et ce qui est utilisable en Python.
# Il faut changer les type des arguments que l'on transmet au C
# Avec .restype = ... il faut indiquer le type de la variable retournée.
/* ctypes_test2.c L'objectif est d'avoir une soubroutine en C qui peut être accédé depuis le langage Python. gcc -shared -o ctypes_test2.so -fPIC ctypes_test2.c gcc -I /usr/include/python3.5 -shared -Wl,-soname,pyco2 -o pyc02.so -fPIC pyc02.c "-I /usr/include/python3.5" indique où trouver la librairie`gcc -print-prog-name=cc1` -v Pour afficher la liste des répertoires utilisés par gcc c.f. http://www.network-theory.co.uk/docs/gccintro/gccintro_21.html ------------------------------------------------------------------- Pour l'emplacement des librairies utilisées par gcc. Par défaut, gcc cherche les headers dans : /usr/local/include/ /usr/include/ Par défaut, gcc cherche les librairies dans : /usr/local/lib/ /usr/lib/ On peut ajouter des répertoires de "include" (.h) ainsi : C_INCLUDE_PATH="/usr/include/python3.5" export C_INCLUDE_PATH gcc -shared -o pyc02.so -fPIC pyc02.c Sera suffisant pour compiler le programme c, qui utilise une librairie de Python Pour du C++, il faut : CPLUS_INCLUDE_PATH=/opt/gdbm-1.8.3/include export CPLUS_INCLUDE_PATH Pour des librairies : LIBRARY_PATH=/opt/gdbm-1.8.3/lib export LIBRARY_PATH This directory will be searched after any directories specified on the command line with the option -L, and before the standard default directories (such as ‘/usr/local/lib’ and ‘/usr/lib’). c.f. : http://www.network-theory.co.uk/docs/gccintro/gccintro_23.html ******************************************************************************/ int fact(int n) { //=============== // Fonction factorielle récursive en C if (n < 2) return(1); return (n)*fact(n-1); } // fact int pgcd(int a, int b) { //====================== // fonction 'pgcd' en C int r; while (b!=0) { r = a%b; a = b; b = r; } return a; } // pgcd
# ctypes_test2.py
# L'objectif est d'accéder à des routines écrites en langage C
# depuis un programme Python.
# c.f. https://docs.python.org/3/library/ctypes.html
import ctypes
montest = ctypes.CDLL("/home/bg/Bg2/Python/ctests/ctypes_test2.so")
# Il faut donner le chemin complet du fichier .so à inclure.
# Sous Linux, un fichier .so correspond à une .dll sous Windows.
print(montest.fact(7))
print(montest.pgcd(5040, 3003))
# Fonctionne très bien.
a=5040
b=3003
c=montest.pgcd(a, b)
print("Le pgcd(", a, ",", b, ") =",c)
n=10
n_fact = montest.fact(n)
print(n, "! =", n_fact)
# Ces tests fonctionnent très bien et sont très simples,
# car on utilise que des nombres entiers !
/*
test0.c
L'objectif est d'avoir une soubroutine en C
qui peut être accédé depuis le langage Python.
Pour compiler depuis un Terminal :
gcc -shared -o test0.so -fPIC test0.c
Depuis Python, si on veut taper dans la console :
import os
os.getcwd() # indique le répertoire par défaut
os.chdir("/home/bg/Bg2/Python/ctests") # pour changer le répertoire par défaut
import test0
test0.compte("abcdefgh") # retournera la longueur du string. Ici = 8
Mieux : exécuter le script test0.py qui est donné dans un autre fichier.
Pour les types que Python reconnait et peut convertir en C :
https://www.tutorialspoint.com/python/python_further_extensions.htm
Curiosité :
import sys
sys.getrefcount(test0)
*****************************************************/
#include "Python.h"
#include <string.h>
// c.f. https://www.tutorialspoint.com/c_standard_library/string_h.htm
static PyObject* test0_compte(PyObject *self, PyObject *args) {
//=============================================================
// Définit la fonction en C qui sera appelée depuis Python
const char* command;
int sts;
if (!PyArg_ParseTuple(args, "s", &command)) return NULL;
// c.f. https://docs.python.org/3.3/c-api/arg.html#PyArg_ParseTuple
sts = strlen(command); // retourne la longueur de la chaine de caractères
// Plus exactement, le nombre d'octets qui code cette chaîne de caractères
return PyLong_FromLong(sts);
} // test0_compte
static PyMethodDef test0Methods[] = {
//===================================
{"compte", test0_compte, METH_VARARGS,
"Compte le nombre de caractères d'une chaîne,\
les caractères accentués comptent double.\n\
Il faut donner une chaine de caractères en paramètre."},
// Est un texte d'aide. Obtenu avec : print(test0.compte.__doc__)
{NULL, NULL, 0, NULL} // Sentinel
};
static struct PyModuleDef test0module = {
//=======================================
// Est une structure nécessaire pour Python ???
PyModuleDef_HEAD_INIT,
"test0", /* name of module */
NULL, //test0_doc, /* module documentation, may be NULL */
-1, /* size of per-interpreter state of the module,
or -1 if the module keeps state in global variables. */
test0Methods
};
PyMODINIT_FUNC PyInit_test0(void) {
//=================================
// Fonction de création du module
return PyModule_Create(&test0module);
} // PyInit_test0
int main(int argc, char *argv[]) {
//================================
// Fonction principale, qui sera exécutée au chargement du module
wchar_t *program = Py_DecodeLocale(argv[0], NULL);
if (program == NULL) {
fprintf(stderr, "Fatal error: cannot decode argv[0]\n");
exit(1);
}
/* Add a built-in module, before Py_Initialize */
PyImport_AppendInittab("test0", PyInit_test0);
/* Pass argv[0] to the Python interpreter */
Py_SetProgramName(program);
/* Initialize the Python interpreter. Required. */
Py_Initialize();
/* Optionally import the module; alternatively,
import can be deferred until the embedded script
imports it. */
PyImport_ImportModule("test0");
PyMem_RawFree(program);
return 0;
} // main
// Il y a beaucoup de points que je ne comprends pas, mais cela fonctionne !
"""
test0.py
Ceci est un exemple d'appel à une routine écrite en langage C.
Test la librairie de démo "test0.c"
"""
import test0
print(test0.compte("abcdefgh")) # affiche 8, qui est le nombre de caractères.
print(test0.compte("abc def")) # affiche 7, qui est le nombre de caractères.
print(test0.compte("aéb")) # affiche 4, car en utf-8, "é" prend 2 octets
str="Ceci est dans une variable"
print(test0.compte(str))
print(test0.compte.__doc__) # pour afficher de l'aide sur la fonction test0.compte
/*
test1.c
L'objectif est d'avoir une soubroutine en C
qui peut être accédé depuis le langage Python.
Pour compiler depuis un Terminal :
gcc -shared -o test1.so -fPIC test1.c
Depuis Python, si on veut taper dans la console :
import os
os.getcwd() # indique le répertoire par défaut
os.chdir("/home/bg/Bg2/Python/ctests") # pour changer le répertoire par défaut
import test1
test1.mult(11,7) # retournera le produit 11 * 7
Les arguments doivent être deux nombres entiers.
Mieux : exécuter le script test1.py qui est donné dans un autre fichier.
Pour les types que Python reconnait et peut convertir en C :
https://www.tutorialspoint.com/python/python_further_extensions.htm
Curiosité :
import sys
sys.getrefcount(test1)
***********************************************************/
#include "Python.h"
static PyObject *test1_mult(PyObject *self, PyObject *args) {
//=============================================================
// Définit la fonction en C qui sera appelée depuis Python
const long lNb1;
const long lNb2;
long lRep;
if (!PyArg_ParseTuple(args, "ll", &lNb1, &lNb2)) return NULL;
// c.f. https://docs.python.org/3.3/c-api/arg.html#PyArg_ParseTuple
lRep = lNb1 * lNb2;
return PyLong_FromLong(lRep);
// c.f. https://docs.python.org/3.3/c-api/long.html
} // test1_mult
static PyMethodDef test1Methods[] = {
//===================================
{"mult", test1_mult, METH_VARARGS,
"mult prend deux nombres entiers en entrée et retourne leur produit."},
// Est un texte d'aide. Obtenu avec : print(test1.mult.__doc__)
{NULL, NULL, 0, NULL} // Sentinel
};
static struct PyModuleDef test1module = {
//=======================================
// Est une structure nécessaire pour Python ???
PyModuleDef_HEAD_INIT,
"test1", /* name of module */
NULL, //test1_doc, /* module documentation, may be NULL */
-1, /* size of per-interpreter state of the module,
or -1 if the module keeps state in global variables. */
test1Methods
};
PyMODINIT_FUNC PyInit_test1(void) {
//=================================
// Fonction de création du module
return PyModule_Create(&test1module);
} // PyInit_test1
int main(int argc, char *argv[]) {
//================================
// Fonction principale, qui sera exécutée au chargement du module
wchar_t *program = Py_DecodeLocale(argv[0], NULL);
if (program == NULL) {
fprintf(stderr, "Fatal error: cannot decode argv[0]\n");
exit(1);
}
/* Add a built-in module, before Py_Initialize */
PyImport_AppendInittab("test1", PyInit_test1);
/* Pass argv[0] to the Python interpreter */
Py_SetProgramName(program);
/* Initialize the Python interpreter. Required. */
Py_Initialize();
/* Optionally import the module; alternatively,
import can be deferred until the embedded script
imports it. */
PyImport_ImportModule("test1");
PyMem_RawFree(program);
return 0;
} // main
// Il y a beaucoup de points que je ne comprends pas, mais cela fonctionne !
""" test1.py Ceci est un exemple d'appel à une routine écrite en langage C. Test la librairie de démo "test1.c" """ import test1 print(test1.mult(7, 8)) print(test1.mult(123456789, 123)) print(test1.mult(111111111, 111111111)) a=11 b=12 print(test1.mult(a, b)) print(test1.mult.__doc__) # pour afficher de l'aide sur la fonction.
/*
test2.c
L'objectif est d'avoir une soubroutine en C
qui peut être accédé depuis le langage Python.
Pour compiler depuis un Terminal :
gcc -shared -o test2.so -fPIC test2.c
Depuis Python, si on veut taper dans la console :
import os
os.getcwd() # indique le répertoire par défaut
os.chdir("/home/bg/Bg2/Python/ctests") # pour changer le répertoire par défaut
import test2
test2.mult(3.1415, 7.0) # retournera le produit 3.1415 * 7
Les arguments doivent être deux nombres à virgule.
Mieux : exécuter le script test2.py qui est donné dans un autre fichier.
Pour les types que Python reconnait et peut convertir en C :
https://www.tutorialspoint.com/python/python_further_extensions.htm
Curiosité :
import sys
sys.getrefcount(test2)
**************************************************************/
#include "Python.h"
static PyObject *test2_mult(PyObject *self, PyObject *args) {
//=============================================================
// Définit la fonction en C qui sera appelée depuis Python
const double vNb1;
const double vNb2;
double vRep;
if (!PyArg_ParseTuple(args, "dd", &vNb1, &vNb2)) return NULL;
vRep = vNb1 * vNb2;
return PyFloat_FromDouble(vRep);
// https://docs.python.org/3.3/c-api/float.html
} // test2_mult
// Définit l'aide associée à la fonction.
#define AIDE "mult prend deux nombres à virgule en \
entrée et retourne leur produit."
static PyMethodDef test2Methods[] = {
//===================================
{"mult", test2_mult, METH_VARARGS,
AIDE}, // Est un texte d'aide. Obtenu avec : print(test2.mult.__doc__)
{NULL, NULL, 0, NULL} // Sentinel
};
static struct PyModuleDef test2module = {
//=======================================
// Est une structure nécessaire pour Python ???
PyModuleDef_HEAD_INIT,
"test2", /* name of module */
NULL, //test2_doc, /* module documentation, may be NULL */
-1, /* size of per-interpreter state of the module,
or -1 if the module keeps state in global variables. */
test2Methods
};
PyMODINIT_FUNC PyInit_test2(void) {
//=================================
// Fonction de création du module
return PyModule_Create(&test2module);
} // PyInit_test2
int main(int argc, char *argv[]) {
//================================
// Fonction principale, qui sera exécutée au chargement du module
wchar_t *program = Py_DecodeLocale(argv[0], NULL);
if (program == NULL) {
fprintf(stderr, "Fatal error: cannot decode argv[0]\n");
exit(1);
}
/* Add a built-in module, before Py_Initialize */
PyImport_AppendInittab("test2", PyInit_test2);
/* Pass argv[0] to the Python interpreter */
Py_SetProgramName(program);
/* Initialize the Python interpreter. Required. */
Py_Initialize();
/* Optionally import the module; alternatively,
import can be deferred until the embedded script
imports it. */
PyImport_ImportModule("test2");
PyMem_RawFree(program);
return 0;
} // main
// Il y a beaucoup de points que je ne comprends pas, mais cela fonctionne !
""" test2.py Ceci est un exemple d'appel à une routine écrite en langage C. Test la librairie de démo "test2.c" """ import test2 print(test2.mult(3.1415, 7.0)) print(test2.mult(3.141593, 113.0)) print(test2.mult(1.111e8, 1.111e9)) a = 9.999 b = 1.111 print(test2.mult(a, b)) print(test2.mult.__doc__) # pour afficher de l'aide sur la fonction.
/*
test3.c
L'objectif est d'avoir une soubroutine en C
qui peut être accédé depuis le langage Python.
Pour compiler depuis un Terminal :
gcc -shared -o test3.so -fPIC test3.c
Depuis Python, si on veut taper dans la console :
import os
os.getcwd() # indique le répertoire par défaut
os.chdir("/home/bg/Bg2/Python/ctests") # pour changer le répertoire par défaut
import test3
test3.sommeInv(700) # retournera la somme des inverses des entiers de 1 à 700
L'argument doit être un nombre entier.
Retourne un nombre à virgule
Mieux : exécuter le script test3.py qui est donné dans un autre fichier.
Pour les types que Python reconnait et peut convertir en C :
https://www.tutorialspoint.com/python/python_further_extensions.htm
***********************************************************************/
#include "Python.h"
static PyObject *test3_sommeInv(PyObject *self, PyObject *args) {
//===============================================================
// Définit la fonction en C qui sera appelée depuis Python
// PyObject *x_obj; // autre possibilité.
// Somme des inverses des nombres entiers de lNbMin à lNbMax-1
// lNbMin et lNbMax sont les deux arguments.
long lNbMax;
long lNbMin;
long lNbr;
double vRep;
if (!PyArg_ParseTuple(args, "ll", &lNbMin, &lNbMax)) return NULL;
// c.f. https://docs.python.org/3.3/c-api/arg.html#PyArg_ParseTuple
//if (!PyArg_ParseTuple(args, "O", &x_obj)) return NULL;
//lNbMax = PyLong_AsLong(x_obj); // c.f. https://docs.python.org/3.3/c-api/long.html
vRep = 0.0;
for (lNbr=lNbMax-1; lNbr>=lNbMin; lNbr--) vRep = vRep + 1.0 / lNbr;
return PyFloat_FromDouble(vRep);
// https://docs.python.org/3.3/c-api/float.html
} // test3_sommeInv
// Définit l'aide associée à la fonction.
#define AIDE "sommeInv prend deux nombres entiers Nmin et Nmax en entrée\n\
et retourne la somme des inverses des entiers de 1/Nmin à 1/(Nmax-1)."
static PyMethodDef test3Methods[] = {
//===================================
{"sommeInv", test3_sommeInv, METH_VARARGS,
AIDE}, // Est un texte d'aide. Obtenu avec : print(test3.sommeInv.__doc__)
{NULL, NULL, 0, NULL} // Sentinel
};
static struct PyModuleDef test3module = {
//=======================================
// Est une structure nécessaire pour Python ???
PyModuleDef_HEAD_INIT,
"test3", /* name of module */
NULL, //test3_doc, /* module documentation, may be NULL */
-1, /* size of per-interpreter state of the module,
or -1 if the module keeps state in global variables. */
test3Methods
};
PyMODINIT_FUNC PyInit_test3(void) {
//=================================
// Fonction de création du module
return PyModule_Create(&test3module);
} // PyInit_test3
int main(int argc, char *argv[]) {
//================================
// Fonction principale, qui sera exécutée au chargement du module
wchar_t *program = Py_DecodeLocale(argv[0], NULL);
if (program == NULL) {
fprintf(stderr, "Fatal error: cannot decode argv[0]\n");
exit(1);
}
/* Add a built-in module, before Py_Initialize */
PyImport_AppendInittab("test3", PyInit_test3);
/* Pass argv[0] to the Python interpreter */
Py_SetProgramName(program);
/* Initialize the Python interpreter. Required. */
Py_Initialize();
/* Optionally import the module; alternatively,
import can be deferred until the embedded script
imports it. */
PyImport_ImportModule("test3");
PyMem_RawFree(program);
return 0;
} // main
"""
test3.py
Ceci est un exemple d'appel à une routine écrite en langage C.
Test la librairie de démo "test3.c"
"""
import test3
print(test3.sommeInv.__doc__) # pour afficher de l'aide sur la fonction.
print()
print(test3.sommeInv(10, 100)) # 1/10 + 1/11 + 1/12 + 1/13 + 1/14 + ... + 1/(N-1)
print(test3.sommeInv(100, 1000)) # 1/100 + 1/101 + 1/102 + 1/103 + ... + 1/(N-1)
print(test3.sommeInv(1000, 10000)) # 1/1000 + 1/1001 + 1/1002 + ... + 1/(N-1)
print(test3.sommeInv(10000, 100000)) # 1/10000 + 1/10001 + 1/10002 + ... + 1/(N-1)
print()
nn=10
while (nn < 100000000):
print(test3.sommeInv(nn, 10*nn))
nn=10*nn
# On remarque que ces sommes donnent presque le même résultat.
# Ceci suggère très fortement que la série harmonique diverge
# et montre également qu'elle diverge comme Ln(N).
# La constante d'Euler-Mascheroni est définie par
# gamme = lim(N -> infini) (somme 1/k - Ln(N)) = 0,577 215 664 901 532 860 6…
# c.f. https://fr.wikipedia.org/wiki/Constante_d%27Euler-Mascheroni
print()
import math
nn=100000000
print("gama = ", test3.sommeInv(1, nn) - math.log(nn))
/*
test4.c
L'objectif est d'avoir une soubroutine en C
qui peut être accédé depuis le langage Python.
Pour compiler depuis un Terminal :
gcc -shared -o test4.so -fPIC test4.c
Depuis Python, exécuter le script test4.py qui est donné dans un autre fichier.
Pour les types que Python reconnait et peut convertir en C :
https://www.tutorialspoint.com/python/python_further_extensions.htm
***********************************************************************/
#include "Python.h"
static PyObject *test4_sommeInv9(PyObject *self, PyObject *args) {
//===============================================================
// Définit la fonction en C qui sera appelée depuis Python
// PyObject *x_obj; // autre possibilité.
// Somme des inverses des nombres entiers de lNbMin à lNbMax-1
// lNbMin et lNbMax sont les deux arguments.
// test4_sommeInv9(1,10) = 2.8178571428571426; // La somme de 1 à 8
// test4_sommeInv9(10,100) = 2.063991622224917; // La somme de 10 à 88
// test4_sommeInv9(100,1000) = 1.818871425200977; // La somme de 1 à 8888
// test4_sommeInv9(1000,10000) = 1.633464212583175; // La somme de 1 à 88888
long lNbMax;
long lNbMin;
long lNbr;
long lDixPow;
double vRep;
if (!PyArg_ParseTuple(args, "ll", &lNbMin, &lNbMax)) return NULL;
//if (!PyArg_ParseTuple(args, "O", &x_obj)) return NULL;
//lNbMax = PyLong_AsLong(x_obj); // c.f. https://docs.python.org/3.3/c-api/long.html
vRep = 0.0;
lNbr=lNbMin;
while (lNbr<lNbMax) {
if (lNbr % 10 == 9) { lNbr ++;
if (lNbr/10 % 10 == 9) { lNbr += 10;
if (lNbr/100 % 10 == 9) { lNbr += 100;
// J'ai laissé quelques "if" pour comprendre la structures des tests.
lDixPow = 1000;
while (lNbr/lDixPow % 10 == 9) {
lNbr += lDixPow;
lDixPow *=10;
}
}
}
}
vRep = vRep + 1.0 / lNbr;
lNbr++;
} // while
return PyFloat_FromDouble(vRep);
// https://docs.python.org/3.3/c-api/float.html
} // test4_sommeInv9
// Définit l'aide associée à la fonction.
#define AIDE "sommeInv9 prend deux nombres entiers Nmin et Nmax en entrée\n\
et retourne la somme des inverses des entiers de 1/Nmin à 1/(Nmax-1)\n\
dans laquelle tous les nombres contenant le chiffre 9\n\
ont été éliminés. Voici des nombres éliminés :\n\
9 ; 19 ; 29 ; 9xxx ; 19xxx ; 29xxx ; 999999.\n\
Nmin ne doit pas contenir de chiffre 9."
static PyMethodDef test4Methods[] = {
//===================================
{"sommeInv9", test4_sommeInv9, METH_VARARGS,
AIDE}, // Est un texte d'aide. Obtenu avec : print(test4.sommeInv9.__doc__)
{NULL, NULL, 0, NULL} // Sentinel
};
static struct PyModuleDef test4module = {
//=======================================
// Est une structure nécessaire pour Python ???
PyModuleDef_HEAD_INIT,
"test4", /* name of module */
NULL, //test4_doc, /* module documentation, may be NULL */
-1, /* size of per-interpreter state of the module,
or -1 if the module keeps state in global variables. */
test4Methods
};
PyMODINIT_FUNC PyInit_test4(void) {
//=================================
// Fonction de création du module
return PyModule_Create(&test4module);
} // PyInit_test4
int main(int argc, char *argv[]) {
//================================
// Fonction principale, qui sera exécutée au chargement du module
wchar_t *program = Py_DecodeLocale(argv[0], NULL);
if (program == NULL) {
fprintf(stderr, "Fatal error: cannot decode argv[0]\n");
exit(1);
}
/* Add a built-in module, before Py_Initialize */
PyImport_AppendInittab("test4", PyInit_test4);
/* Pass argv[0] to the Python interpreter */
Py_SetProgramName(program);
/* Initialize the Python interpreter. Required. */
Py_Initialize();
/* Optionally import the module; alternatively,
import can be deferred until the embedded script
imports it. */
PyImport_ImportModule("test4");
PyMem_RawFree(program);
return 0;
} // main
"""
test4.py
Ceci est un exemple d'appel à une routine écrite en langage C.
Test la librairie de démo "test4.c"
"""
import test4
print(test4.sommeInv9.__doc__) # pour afficher de l'aide sur la fonction.
print()
print(test4.sommeInv9(1, 10)) # 1/1 + 1/2 + 1/3 + 1/4 + ... + 1/8 (1/9 est éliminé)
print(test4.sommeInv9(10, 100)) # 1/10 + 1/11 + 1/12 + 1/13 + 1/14 + ... + 1/88
# Eliminé : 1/19, 1/29, ..., 1/79, 1/89 à 1/99
print(test4.sommeInv9(100, 1000)) # 1/100 + 1/101 + 1/102 + 1/103 + ... + 1/888
print(test4.sommeInv9(1000, 10000)) # 1/1000 + 1/1001 + 1/1002 + ... + 1/8888
print(test4.sommeInv9(10000, 100000)) # 1/10000 + 1/10001 + 1/10002 + ... + 1/88888
print()
nn=10
s2 = test4.sommeInv9(nn, 10*nn)
while (nn < 100000000):
s1 = s2
nn=10*nn
s2 = test4.sommeInv9(nn, 10*nn)
print("Rapport =", s2/s1)
# On remarque que le rapport de ces sommes tend vers 0,9
# Ceci suggère très fortement que cette série converge
# comme 0.9^Log10(N)
# Donc la convergence est très lente.
nn = 10000000
s1 = test4.sommeInv9(1, nn)
s2 = test4.sommeInv9(nn, 10*nn)
# La valeur limite est environ :
# s1 + s2*(1 + 0.9 + 0.9^2 + 0.9^3 + 0.9^4 + ...) = s1 + 10*s2
print("Valeur limite =", s1 + 10*s2)
# On montre par d'autres méthodes que la valeur limite vaut bien :
# 22,92067 66192 64150 34816 ...
Plan du Site :
Home
Python
python_code_c.html
( = http://www.juggling.ch/gisin/python/python_code_c.html )
Page mise à jour le 15 mars 2018 par Bernard Gisin
( Envoyer un e-mail )
Hébergement par : www.infomaniak.ch