IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Caml Discussion :

Au secours, recherche de caractères


Sujet :

Caml

  1. #1
    Candidat au Club
    Inscrit en
    Juin 2012
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Au secours, recherche de caractères
    Bonjour tout le monde, il se trouve que je rencontre un petit problème dans l'écriture d'un algorithme caml.

    J'essaye de traduire en langage caml l'algorithme explicité en page 2 de la pièce jointe. En fait, je dois parvenir à repérer l'apparition d'une chaîne de caractères dans un texte. On compare la première lettre du mot M aux lettres composant le texte T. Si les deux lettre correspondent, on compare la deuxieme lettre de M a la lettre suivante dans T.

    Donc j'ai écrit cet algorithme :

    # let matchnaif m t =
    let lm = String.length m in
    let lt = String.length t in
    for i = 1 to (lt-lm+1) do let k=ref 1 in
    while m.(k) = t.(k+i-1) do
    if k=lm then i
    else k:=!k+1 ;end ; end;;

    Je n'arrive pas à le faire fonctionner, j'ai tout essayé. J'imagine que le problème se trouve dans les trois end finaux, mais je ne trouve pas la solution.
    Est-ce-que quelqu'un aurait une idée ?
    Cordialement
    Images attachées Images attachées

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    Par défaut
    L'accès dans une chaîne c'est t.[i] et pas t.(i), et pour les boucles c'est do ... done et pas do .. end.

  3. #3
    Candidat au Club
    Inscrit en
    Juin 2012
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    merci ! je vais essayer avec ça

    Après correction j'obtiens ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # let matchnaif m t =
         let lm = String.length m in
         let lt = String.length t in
         let k = ref 1 in
      	for i =1 to (lt-lm+1) do
      	   k:=1;
      	   while m.[k]=t.[k+i-1] do
      		if k=lm then print_int(i)
      		else k:=!k+1
    done; done;;
    Et je reçois ce message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Characters 163-164:
        	   while m.[k]=t.[k+i-1] do
                     ^
    Error: This expression has type int ref
           but an expression was expected of type int

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    Par défaut
    dans "m.[k]", l'expression "k" a le type "int ref" mais on attend quelque chose de type "int".

    Tu devrais utiliser les balises de code (le dièse dans les boutons du formulaire) pour que tes messages soient plus lisibles.

  5. #5
    Candidat au Club
    Inscrit en
    Juin 2012
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Existe-t-il une fonction pour que le type d'une référence devienne int ? Comme int_of_ref ?

    Edit: J'ai compris, il manque des !


    Edit2:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # let matchnaif m t =
         let lm = String.length m in
         let lt = String.length t in
         let k = ref 1 in
      	for i =1 to (lt-lm+1) do
      	   k:=1;
      	   while m.[!k]=t.[!k+i-1] do
      		if !k=lm then print_int(i)
      		else k:=!k+1
      done; done;;

  6. #6
    Candidat au Club
    Inscrit en
    Juin 2012
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Merci ! J'obtiens enfin une signature !
    Je regarde si ça fonctionne.

    Edit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Exception: Invalid_argument "index out of bounds".
    Malheureusement, cela ne fonctionne toujours pas.
    Je vais vérifier les bornes des boucles.

  7. #7
    Candidat au Club
    Inscrit en
    Juin 2012
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Avec ce code j'obtiens la réponse attendue, merci pour ton aide !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # let matchnaif m t =
         let lm = String.length m in
         let lt = String.length t in
         let k = ref 0 in
      	for i =1 to (lt-lm) do
      	   k:=0;
      	   while m.[!k]=t.[!k+i-1] do
      		if !k=(lm-1) then print_int(i)
      		else k:=!k+1
      done; done; print_int(0);;
    val matchnaif : string -> string -> unit = <fun>
    Dernière question,si tu as le temps de me répondre : l'algorithme me renvoie le chiffre attendu lors du test, mais il l'envoie en continu sans s'arrêter, et je me retrouve avec plusieurs écrans remplis de 4. Saurais-tu où se situe le problème ?

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    832
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 832
    Points : 1 104
    Points
    1 104
    Par défaut
    Ta boucle while centrale ne met pas `k` à jour dans la branche "then", ce qui donne une boucle infinie (tu peux exécuter le programme dans ta tête pour comprendre ce qui se passe).

  9. #9
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Bonjour à vous deux,

    je me permets d'intervenir pour donner un petit conseil à l'OP : quand c'est possible, subdivise ton problème en plusieurs sous-problèmes. Quand ça ne marche pas, il est possible de localiser le dysfonctionnement et de diviser sensiblement la taille du code à débugger.

    Ici, il est possible d'écrire au préalable la fonction
    substring_equal: a:string -> offset_a:int -> b:string -> offset_b:int -> size:int -> bool qui se contente d'appliquer ton algorithme sur des strings de même taille. substring_equal retourne true si et seulement si les size caractères de a à l'indice offset_a égalent les size caractères de b à l'indice offset_b.

    Une fois un tel outil développé et testé, rien de plus simple que de l'utiliser pour chercher un mot dans une longue chaine de caractères

    Cdlt,
    -- Yankel Scialom

  10. #10
    Candidat au Club
    Inscrit en
    Juin 2012
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Merci pour le tuyau.

Discussions similaires

  1. Recherche de caractère
    Par reggae dans le forum C++
    Réponses: 5
    Dernier message: 03/01/2006, 12h35
  2. Recherche de caractères spéciaux
    Par sberube dans le forum Langage
    Réponses: 1
    Dernier message: 18/11/2005, 20h41
  3. [FPDF] Recherche chaine caractères dans fichier pdf
    Par licorne dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 28/10/2005, 11h55
  4. recherche de caractères non_lettres dans chaine
    Par niconoe dans le forum Requêtes
    Réponses: 4
    Dernier message: 12/09/2005, 08h54
  5. []recherche chaine caractère partielle
    Par cd090580 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 11/09/2005, 14h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo