Quelle ne fut pas ma surprise quand je me suis rendu compte que je n'était pas capable d'expliquer quelles étaient les conditions pour qu'une fonction soit réentrante !
Un petit tour sur wikipedia pour se remettre les idées en place :
http://fr.wikipedia.org/wiki/R%C3%A9entranceLa page en anglais est plus détaillée, et contient un exemple intéressant :
http://en.wikipedia.org/wiki/Reentrancy ... 9#ExamplesDans les liens, il y a cette page d'IBM qui est pas mal faite:
http://publib.boulder.ibm.com/infocenter/aix/v6r1/index.jsp?topic=/com.ibm.aix.genprogc/doc/genprogc/writing_reentrant_thread_safe_code.htm wrote:
Reentrance
A reentrant function does not hold static data over successive calls, nor does it return a pointer to static data. All data is provided by the caller of the function. A reentrant function must not call non-reentrant functions.
A non-reentrant function can often, but not always, be identified by its external interface and its usage. For example, the strtok subroutine is not reentrant, because it holds the string to be broken into tokens. The ctime subroutine is also not reentrant; it returns a pointer to static data that is overwritten by each call.
La fonction "strtok" est l'exemple que j'avais en tête. Vu qu'elle garde en interne le restant de la chaîne que l'on veux découper, il n'est pas possible de l'utiliser à plusieurs endroit d'un même programme, et même pire que ça : dans la même fonction mais pour deux chaînes de caractères en même temps (retire un élément de str1 puis un de str2 et on recommence avec str1).
J'imagine que votre fonction de trigo devait utiliser une variable globale ou statique pour des appels récursifs, ce qui fait que si on l'utilise d'un autre endroit, on écrase ces globales/statiques avec le nouveau calcul, et à notre retour on continue de fonctionner sur ces nouvelles données, et pas sur les originales ?
Le lien avec la notion de "thread-safe" est intéressante aussi, lorsque l'on est sur une cible avec un OS.
<warning="troll inside">
En bref : les globales, c'est le mal ! C'est comme les Goto...
</warning>