Précédent   Forum du club des développeurs et IT Pro > Autres langages > Langages fonctionnels > Caml
Caml Forum d'entraide sur la programmation avec les langages fonctionnels Caml-Light et OCaml
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 27/08/2012, 15h55   #1
Wenneguen
Invité de passage
 
Maths Spé : MP
Inscription : août 2012
Messages : 11
Détails du profil
Informations professionnelles :
Activité : Maths Spé : MP

Informations forums :
Inscription : août 2012
Messages : 11
Points : 0
Points : 0
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 !
Wenneguen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2012, 16h38   #2
SpiceGuid
Rédacteur
 
Avatar de SpiceGuid
 
Homme Damien Guichard
Inscription : juin 2007
Messages : 1 512
Détails du profil
Informations personnelles :
Nom : Homme Damien Guichard
Localisation : France, Loire (Rhône Alpes)

Informations forums :
Inscription : juin 2007
Messages : 1 512
Points : 2 495
Points : 2 495
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 projet, le blog dvp et le jeu vidéo.
Avant de poser une question je lis les règles du forum.
SpiceGuid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2012, 17h32   #3
Wenneguen
Invité de passage
 
Maths Spé : MP
Inscription : août 2012
Messages : 11
Détails du profil
Informations professionnelles :
Activité : Maths Spé : MP

Informations forums :
Inscription : août 2012
Messages : 11
Points : 0
Points : 0
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 ? )
Wenneguen est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2012, 17h41   #4
Cacophrene
Membre émérite
 
Avatar de Cacophrene
 
Phrene Caco
Inscription : janvier 2009
Messages : 525
Détails du profil
Informations personnelles :
Nom : Phrene Caco

Informations forums :
Inscription : janvier 2009
Messages : 525
Points : 943
Points : 943
Bonjour,

Citation:
( 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
Cacophrene est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2012, 18h28   #5
SpiceGuid
Rédacteur
 
Avatar de SpiceGuid
 
Homme Damien Guichard
Inscription : juin 2007
Messages : 1 512
Détails du profil
Informations personnelles :
Nom : Homme Damien Guichard
Localisation : France, Loire (Rhône Alpes)

Informations forums :
Inscription : juin 2007
Messages : 1 512
Points : 2 495
Points : 2 495
À 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 projet, le blog dvp et le jeu vidéo.
Avant de poser une question je lis les règles du forum.
SpiceGuid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2012, 19h29   #6
Cacophrene
Membre émérite
 
Avatar de Cacophrene
 
Phrene Caco
Inscription : janvier 2009
Messages : 525
Détails du profil
Informations personnelles :
Nom : Phrene Caco

Informations forums :
Inscription : janvier 2009
Messages : 525
Points : 943
Points : 943
Re,

Citation:
À 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
Cacophrene est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 07h44.


 
 
 
 
Partenaires

Hébergement Web