Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide Recherche
1634 connectés 

  FORUM HardWare.fr
  Programmation
  Langages fonctionnels

  Problème en Caml

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problème en Caml

n°1728858
Fuhlbar
Posté le 06-05-2008 à 01:27:02  profilanswer
 

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
mood
Publicité
Posté le 06-05-2008 à 01:27:02  profilanswer
 

n°1728935
Masklinn
í dag viðrar vel til loftárása
Posté le 06-05-2008 à 11:27:45  profilanswer
 

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

---------------
Being constantly subjected to something makes you somewhat immune to it, like Brits and misery. -- Craspology
n°1728936
Elmoricq
Modérateur
Posté le 06-05-2008 à 11:28:45  profilanswer
 

Sujet déplacé.


---------------
Blacker than a moonless night, hotter and more bitter than hell itself... That is coffee.
n°1729273
gilou
Modérateur
It's the only NEET thing to do
Posté le 06-05-2008 à 23:21:36  profilanswer
 

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


---------------
I think you guys should really consider virtualizing the whole process and moving it to the cloud.
n°1809644
moma
Posté le 07-11-2008 à 18:59:38  profilanswer
 

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+


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Langages fonctionnels

  Problème en Caml

 

Sujets relatifs
[PIC] Problème de mise en place I²CVC++ : Problème de scrolling sur un CEdit
Problème très étrange qui pourra me donner la réponse ?Problème avec des JLayeredPane
PLEASE HELP!!! Probleme avec un loadmovie Caml , problème avec le carré
[Caml] Problème à n corps[Caml] Conception de ptit jeux --> probleme!
[Caml] Probleme resolution fonctionproblème en camL
Plus de sujets relatifs à : Problème en Caml


Hit-Parade
Copyright © 1997-2012 Hardware.fr SARL / Groupe LDLC / LesNumeriques.com / Version anglaise du site: BeHardware