Problème en Caml

Problème en Caml - Langages fonctionnels - Programmation

Marsh Posté le 06-05-2008 à 01:27:02    

Bonjour,
 
(Bon, tout d'abord, je préviens : je suis un grand amateur en programmation, merci d'être indulgent et de ne pas me découper en rondelles  :pt1cable: ). Voilà, j'essaie de programmer la décomposition en produit de cycles une image selon une transformation donnée bijective (les pixels étant représentés par un enregistrement {X:int, Y:int}, une image étant représentée par une matrice m*n de m*n pixels (les seuls paramètres dont qu'on prend en compte ici sont les paramètres m et n de la matrice, (on transforme les pixels de la matrice en fonction de leur coordonnées uniquement, pas de leur "contenu" ie leur couleur par ex.) ;la transformation, linéaire, sur les points étant donnée par une matrice "transformation" ) Ca donne ça :
 

Code :
  1. type point ={X:int;Y:int} ;;
  2.  
  3. let transformation = make_matrix 2 2 0;;
  4. transformation.(0).(0)<- 1 ;transformation.(1).(0)<-1 ;transformation.(1).(1)<-(-1) ;; (je définis ma matrice de transformation)
  5.  
  6. let transformer point n m t =
  7. match point with
  8. {X=i;Y=j}-> let i’=(t.(0).(0)*i + t.(1).(0)*j) mod m
  9.          and j’=(t.(0).(1)*i + t.(1).(1)*j) mod n in
  10.          {X=i’;Y=j’};;
  11. (fonction qui transforme un point de coordonnées i,j en un point de coordonnées i',j')
  12.  
  13. let produit_cycles image transformation =
  14.   let n = vect_length image and m = vect_length image.(0) in
  15.   let test = (make_vect n (make_vect m false)) and resultat = ref [] in
  16.   for i = 0 to (n-1) do for j=0 to (m-1) do
  17.      if not test.(i).(j) then
  18.        let cycle = ref [{X=j;Y=i}] and pointeur = ref (transformer ({X=j;Y=i}) n m transformation) in
  19.             test.(i).(j) <- true;
  20.             while !pointeur <>{X=j;Y=i}do
  21.                 cycle := !pointeur::!cycle;
  22.                 test.(( !pointeur).Y).((!pointeur).X) <- true ;
  23.                 pointeur := transformer !pointeur n m transformation done ;
  24.            resultat := (!cycle)::!resultat done  done ;
  25.            !resultat;;


Le compilateur accepte mon programme  :)  mais dès que je veux l'appliquer à une matrice, il m'affiche invariablement un " Invalid_argument "vect_item"". Je ne vois pas où une matrice est incorrectement indicée.
Je sais que tout ceci est un peu brouillon et manque de clarté, mais une aide serait la bienvenue.
 
Merci d'avance!


Message édité par gilou le 06-05-2008 à 23:21:07
Reply

Marsh Posté le 06-05-2008 à 01:27:02   

Reply

Marsh Posté le 06-05-2008 à 11:27:45    

Je ne fais pas de Caml donc je doute pouvoir t'aider, mais je recommande 2 choses:

 

1. Déplacer ton post dans la sous-cat "langages fonctionnels" plutôt que dans Divers hop, un modo l'a fait pour toi
2. Utiliser la balise [ code=ocaml] (et fermer avec [/code ]) (sans les espaces naturellement) pour avoir de la coloration des sources, ça rendra la chose beaucoup plus lisibles pour les gens lisant ton post: bon ben c'est fait aussi [:pingouino]

 
Code :
  1. let rec ninetyNineBottlesOfBeer  = function
  2.     0 -> print_string "no more bottles of beer\n"
  3.   | 1 -> print_string "1 bottle of beer on the wall. Take it down, pass it around\n" ; ninetyNineBottlesOfBeer 0
  4.   | n -> print_int n ; print_string " bottles of beer on the wall. Take one down, pass it around\n" ; ninetyNineBottlesOfBeer (n - 1)
  5.  in  ninetyNineBottlesOfBeer 99 ;
  6.  
  7. (* ocamlopt -o ninetyNineBottlesOfBeer nintyNineBottlesOfBeer.ml *)


Message édité par masklinn le 07-05-2008 à 09:31:21

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 06-05-2008 à 11:28:45    

Sujet déplacé.

Reply

Marsh Posté le 06-05-2008 à 23:21:36    

Et j'ai ajouté les balises.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 07-11-2008 à 18:59:38    

Première chose :
la ligne  

Code :
  1. (make_vect n (make_vect m false))


 
va te poser problème. En effet la commande make_vect rend un vectuer dont les éléments sont physiquement égaux à son deuxième argument (dans le sens ==). C'est à dire qu'à chaque fois que tu vas modifier l'élément d'indice j dans la ligne d'indice i, les éléments d'indice j de chaque lignes vont être modifiés en conséquence. Il faut utiliser comme tu l'as fait plus haut "make_matrix".
 
Je n'ai pas identifié ton problème, mais je vais te poser une question quand même : As-tu essayer de retracer à la main les premières étapes de calculs de ton programme ? Tu utilises la boucle interactive pour essayer de voir où est le problème. Sinon tu peux essayer de mettre en commentaire judicieusement certaines parties de ton programme pour essayer toujours d'isoler l'erreur.
 
A+

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed