Ocaml et conditions imbriquées

Résolu
Utilisateur anonyme -  
 Utilisateur anonyme -
Bonjour,


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 ?



3 réponses

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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.

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
3
Utilisateur anonyme
 
up
0
Utilisateur anonyme
 
Merci beaucoup j'ai suivis tes conseil, voilà ce que donne mon code :



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 ?
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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.
0
Utilisateur anonyme
 
merci pour l'aide génial !
0