Ocaml et conditions imbriquées
Résolu
Utilisateur anonyme
-
Utilisateur anonyme -
Utilisateur anonyme -
Bonjour,
j'ai un problème avec mon code caml :
Caml me dit
vous savez pourquoi ?
j'ai un problème avec mon code caml :
let soustraction t1 t2 = if comp t2 t1 then ( let M = max (vect_length t1) (vect_length t2) in let tt1 = plongt t1 M in let tt2 = plongt t2 M in let t3 = make_vect (M + 1) 0 in for i = 0 to (M - 1) do if (tt1.(i) < tt2.(i)) then ( t3.(i) <- t3.(i) + ((tt1.(i) + 1000) - tt2.(i)); t3.(i+1) <- (-1) ) else ( t3.(i) <- (t3.(i) + (tt1.(i) - tt2.(i))) ) done; ) else ( let t3 = [|(-1)|] ) t3;;
Caml me dit
Entrée interactive: > ) > ^ Erreur de syntaxe.
vous savez pourquoi ?
A voir également:
- Ocaml et conditions imbriquées
- Mise en forme conditionnelle excel plusieurs conditions - Guide
- Je ne suis pas un robot confidentialité - conditions ✓ - Forum Mail
- Comment débloquer "je ne suis pas un robot" ✓ - Forum Windows 8 / 8.1
- Libreoffice calc si plusieurs conditions ✓ - Forum LibreOffice / OpenOffice
- Désactiver un robot captcha - Forum Facebook
3 réponses
Tu ne devrais pas avoir des parenthèses pour encadrer un bloc then mais plutôt des instructions begin et end.
De plus quand tu déclares une variable local elle doit commencer par une minuscule, tu dois toujours avoir un in qui la suit, et surtout tu ne peux pas l'utiliser en dehors du bloc d'instructions où elle a été déclarée.
Enfin tes instructions sur les tableaux ne sont pas valables en OCaml.
Voici un code un peu plus correct, mais pour t'aider complètement il faudrait comprendre ce que tu veux faire et savoir ce que font comp et plongt.
La confiance n'exclut pas le contrôle
De plus quand tu déclares une variable local elle doit commencer par une minuscule, tu dois toujours avoir un in qui la suit, et surtout tu ne peux pas l'utiliser en dehors du bloc d'instructions où elle a été déclarée.
Enfin tes instructions sur les tableaux ne sont pas valables en OCaml.
Voici un code un peu plus correct, mais pour t'aider complètement il faudrait comprendre ce que tu veux faire et savoir ce que font comp et plongt.
val comp : 'a array -> 'a array -> bool = <fun> val plongt : 'a array -> int -> int array = <fun> val max : int -> int -> int = <fun> let soustraction t1 t2 = if comp t2 t1 then begin let m = max (Array.length t1) (Array.length t2) in let tt1 = plongt t1 m and tt2 = plongt t2 m and t3 = Array.make (m+1) 0 in for i=0 to m-1 do if (tt1.(i) < tt2.(i)) then begin t3.(i) <- t3.(i) + ((tt1.(i) + 1000) - tt2.(i)); t3.(i+1) <- (-1); end else t3.(i) <- (t3.(i) + (tt1.(i) - tt2.(i))); done; t3; end else [|-1|];;
La confiance n'exclut pas le contrôle
Merci beaucoup j'ai suivis tes conseil, voilà ce que donne mon code :
Mais j'ai encore un problème avec :
tu as une idée ?
let soustraction t1 t2 = let M = max (vect_length t1) (vect_length t2) in let tt1 = plongt t1 M in let tt2 = plongt t2 M in let t3 = make_vect (M + 1) 0 in if comp t2 t1 then begin for i = 0 to (M - 1) do begin if (tt1.(i) < tt2.(i)) then begin t3.(i) <- t3.(i) + ((tt1.(i) + 1000) - tt2.(i)); t3.(i+1) <- (-1) end else begin t3.(i) <- (t3.(i) + (tt1.(i) - tt2.(i))) end end done; end else begin t3.(0) <- (-1) end
Mais j'ai encore un problème avec :
#Entrée interactive: > t3.(0) <- (-1) > ^^^^^^^^^^^^^^ Cette expression n'est pas une fonction, elle ne peut être appliquée.
tu as une idée ?
Je pensais que tu utilisais Caml Light mais en fait non sinon ce code marcherait.
En OCaml alors, tu dois enlever ce M majuscule qui ne définit pas une variable mais un constructeur, remplacer vect_length par Array.length et make_vect par Array.make.
De plus le bloc begin/end est inutile dans l'instruction for, il est redondant avec le bloc do/done.
Il te reste plus qu'à ajouter ;; à la fin et ce code marche.
Remarque : j'ai utilisé des abstractions pour plongt, comp et max, n'ayant pas leur code.
En OCaml alors, tu dois enlever ce M majuscule qui ne définit pas une variable mais un constructeur, remplacer vect_length par Array.length et make_vect par Array.make.
De plus le bloc begin/end est inutile dans l'instruction for, il est redondant avec le bloc do/done.
Il te reste plus qu'à ajouter ;; à la fin et ce code marche.
Remarque : j'ai utilisé des abstractions pour plongt, comp et max, n'ayant pas leur code.