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

C Discussion :

Conversion en morse


Sujet :

C

  1. #21
    Membre averti Avatar de Ziarrow
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 31
    Par défaut
    Une dernière question avant de considérer que mon sujet est résolu car vous m'avez sacrément aidé...... je n'en désire pas plus...

    En ce qui concerne "strtok_r", j'ai essayer de faire comme on m'a conseillé mais même avec "string.h", la fonction n'est pas reconnue...

    J'ai trouvé "strtok_r.c" et "strtok_r.h" grâce à un post sur ce forum mais je ne sais pas comment l'installer dans code::blocks, où les mettre, quoi réglé....

    quelqu'un saurait ??


  2. #22
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    Par défaut
    Tu compiles avec quelle machine et quel compilateur ? Selon la man page, strtok_r() (comme beaucoup d'autres) correspond à POSIX.1-2001. Normal, c'est une révision d'une fonction utile parce qu'on s'est rendu compte un peu plus tard qu'elle n'était pas ré-entrante en l'état.

    SYNOPSIS
    #include <string.h>

    char *strtok(char *str, const char *delim);

    char *strtok_r(char *str, const char *delim, char **saveptr);

    Feature Test Macro Requirements for glibc (see feature_test_macros(7)):

    strtok_r(): _SVID_SOURCE || _BSD_SOURCE || _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _POSIX_SOURCE

    CONFORMING TO
    strtok()
    SVr4, POSIX.1-2001, 4.3BSD, C89, C99.

    strtok_r()
    POSIX.1-2001.
    Donc, si ton compilo est un tout petit peu tatillon, ou bien est réglé sur un standard particulier (C89 ?), la fonction ne sera pas automatiquement définie.

  3. #23
    Membre averti Avatar de Ziarrow
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 31
    Par défaut
    Je compile sur windows Xp avec Code::blocks svn build rev 6508.

    Est-ce que j'ai une possibilité de m'en servir ?

  4. #24
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par matafan Voir le message
    Une autre méthode qui ne demande pas d'ajouter un marqueur de fin est de laisser le compilateur calculer la taille du tableau avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sizeof(table)/sizeof(table[0])
    Ouch ça c'est dangereux.
    Ca marche si table est toujours un tableau. Mais si on déporte ça dans une fonction et que table est passé en paramètre (et donc reçu dans la fonction dans un pointeur) gros crash...

    Citation Envoyé par Ziarrow Voir le message
    aurait-tu un lien d'une page expliquant la manoeuvre que tu me propose d'envisager pour optimiser mon code....
    Jéroman a bien expliqué le truc. J'ajouterai simplement qu'il s'agit d'une application concrète de l'arithmétique des pointeurs
    Si pt pointe vers un élément [X] d'un tableau, alors "pt + 1" pointera vers l'élément [X + 1] du tableau et ce, quelle que soit la taille dudit élément. Mais la vraie astuce de mon code n'était pas là. Elle était surtout sur l'élément NULL que j'avais inséré dans le tableau qui permet de savoir où s'arrêter sans avoir à connaitre la longueur à l'avance
    Et donc ceci aurait fait aussi l'affaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for (i=0; table[i].morse != NULL; i++)
    {
        if (strcmp(table[i].morse, code) == 0)
        {
             ...
        }
    }
    Mais l'opération [i] étant une opération lourde, mon premier exemple à base de pointeur pointant directement vers l'élément courant est alors plus rapide...

    Citation Envoyé par Ziarrow Voir le message
    Je compile sur windows Xp avec Code::blocks svn build rev 6508.

    Est-ce que j'ai une possibilité de m'en servir ?
    Obsidian a dit que cette fonction était assez récente. En théorie tu as toujours possibilité d'essayer son ancètre strtok()....
    Une explication plus complète ici http://www.bash-linux.com/unix-man-s...-francais.html
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #25
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Ouch ça c'est dangereux.
    Ca marche si table est toujours un tableau. Mais si on déporte ça dans une fonction et que table est passé en paramètre (et donc reçu dans la fonction dans un pointeur) gros crash...
    C'est une construction assez classique. Et lorsqu'on passe le tableau en paramètre de fonction, on passe également la taille tout simplement.

    Mais effectivement, dans le cas présent, l'utilisation d'une sentinelle me semble plus approprié.

  6. #26
    Membre averti Avatar de Ziarrow
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 31
    Par défaut
    Citation Envoyé par Sve@r
    Et donc ceci aurait fait aussi l'affaire


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for (i=0; table[i].morse != NULL; i++)
    {
        if (strcmp(table[i].morse, code) == 0)
        {
             ...
        }
    }
    Oui, j'ai eu un peu de mal à comprendre, ça revient au même c'est vrai mais à vrai dire ce qui m’embarrasse c'est que de toute façon, tout le tableau est lu et je ne peux pas savoir si le caractère n'a pas été trouvé avec un else par exemple pour afficher un "point d'interrogation" à la place d'un espace dans le cass d'un caractère introuvable, je me suis résolu à un petit bricolage avec une variable "inep" ....

    De plus, avec cette méthode que je me suis empressé d'appliquer, lorsque je tape un "espace" après un code morse, il traduit deux fois le dernier caractère une fois de plus....

    Et Je ne me sers pas encore de "strtok_r"....."strsep()" ne serait t-il pas intéressant ?

    Voici une portion du code :

    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
    while (1)
     {
       printf ("\n\n Introduiser un code morse a traduire ou un blanc pour quitter : \n\n") ;
       fgets (ligne, LG, stdin) ;
     
       if (ligne[0] == '\n')
           return 0;
       else if ((carac=strchr(ligne, '\n')) != NULL)
               *carac='\0';
     
       printf ("\n\n Le code morse traduit alphab\202tiquement : \n\n") ;
     
       length = strlen(ligne);                     
       i=0 ;
     
       while (i<length)
          {
            inep = 0;
            while (ligne[i] == ' ') i++;     
             {
                sscanf (&ligne[i], "%6s", d_code);   
                i += strlen(d_code);
                for (pt=table; pt->morse != NULL; pt++)
                  {
                      if (strcmp(pt->morse, d_code) == 0)
                        {
                         printf ("%2c", pt->lettre);
                         inep = 1;
                        }
                  }
                if (inep == 0)
                printf(" ?");
              }
          }
       }
      return 0;
    }

  7. #27
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Oui, j'ai eu un peu de mal à comprendre, ça revient au même c'est vrai mais à vrai dire ce qui m’embarrasse c'est que de toute façon, tout le tableau est lu et je ne peux pas savoir si le caractère n'a pas été trouvé avec un else par exemple pour afficher un "point d'interrogation" à la place d'un espace dans le cass d'un caractère introuvable, je me suis résolu à un petit bricolage avec une variable "inep" ....
    Il y a sinon moyen de mettre un "break" lorsque l'occurence est trouvée, ce qui provoque la sortie de la boucle.

    Ceci permet, une fois sorti de la boucle, d'effectuer un test de "pt->morse" (ou de "table[i].morse" si on utilise l'autre méthode) avec NULL pour savoir si tout le tableau a été parcouru (si c'est le cas, c'est que la chaine n'a pas été trouvée).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    for (i=0; table[i].morse != NULL; i++)
    {
        if (strcmp(table[i].morse, code) == 0)
        {
             ...
             break;
        }
    }
    if ( table[i].morse == NULL ) /* la chaîne n'a pas été trouvée ? */
    {
    ...
    }
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    struct code *pt;
    for (pt=table; pt->morse != NULL; pt++)
    {
        if (strcmp(pt->morse, code) == 0)
        {
             ...
             break;
        }
    }
    if ( pt->morse == NULL) /* la chaîne n'a pas été trouvée ? */
    {
    ...
    }

  8. #28
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    Par défaut
    Citation Envoyé par Ziarrow Voir le message
    Je compile sur windows Xp avec Code::blocks svn build rev 6508.

    Est-ce que j'ai une possibilité de m'en servir ?
    Certainement, oui. Ce doit être une option à passer à ton compilo. Seulement, comme je n'utilise ni Windows ni Code::Blocks, je ne sais pas laquelle.

  9. #29
    Membre averti Avatar de Ziarrow
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 31
    Par défaut
    Ok, j'ai utilisé strtok, mon code est allégé.... voici à quoi ça ressemble :


    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
     
        printf ("\n\n Le code morse traduit alphab\202tiquement : \n\n") ;
     
        inep = 0;
        d_code = strtok (ligne," ");
        while (d_code != NULL)
        {
            for (pt=table; pt->morse != NULL; pt++)
                {
                    if (strcmp(pt->morse, d_code) == 0)
                    {
                        printf ("%2c", pt->lettre);
                        inep = 1;
                    }
                }
            if (inep == 0)
            printf(" ?");
            d_code = strtok (NULL, " ");
        }
      }
      return 0;
    }
    Merci à tous pour votre aide.....


+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Conversion Assembleur Motorola 68xxx en Intel 80xxx
    Par markham dans le forum Autres architectures
    Réponses: 3
    Dernier message: 22/11/2002, 20h09
  2. [MSXML] Comment empécher la conversion des entités ?
    Par nima dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 08/11/2002, 14h14
  3. Algorithme de conversion de RTF vers HTML
    Par youtch dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 10/09/2002, 12h35
  4. [Conversions] Millisecondes...
    Par agh dans le forum Langage
    Réponses: 2
    Dernier message: 06/08/2002, 11h25
  5. Réponses: 2
    Dernier message: 05/06/2002, 12h29

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