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.