Je viens de réaliser qu'il y a un bug dans le code de mon module sur les tableaux persistants : les codes des fonctions to_array et of_array permettent de manipuler la mémoire partagée en dehors des fonctions fournies par le module, et donc de casser l'invariant. :-/
Au passage ça me permet d'illustrer ce qui se passe sur cette mémoire partagée.
letshared=[|0;1;2;3|];;lettab=PA.of_arrayshared;;valtab:intPA.t=<abstr>lettab'=PA.settab04;;valtab':intPA.t=<abstr>(* maintenant la zone partagée contient le tableau tab' *)shared;;-:intarray=[|4;1;2;3|](* dès qu'on opère sur tab, c'est lui qui se retrouve dans shared *)PA.gettab0;;-:int=0shared;;-:intarray=[|0;1;2;3|](* par contre si on modifie shared, cela modifie les tableaux sensés être immuables *)Array.setshared16;;-:unit=()PA.to_arraytab;;-:intarray=[|0;6;2;3|]PA.to_arraytab';;-:intarray=[|4;6;2;3|]
La solution consiste à effectuer une copie des tableaux mutables pour conserver « l'encapsulation » et maintenir l'invariant.
letto_arraypa=Array.copy(rerootpa)letof_arraya=ref(Arr(Array.copya))letshared=[|0;1;2;3|];;valshared:intarray=[|0;1;2;3|]lettab=PA.of_arrayshared;;valtab:intPA.t=<abstr>(* si on modifie shared, le tableau tab reste bien inchangé *)Array.setshared05;;-:unit=()PA.to_arraytab;;-:intarray=[|0;1;2;3|]
Au passage, cet exemple m'aura permis de montrer que l'on peut également faire de la gestion de mémoire bas niveau en OCaml : pointeur en lecture, pointeur en lecture-écriture, pointeur sur pointeur... bien que la libération de la mémoire soit automatisée et déléguée au runtime et au GC.
Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.
[^] # Re: Donc pour résumer...
Posté par kantien . En réponse à la dépêche C++17, Genèse d’une version mineure. Évalué à 3. Dernière modification le 09 octobre 2016 à 22:01.
Je viens de réaliser qu'il y a un bug dans le code de mon module sur les tableaux persistants : les codes des fonctions
to_arrayetof_arraypermettent de manipuler la mémoire partagée en dehors des fonctions fournies par le module, et donc de casser l'invariant. :-/Au passage ça me permet d'illustrer ce qui se passe sur cette mémoire partagée.
La solution consiste à effectuer une copie des tableaux mutables pour conserver « l'encapsulation » et maintenir l'invariant.
Au passage, cet exemple m'aura permis de montrer que l'on peut également faire de la gestion de mémoire bas niveau en OCaml : pointeur en lecture, pointeur en lecture-écriture, pointeur sur pointeur... bien que la libération de la mémoire soit automatisée et déléguée au runtime et au GC.
Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.