Ocaml et conditions imbriquées

Résolu
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

  1. Modérateur
    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
    1. 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
      1. Modérateur
        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
      2. merci pour l'aide génial !
        0