[Caml] pb avec des matrix en caml

pb avec des matrix en caml [Caml] - Divers - Programmation

Marsh Posté le 09-04-2005 à 13:55:26    

Bonjour j'ai un petit problème avec des tableaux en Caml:
voici mon code
 
let t = make_matrix 2 2 (make_matrix 2 2 0);;
t.(0).(0).(0).(0)<-1;;
t;;
 
Voilà j'ai créé un tableau à 4 dimensions et j'ai essayé de modifier un emplacement du tableau
mais voici la réponse du terminal:
 
t : int vect vect vect vect =
 [|[|[|[|0; 0|]; [|0; 0|]|]; [|[|0; 0|]; [|0; 0|]|]|];
   [|[|[|0; 0|]; [|0; 0|]|]; [|[|0; 0|]; [|0; 0|]|]|]|]
#- : unit = ()
#- : int vect vect vect vect =
 [|[|[|[|1; 0|]; [|0; 0|]|]; [|[|1; 0|]; [|0; 0|]|]|];
   [|[|[|1; 0|]; [|0; 0|]|]; [|[|1; 0|]; [|0; 0|]|]|]|]
 
il a modifié 4 éléments au lieu d'un.
J'ai essayé de remédier à ce problème avec des vects et des copy_vect mais rien n'y fait.
si quelqu'un sait d'où ça vient et peut me proposer un code qui fonctionne...

Reply

Marsh Posté le 09-04-2005 à 13:55:26   

Reply

Marsh Posté le 09-04-2005 à 14:22:04    

C'est normal

Citation :


val make_matrix : int -> int -> 'a -> 'a array array
 
Array.make_matrix dimx dimy e returns a two-dimensional array (an array of arrays) with first dimension dimx and second dimension dimy. All the elements of this new matrix are initially physically equal to e. The element (x,y) of a matrix m is accessed with the notation m.(x).(y).

Reply

Marsh Posté le 09-04-2005 à 14:24:22    

C'est passé récement sur fr.comp.lang.caml
 
http://groups.google.fr/groups?hl= [...] &frame=off
 

Reply

Marsh Posté le 10-04-2005 à 10:51:42    

oui dans ce post il y a l'xeplication du problème mais pas la résolution.
Ils disent que tous les sous-tableaux pointent vers la meme zone. En conséquence, si on en modifie un on les modifie tous.
J'ai déjà essayé de remédier à ce problème avec des boucles et tout ce qu'on veut mais ça ne marche pas.
c'est lourd et je ne peux pas passer sur ocaml.
Quelqu'un aurait un code qui fonctionne svp?

Reply

Marsh Posté le 10-04-2005 à 11:45:10    

Code :
  1. let ma_matrix =
  2. let t = Array.create_matrix 2 2 ( [| [| |] |] ) in
  3. for i=0 to 1 do
  4.  for j=0 to 1 do
  5.   t.(i).(j) <- (Array.create_matrix 2 2 0)
  6.  done
  7. done;
  8. t
  9. ;;


 
C'est du Ocaml, vire les "Array.", normalement ça doit marcher (c'est peut-être pas ce qu'il y a de plus élégant, notamment le [| [| |] |]   [:joce] )

Reply

Marsh Posté le 10-04-2005 à 12:02:14    

nan dsl caml light ne connait pas create matrix
j'avais trouvé une manière de faire:
 
let t = make_matrix 2 2 (copy_vect(make_matrix 2 2 0));;
t.(0).(0)<-[| [|1;1|];[|1;1|]|];;
t;;
 
mais ça m'oblige à fixer la taille du tableau "manuellement" alors que je veux qu'elle dépende d'un paramètre que je place au début du prog genre:
 
let taille=2;;
let t = make_matrix taille taille (copy_vect(make_matrix taille taille 0));;
t.(0).(0)<-[| [|1;1|];[|1;1|]|];;
t;;

Reply

Marsh Posté le 10-04-2005 à 12:12:06    

Code :
  1. let taille = 2;;
  2. let ma_matrix =
  3. let t = Array.create_matrix taille taille ( [| |] ) in
  4. for i=0 to taille-1 do
  5.  for j=0 to taille-1 do
  6.   t.(i).(j) <- (Array.create_matrix taille taille 0)
  7.  done
  8. done;
  9. t
  10. ;;


 
Et tu remplaces "Array.create_matrix" par  make_matrix...


Message édité par pascal_ le 10-04-2005 à 12:12:50
Reply

Marsh Posté le 10-04-2005 à 21:05:07    

je comprends pas pourquoi mais ça marche super bien :pt1cable:  
 :sol: merci  :sol:

Reply

Sujets relatifs:

Leave a Replay

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