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

Langage Delphi Discussion :

Erreur sur fonction d'extraction des mots


Sujet :

Langage Delphi

  1. #1
    Expert éminent sénior

    Avatar de Siguillaume
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2007
    Messages
    6 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Août 2007
    Messages : 6 180
    Points : 25 358
    Points
    25 358
    Par défaut Erreur sur fonction d'extraction des mots
    Bonjour à tous. Je veux mettre en place une fonction qui me permettrait d'obtenir un nombre donné de mots dans une chaîne de caractères chaine. Dans chaine, les mots à ressortir sont séparés du caractère sep.
    Voici la structure de la fonction:extraireMots(chaine : string; sep :Char='#';nmots:integer=1):TStrings;
    nmots, désigne le nombre de mots:
    Par exemple, si je fais:
    extraireMots('Bonjour#tues#heureux','#',3), j'obtienne les mots: Bonjour, tues et heureux.

    Et si je fais:
    extraireMots('Bonjour#tues#heureux','#',2), j'obtienne les deux mots: Bonjour et tues#heureux..

    Voici le code que j'ai écrit, en m'inspirant de ce qui est sur la FAQ:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    function extraireMots(chaine : string; sep :Char='#';nmots:integer=1):TStrings;
    var
      i, n,nbremots : integer; 
      currentWord : string;
      into:TStrings; 
    begin
      into.Clear;
      n := length(chaine);
      i := 1;
      nbremots:=0;
     
      while ((i <= n) and (nbremots<nmots)) do 
      begin 
        currentWord := ''; 
        { on saute les séparateurs  }
        while (i <= n) and (chaine[i] = sep) do
          inc(i);
        { récupération du mot courant  }
        while (i <= n) and not (chaine[i] = sep) do
        begin
          currentWord := currentWord + chaine[i];
          inc(i); 
        end; 
        if (currentWord <> '') then
          begin
           into.Add(currentWord);
           nbremots:=nbremots+1;
          end;  
      end;
      if nbremots=nmots then  //On va recuperer le reste de la chaine pour former le dernier mot
       begin
        currentWord:='';
        while (i<=n) do
         begin
          currentWord:=currentWord+chaine[i];
          inc(i);
         end;
        into.Add(currentWord);
       end;
       Result:=into;
    end;
    Pour la compilation, pas de problème. MAis dans l'execution, il me donne l'erreur: .... 'Access Violation at 004B...'.
    Et il pointe sur into.clear. Quand je mets celui-ci en commentaire, c'est toujours la même erreur sur cette fois-ci: into.Add(currentWOrd).

    Je sais pas vraiment ce qui ne va pas.
    Merci à tous de votre aide!

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    et bien c'est assez simple en fait, tu n'instancies pas ton objet into donc à chaque fois que tu veux y faire référence tu obtiendras une violation d'accès.

    Il te faut donc instancier ton objet mais là je te vois déjà revenir avec une autre erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    into := TStrings.Create;
    Impossible car TStrings est une classe abstraite. Effectivement TStrings est une classe abstraite il faut utiliser un de ses descendants, le plus généralement TStringList :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    into := TStringList.Create;
    Enfin si into ne sert que de variable temporaire pour être renvoyée ensuite via Result, autant utiliser Result directement. Ne pas oublier de détruire la liste après utilisation par la méthode appelant ta fonction.

  3. #3
    Expert éminent sénior

    Avatar de Siguillaume
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2007
    Messages
    6 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Août 2007
    Messages : 6 180
    Points : 25 358
    Points
    25 358
    Par défaut
    Merci, et tout semble bien fonctionner.
    Une autre préoccupation est:
    Citation Envoyé par Aka Guymelef Voir le message
    Ne pas oublier de détruire la liste après utilisation par la méthode appelant ta fonction.
    C'est-à-dire?
    Si j'appele ma fonction dans une procedure, je fais into.destroy?, ce qui me semble incorrect. Ou je le fais dans la fonction?

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 727
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 727
    Points : 25 630
    Points
    25 630
    Par défaut
    Il est vrai que faire cette fonction c'est très interessant, mais si tu veux, j'ai fait un explode, a vu de nez, elle devrait être 100 fois plus rapide

    Surtout pas Destroy mais Free !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    with extraireMots('Bonjour#tues#heureux','#',3) do
    try
      ... traiter liste
    finally
      Free();
    end;
    Il vaut mieux passer la liste en paramètre déjà créé que faire un retour de fonction, ...

  5. #5
    Expert éminent sénior

    Avatar de Siguillaume
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2007
    Messages
    6 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Août 2007
    Messages : 6 180
    Points : 25 358
    Points
    25 358
    Par défaut
    Ok. J'ai vu tes fonctions. Et, elles ont l'air très optimal et plus rapide que la mienne. Seulement, je voudrais savoir laquelle peut resoudre mon problème? (Ce lle plus proche de la mienne, en termes de fonctionnalités).

    Citation Envoyé par ShaiLeTroll Voir le message
    Il vaut mieux passer la liste en paramètre déjà créé que faire un retour de fonction, ...
    J'essaie d'adapter. Dans ce cas, il serait peut être mieux de faire une procedure. N'est ce pas?

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Danjos Voir le message
    J'essaie d'adapter. Dans ce cas, il serait peut être mieux de faire une procedure. N'est ce pas?
    Oui dans ce cas le prototype de ta procédure serait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure extraireMots(chaine : string; var Mots: TStrings; sep :Char='#';nmots:integer=1);

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 296
    Points : 41 772
    Points
    41 772
    Billets dans le blog
    65
    Par défaut
    cela me rappelle une fonction que j'utilise beaucoup :
    ExtractWord et consort se trouvant dans jvStrUtils de la JVCL

    Y jeter un coup d'oeil ne fera pas de mal

  8. #8
    Expert éminent sénior

    Avatar de Siguillaume
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2007
    Messages
    6 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Août 2007
    Messages : 6 180
    Points : 25 358
    Points
    25 358
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    jvStrUtils de la JVCL
    Voici des termes tous nouveaux pour moi
    Peux-tu me dire où les trouver?

  9. #9
    Expert éminent sénior

    Avatar de Siguillaume
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2007
    Messages
    6 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Août 2007
    Messages : 6 180
    Points : 25 358
    Points
    25 358
    Par défaut
    Citation Envoyé par Aka Guymelef Voir le message
    Oui dans ce cas le prototype de ta procédure serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure extraireMots(chaine : string; var Mots: TStrings; sep :Char='#';nmots:integer=1);
    Peux-tu me donner un exemple d'utilisation? le var, venu s'ajouter me "remue un peu".

  10. #10
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    JVCL = Jedi VCL, c'est une librairie de composants et autres permettant de faire beaucoup de choses. Regardes la section téléchargement de Delphi pour plus de détail.

    Pour ce qui est du var, j'espère que tu as entendu parler du passage de paramètres pour valeur ou par référence. Le var ici sert à indiquer que le paramètre est passé par référence soit, sémantiquement, que l'objet va être modifié à l'intérieur de la fonction.

    Comme exemple d'utilisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    var
      maListe: TStrings;
    begin
      maListe := TStringList.Create;
      try
        extraireMots( 'toto est à la piscine', maListe, ' ', 5 );
        // faire quelque chose avec maListe
     
      finally
        maListe.Free
      end;
     
    end;

  11. #11
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 727
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 727
    Points : 25 630
    Points
    25 630
    Par défaut
    le var ne sert à rien, c'est un objet qui l'on manipule donc pas besoin de var (un objet c'est déjà un pointeur, c'est ce pointeur qui subi la directive var et non pas son contenu ... )

    le var est nécessaire si l'on doit effectuer une ré-instanciation\libération+nil (la fonction FreeAndNil par exemple utilise var à juste titre), dans d'autre cas, cela démontre une absence complète de compréhension des objets en delphi ...

    JVL ICI

  12. #12
    Expert éminent sénior

    Avatar de Siguillaume
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2007
    Messages
    6 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Août 2007
    Messages : 6 180
    Points : 25 358
    Points
    25 358
    Par défaut
    Ok. Merci beaucoup. Tout y est à présent et fonctionne très bien.

    Merci à tous pour vos contributions!

    Je crois qu'en attendant d'autres eclaircissements, sur les propositions de SergioMaster, je peux marquer le post .

  13. #13
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    le var est nécessaire si l'on doit effectuer une ré-instanciation\libération+nil (la fonction FreeAndNil par exemple utilise var à juste titre), dans d'autre cas, cela démontre une absence complète de compréhension des objets en delphi ...
    Mouerf je sais bien que les objets (en Delphi tout du moins) ne sont pas soumis aux mêmes règles concernant le passage par valeur ou par référence.

    Néanmoins j'aime bien positionner le var même sans l'utiliser réellement juste pour indiquer que l'objet sera bel et bien modifié à l'intérieur de ma fonction plutôt que de ne pas avoir de spécificateurs et d'être dans l'état "ptêtre ben que oui, ptêtre ben que non", c'est une approche purement sémantique de la chose.

  14. #14
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 727
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 727
    Points : 25 630
    Points
    25 630
    Par défaut
    t'intquiète, je l'ai fait aussi à mes débuts , et c'est il n'y a pas si longtemps ...
    Je préfère documenter mes fonctions avec un cartouche pour juste éviter les détournements syntaxiques ...

  15. #15
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    C'est vrai que la documentation est également là pour ça bien qu'en Delphi 7 avec l'auto-complétion on a pas de texte d'aide par contre on peut voir le var donc ça permet de parler directement.

    Néanmoins je sais que maintenant dans VS il est possible d'ajouter les commentaires de telles sortes qu'ils soient visibles également dans l'auto-complétion et c'est peut-être déjà le cas aussi avec les dernières version de Delphi qui sait ?

    En outre je dirais aussi que c'est une "sale" manie également qui doit venir du temps de mes études où avec le C++, le passage par référence est obligatoire si l'on ne voulait pas dupliquer l'objet lors d'un passage par valeur.

  16. #16
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 296
    Points : 41 772
    Points
    41 772
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par Danjos Voir le message
    Je crois qu'en attendant d'autres eclaircissements, sur les propositions de SergioMaster.
    Désolé d'avoir été si "lapidaire" . Comme l'a dit Aka Guymelef ou ShaiLeTroll , JVCL est un ensemble de composant freeware que j'utilise beaucoup . Il contient également plusieurs unités de fonctions dont jvstrutils (repertoire archive) que j'ai cité .

    dans cette dernière se trouve
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    function WordCount(const S: string; const WordDelims: TCharSet): Integer;
    { WordCount given a set of word delimiters, returns number of words in S. }
    function WordPosition(const N: Integer; const S: string;
      const WordDelims: TCharSet): Integer;
    { Given a set of word delimiters, returns start position of N'th word in S. }
    function ExtractWord(N: Integer; const S: string;
      const WordDelims: TCharSet): string;
    function ExtractWordPos(N: Integer; const S: string;
      const WordDelims: TCharSet; var Pos: Integer): string;
    function ExtractDelimited(N: Integer; const S: string;
      const Delims: TCharSet): string;
    { ExtractWord, ExtractWordPos and ExtractDelimited given a set of word
      delimiters, return the N'th word in S. }
    function ExtractSubstr(const S: string; var Pos: Integer;
      const Delims: TCharSet): string;
    { ExtractSubstr given a set of word delimiters, returns the substring from S,
      that started from position Pos. }
    function IsWordPresent(const W, S: string; const WordDelims: TCharSet): Boolean;
    { IsWordPresent given a set of word delimiters, returns True if word W is
      present in string S. }
    qui corresponde + ou - à ce que tu tentes de faire

  17. #17
    Expert éminent sénior

    Avatar de Siguillaume
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2007
    Messages
    6 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Août 2007
    Messages : 6 180
    Points : 25 358
    Points
    25 358
    Par défaut
    J'y vois plus clair
    Et là, je vois que les resultats que j'attends de ma procedure sont les mêmes que ceux retournés par la fonction ExtractWord, comme tu l'avais dit plus haut.

    Mais, j'ai encore une autre question. Vu que cette librairie n'est pas intégré à Delphi, est ce qu'il n'y aurait pas de problème d'éxécution sur une machine où Delphi n'est pas installé?

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

Discussions similaires

  1. programmer en java l'extraction des mots clés sur un site web
    Par industrielle dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 21/12/2008, 15h53
  2. extraction des mots à partir dune chaine de caractères
    Par khaledklaud dans le forum Langage
    Réponses: 2
    Dernier message: 30/09/2008, 17h13
  3. Erreur sur Fonction PL/SQL
    Par boudou dans le forum PL/SQL
    Réponses: 2
    Dernier message: 22/10/2007, 09h34
  4. [MySQL] Erreur sur fonction PHP
    Par lothar59 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 04/03/2007, 12h31
  5. Erreur sur fonction
    Par all4linux dans le forum C
    Réponses: 2
    Dernier message: 30/06/2006, 11h40

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