[Caml]Tableau

Tableau [Caml] - Divers - Programmation

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

Reply

Marsh Posté le 21-05-2006 à 16:26:53   

Reply

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à)


Message édité par pwang le 22-10-2006 à 20:29:52

---------------
étudiant en master de recherche en informatique - algorithmique et programmation - langages : ocaml, etc.
Reply

Sujets relatifs:

Leave a Replay

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