Tableau [Caml] - Divers - Programmation
Marsh Posté le 22-10-2006 à 20:29:18
Wouah... c'est un post sans réponse qui date d'il y a longtemps... 
 
Je vais y répondre quand même : 
 
Tu as créé un tableau de tableaux, ce qui est courant... 
 
Cependant, le tableau "dedans" (celui qui représente les "lignes" ) n'est créé qu'une seule fois ! 
 
Donc quand tu fais l'effet de bord (l'affectation), tu modifies une seule case d'un seul tableau, mais qui est pointé par chaque ligne... 
 
Bon, alors en pratique, ça donne : 
 
 
let a = Array.create_matrix 12 12 2;; 
a.(5).(5) <- 0;;  
a;;  
 
[|[|2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2|]; 
  [|2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2|]; 
  [|2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2|]; 
  [|2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2|]; 
  [|2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2|]; 
  [|2; 2; 2; 2; 2; 0; 2; 2; 2; 2; 2; 2|]; 
  [|2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2|]; 
  [|2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2|]; 
  [|2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2|]; 
  [|2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2|]; 
  [|2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2|]; 
  [|2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2|]|] 
 
Ou bien : 
 
let a = Array.map (fun _ -> Array.create 12 2) (Array.create 12 [||]) ;; 
a.(5).(5) <- 0;;  
a;; 
 
[|[|2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2|]; 
  [|2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2|]; 
  [|2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2|]; 
  [|2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2|]; 
  [|2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2|]; 
  [|2; 2; 2; 2; 2; 0; 2; 2; 2; 2; 2; 2|]; 
  [|2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2|]; 
  [|2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2|]; 
  [|2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2|]; 
  [|2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2|]; 
  [|2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2|]; 
  [|2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2; 2|]|] 
 
 
 
Ca aurait eu exactement le même comportement en C ou dans un autre langage impératif (j'exclus les langages sans effet de bords, comme Haskell parce que je ne sais pas comment on fait dans ces cas-là)
Marsh Posté le 21-05-2006 à 16:26:53
Salut
J'ai un petit problème sur mon programme en Caml.
Je n'arrive pas à créer de tableaux de longueur paramétrable.
Exemple :
let a = (Array.create 12 (Array.create 12 2));;
a.(5).(5) <- 0;;
a;;
- : int array array =
[|[|2; 2; 2; 2; 2; 0; 2; 2; 2; 2; 2; 2|];
[|2; 2; 2; 2; 2; 0; 2; 2; 2; 2; 2; 2|];
[|2; 2; 2; 2; 2; 0; 2; 2; 2; 2; 2; 2|];
[|2; 2; 2; 2; 2; 0; 2; 2; 2; 2; 2; 2|];
[|2; 2; 2; 2; 2; 0; 2; 2; 2; 2; 2; 2|];
[|2; 2; 2; 2; 2; 0; 2; 2; 2; 2; 2; 2|];
[|2; 2; 2; 2; 2; 0; 2; 2; 2; 2; 2; 2|];
[|2; 2; 2; 2; 2; 0; 2; 2; 2; 2; 2; 2|];
[|2; 2; 2; 2; 2; 0; 2; 2; 2; 2; 2; 2|];
[|2; 2; 2; 2; 2; 0; 2; 2; 2; 2; 2; 2|];
[|2; 2; 2; 2; 2; 0; 2; 2; 2; 2; 2; 2|];
[|2; 2; 2; 2; 2; 0; 2; 2; 2; 2; 2; 2|]|]
Voila mon problème, toute la cinquième colonne est rempli de 0 alors que je voudrai juste la cinquième case de la cinquième colonne.
Si quelqu'un avait une solution.
Merci