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

  1. KX Messages postés 19031 Statut Modérateur 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
  2. 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
    1. KX Messages postés 19031 Statut Modérateur 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
    2. Utilisateur anonyme
       
      merci pour l'aide génial !
      0