CONNEXION
  • RetourJeux
    • Tests
    • Soluces
    • Previews
    • Sorties
    • Hit Parade
    • Les + attendus
    • Tous les Jeux
  • RetourActu
    • French Days
    • Culture Geek
    • Astuces
    • Réalité Virtuelle
    • Rétrogaming
    • Toutes les actus
  • French Days
  • RetourHigh-Tech
    • French Days
    • Actus JVTECH
    • Bons plans
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTECH
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch
    • Xbox Series
    • Overwatch 2
    • FUT 23
    • League of Legends
    • Genshin Impact
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • PS4
  • One
  • Switch
  • Wii U
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Etoile Abonnement RSS

Sujet : [Caml] Gerer l'arrêt d'une boucle

News culture
La Planète des Singes : Le Nouveau Royaume - la révolution simienne est en marche !
DébutPage précedente
1
Page suivantePage suivante
Andmoreagain Andmoreagain
MP
Niveau 8
25 avril 2011 à 13:55:58

Bonjour,

dans quelques programmes simples en caml j'aimerais pouvoir arrêter une boucle 'for' dès qu'une condition est atteinte:

Par exemple:

let verifier_permute t =
let s = ref 0 in
for i = 0 to vect_length t - 2 do
if t.(i) > t.(i+1) then s := !s + 1;
done;
if !s = 0 then true else false;;

Je pense que c'est un peu inutile de faire intervenir le compteur s. En fait, il faudrait simplement que la boucle s'arrête dès que la condition est atteinte.
Si elle s'arrête, on renvoie false, sinon on renvoie true.
Mais je ne sais pas comment faire cela.

Merci d'avance :)

godrik godrik
MP
Niveau 22
25 avril 2011 à 18:10:40

Quand j'ai regarder caml rapidement en 2005, les conditions d'arret complexe etait souvent gere par une exception. Les camleux du forum auront certainement un avis plus eclaire que le mien.

stationessence stationessence
MP
Niveau 8
26 avril 2011 à 14:09:39

Je n'ai pas fais beaucoup de Caml mais comme l'a dis Godrik, il faut générer une exception qui permettra en quelque sorte de breaké la boucle. Ca peut paraître très artisanale mais il me semble que c'est uniquement comme cela que l'on procède.

Un extrait d'article expliquant plus en détail avec un exemple qui ressemble très fortement à ton problème. (Lien en bas de page)

La sortie prématurée des boucles

À l'aide du mécanisme d'exception, on implémente facilement la sortie prématurée des boucles for et while (l'équivalent de l'instruction break de C, ou exit du langage Ada). Pour cela, on déclenche l'exception prédéfinie Exit dans le corps de la boucle, et l'on pose un surveillant d'exception à l'extérieur de la boucle.

Par exemple, nous définissons une fonction qui teste si un vecteur donné contient un élément nul: si on rencontre un 0 dans le vecteur, on sort instantanément de la boucle de parcours et l'on rend la valeur vrai, sinon la boucle se déroule jusqu'au bout, et l'on retourne faux.

let contient_un_zéro v =
try
for i = 0 to vect_length v - 1 do
if v.(i) = 0 then raise Exit;
done;
false
with Exit -> true;;

La définition d'exceptions

L'utilisateur définit ses propres exceptions avec la construction exception nom;; pour une exception constante, ou exception nom of typ;; pour une exception avec argument. Ces exceptions sont génératives, c'est-à-dire que deux définitions successives d'une exception de même nom, créent deux exceptions différentes qui ne sont pas confondues par les programmes.

Typage: une exception constante a le type exn, une exception définie par exception nom of typ;; a le type typ -> exn.
Les exceptions prédéfinies

Un certain nombre d'exception sont prédéfinies pour signaler des problèmes ou erreurs courantes:

Failure of string: signale une erreur dans la fonction (ou pour la cause) indiquée.
Not_found: signale qu'une fonction de recherche a échoué (par exemple assoc).
Exit: utilisée pour sortir prématurément des boucles ou des fonctions.
Break: interruption des calculs (généralement par une intervention de l'utilisateur du programme).
Invalid_argument of string: l'argument passé à la fonction indiquée ne peut pas être traité.
Sys_error of string: erreur du système d'exploitation hôte de Caml (cette exception est définie dans le module sys).
Match_failure of string * int * int: signale un échec du filtrage dans le fichier indiqué à l'endroit indiqué.
End_of_file: signale une fin de fichier (cette exception est définie dans le module io).

http://caml.inria.fr/pub/old_caml_site/FAQ/controle_de_base-fra.html#break

Erwin-Cantor Erwin-Cantor
MP
Niveau 5
11 mars 2024 à 22:58:05

up

godrik godrik
MP
Niveau 22
12 mars 2024 à 02:27:41

Et tu up parceque ....

Oberginee Oberginee
MP
Niveau 7
15 mars 2024 à 00:29:29

C’est tellement vieux comme un sujet mais je trouve ça relou d’utiliser une boucle for dans Caml

DébutPage précedente
1
Page suivantePage suivante
Répondre
Prévisu
?
Victime de harcèlement en ligne : comment réagir ?
Infos 0 connecté(s)

Gestion du forum

Modérateurs : godrik, LGV
Contacter les modérateurs - Règles du forum

Sujets à ne pas manquer

La vidéo du moment