Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 6 sur 6
  1. #1
    Invité de passage
    Maths Spé : MP
    Inscrit en
    août 2012
    Messages
    36
    Détails du profil
    Informations professionnelles :
    Activité : Maths Spé : MP

    Informations forums :
    Inscription : août 2012
    Messages : 36
    Points : 2
    Points
    2

    Par défaut Booléen pris pour un unit

    Bonjour,

    dans le cadre d'une fonction déterminant par dichotomie la présence ou non d'un élément dans un tableau trié que voici :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    let rec dicho x tab =
    
    	if vect_length tab = 1
    	&& tab.(0) <> x
    	 then false
    	 else 	 
    
    	let i = if (vect_length tab) mod 2 = 1
    		 then (vect_length tab +1) /2 -1
    		 else (vect_length tab) /2 -1
    	in
    
    	if tab.(i) > x
    	 then dicho x ( sub_vect tab 0 (i-1) )
    	 else if tab.(i) < x 
    	       then dicho x ( sub_vect tab (i+1) (vect_length tab -1) )
    	       else if tab.(i) = x 
    		     then true
    				
    ;;
    Caml me reproche l'erreur suivante :
    Code :
    1
    2
    3
    4
    5
    6
    Entrée interactive:
    >	............if tab.(i) = x 
    >		     then true
    Cette expression est de type unit,
    mais est utilisée avec le type bool.
    #
    J'avoue que j'ai du mal à voir ce qui cloche, merci de m'éclairer !

  2. #2
    Rédacteur
    Avatar de SpiceGuid
    Homme Profil pro Damien Guichard
    Inscrit en
    juin 2007
    Messages
    1 574
    Détails du profil
    Informations personnelles :
    Nom : Homme Damien Guichard
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : juin 2007
    Messages : 1 574
    Points : 2 449
    Points
    2 449

    Par défaut

    Dans une expression if cond then value, value doit être de type unit. Car dans ce cas, il n'y a pas de else, c'est plus une "instruction" qu'une expression.

    Ton code est facile à corriger :
    Code :
    1
    2
    3
    4
    5
    6
    if tab.(i) > x
    then dicho x ( sub_vect tab 0 (i-1) )
    else if tab.(i) < x 
    then dicho x ( sub_vect tab (i+1) (vect_length tab -1) )
    else (* tab.(i) = x *) true
    Note: plutôt que de découper ton tableau en sous-tableau il serait plus efficace de faire varier deux indices, une borne inférieure et une borne supérieure.
    Du même auteur: le cours OCaml, le dernier article publié, le blog dvp et le jeu vidéo.
    Avant de poser une question je lis les règles du forum.

  3. #3
    Invité de passage
    Maths Spé : MP
    Inscrit en
    août 2012
    Messages
    36
    Détails du profil
    Informations professionnelles :
    Activité : Maths Spé : MP

    Informations forums :
    Inscription : août 2012
    Messages : 36
    Points : 2
    Points
    2

    Par défaut

    Très bien merci, je vais essayer en faisant varier 2 indices plutôt qu'en extrayant des sous tableaux

    ( Tant que j'y suis, comment afficher la valeur d'une variable plutôt que son nom dans une chaîne de caractère ? Par exemple j'ai une variable x qui a une certaine valeur, disons 3, et je voudrais que lorsque ma fonction me rend " x trouvé à la position... " elle me rende " 3 trouvé à la position... " . Est-ce faisable ? )

  4. #4
    Membre émérite
    Avatar de Cacophrene
    Profil pro Phrene Caco
    Inscrit en
    janvier 2009
    Messages
    532
    Détails du profil
    Informations personnelles :
    Nom : Phrene Caco

    Informations forums :
    Inscription : janvier 2009
    Messages : 532
    Points : 951
    Points
    951

    Par défaut

    Bonjour,

    ( Tant que j'y suis, comment afficher la valeur d'une variable plutôt que son nom dans une chaîne de caractère ? Par exemple j'ai une variable x qui a une certaine valeur, disons 3, et je voudrais que lorsque ma fonction me rend " x trouvé à la position... " elle me rende " 3 trouvé à la position... " . Est-ce faisable ? )
    Oui, c'est faisable et la solution la plus souple pour afficher des valeurs de types différent fait appel au module Printf (documentation ici). Ici en l'occurrence tu as besoin de la fonction sprintf (le s en rouge est important) :

    Code :
    1
    2
    3
    let affiche_entier x (pos_x, pos_y) = 
      Printf.sprintf "%d trouvé à la position (%d, %d).\n" x pos_x pos_y
    Une remarque en passant : comme les fonctions du module Printf ont des noms très particuliers, il est recommandé d'utiliser open Printf pour alléger l'écriture (alors que, de façon générale, abuser de open n'est pas une bonne chose car ça peut conduire à des comportements inattendus).

    Cordialement,
    Cacophrène

  5. #5
    Rédacteur
    Avatar de SpiceGuid
    Homme Profil pro Damien Guichard
    Inscrit en
    juin 2007
    Messages
    1 574
    Détails du profil
    Informations personnelles :
    Nom : Homme Damien Guichard
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : juin 2007
    Messages : 1 574
    Points : 2 449
    Points
    2 449

    Par défaut

    À mon avis il voulait demander "Est-ce faisable en Caml-Light ?".
    Le problème c'est que plus personne ne s'en souvient

    Read The F****** Manual
    Du même auteur: le cours OCaml, le dernier article publié, le blog dvp et le jeu vidéo.
    Avant de poser une question je lis les règles du forum.

  6. #6
    Membre émérite
    Avatar de Cacophrene
    Profil pro Phrene Caco
    Inscrit en
    janvier 2009
    Messages
    532
    Détails du profil
    Informations personnelles :
    Nom : Phrene Caco

    Informations forums :
    Inscription : janvier 2009
    Messages : 532
    Points : 951
    Points
    951

    Par défaut

    Re,

    À mon avis il voulait demander "Est-ce faisable en Caml-Light ?"
    Oups... oui en effet c'est très probable. Bon, je passe mon tour alors.

    Cordialement,
    Cacophrène

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •