Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 10 sur 10
  1. #1
    Invité de passage
    Inscrit en
    juin 2012
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : juin 2012
    Messages : 6
    Points : 0
    Points
    0

    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
    Fichiers attachés Fichiers attachés

  2. #2
    Membre Expert
    Inscrit en
    avril 2007
    Messages
    831
    Détails du profil
    Informations forums :
    Inscription : avril 2007
    Messages : 831
    Points : 1 130
    Points
    1 130

    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
    Invité de passage
    Inscrit en
    juin 2012
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : juin 2012
    Messages : 6
    Points : 0
    Points
    0

    Par défaut

    merci ! je vais essayer avec ça

    Après correction j'obtiens ceci :
    Code :
    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 :
    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 Expert
    Inscrit en
    avril 2007
    Messages
    831
    Détails du profil
    Informations forums :
    Inscription : avril 2007
    Messages : 831
    Points : 1 130
    Points
    1 130

    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
    Invité de passage
    Inscrit en
    juin 2012
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : juin 2012
    Messages : 6
    Points : 0
    Points
    0

    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 :
    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
    Invité de passage
    Inscrit en
    juin 2012
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : juin 2012
    Messages : 6
    Points : 0
    Points
    0

    Par défaut

    Merci ! J'obtiens enfin une signature !
    Je regarde si ça fonctionne.

    Edit:

    Code :
    Exception: Invalid_argument "index out of bounds".
    Malheureusement, cela ne fonctionne toujours pas.
    Je vais vérifier les bornes des boucles.

  7. #7
    Invité de passage
    Inscrit en
    juin 2012
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : juin 2012
    Messages : 6
    Points : 0
    Points
    0

    Par défaut

    Avec ce code j'obtiens la réponse attendue, merci pour ton aide !
    Code :
    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 Expert
    Inscrit en
    avril 2007
    Messages
    831
    Détails du profil
    Informations forums :
    Inscription : avril 2007
    Messages : 831
    Points : 1 130
    Points
    1 130

    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 Expert Avatar de prgasp77
    Homme Profil pro Yankel Scialom
    Ingénieur en systèmes embarqués
    Inscrit en
    juin 2004
    Messages
    1 083
    Détails du profil
    Informations personnelles :
    Nom : Homme Yankel Scialom
    Âge : 27
    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 083
    Points : 1 451
    Points
    1 451

    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,

  10. #10
    Invité de passage
    Inscrit en
    juin 2012
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : juin 2012
    Messages : 6
    Points : 0
    Points
    0

    Par défaut

    Merci pour le tuyau.

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
  •