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. #1
    Membre à l'essai 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
    Points : 16
    Points
    16
    Par défaut Conversion en morse
    Salut, je me suis remis à la programmation en C depuis peu et j'ai ressortis un ptit programme que j'avais codé à mes heures perdues, seulement, en le recompilant et en le testant il ne marche pas, il m'affiche les ?????? de mon else dans la boucle for.....

    Pourriez-vous m'aider à le faire fonctionner et peut-être m'indiquer comment l'améliorer un petit peu.........

    Voici le codeur morse :

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    #include <stdio.h>
    #include <string.h>
    #define NL 37                                
     
    main()
    {
     
       struct code { char lettre ;
                     char * morse ;
                   } ;
       struct code table[NL] =                          
     
                   { 'A', ".-",       'B', "-...",       'C', "-.-.",
                     'D', "-..",      'E', ".",          'F', "..-.",
                     'G', "--.",      'H', "....",       'I', "..",
                     'J', ".---",     'K', "-.-",        'L', ".-..",
                     'M', "--",       'N', "-.",         'O', "---",
                     'P', ".--.",     'Q', "--.-",       'R', ".-.",
                     'S', "...",      'T', "-",          'U', "..-",
                     'V', "...-",     'W', ".--",        'X', "-..-",
                     'Y', "-.--",     'Z', "--..",
                     '.', ".-.-.-",
                     '0', "-----",    '1', ".----",      '2', "..---",
                     '3', "...--",    '4', "....-",      '5', ".....",
                     '6', "-....",    '7', "--...",      '8', "---..",
                     '9', "----.",
                   } ;
     
       char ligne[128] ;                              
       int i, j ;
     
       debut:          
     
       printf ("\n\n         LES CARACTERES SONT A ECRIRE EN MAJUSCULE    \n\n") ;
       printf ("                      128 caracteres maximum  \n") ;
       printf ("                   Introduisez une phrase : \n") ;
     
       gets (ligne) ;
     
       printf ("\n\n           Voici la traduction de votre message : \n\n") ;
     
       for (i=0 ; i<strlen(ligne) ; i++) 
     
          { j=0 ;
            while (ligne[i] != table[j].lettre && j++<NL-1) ;
            if (j<NL) printf ("%7s", table[j].morse) ;
                else  printf (" ??????") ;
            if ( ! ((i+1)%10) ) printf ("\n\n") ; 
     
          }
          goto debut ; 
    }
    Et voici le décodeur morse que je n'arrive pas à compiler avec code::blocks, ça marchais avec devc++ :

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    #include <stdio.h>
    #include <string.h>
    #define NL 37                                 
    #define LG 127                                  
     
    main()
    {
       struct code { char lettre ;
                     char * morse ;
                   } ;
       struct code table[NL] =                 
     
                   { 'A', ".-",       'B', "-...",       'C', "-.-.",
                     'D', "-..",      'E', ".",          'F', "..-.",
                     'G', "--.",      'H', "....",       'I', "..",
                     'J', ".---",     'K', "-.-",        'L', ".-..",
                     'M', "--",       'N', "-.",         'O', "---",
                     'P', ".--.",     'Q', "--.-",       'R', ".-.",
                     'S', "...",      'T', "-",          'U', "..-",
                     'V', "...-",     'W', ".--",        'X', "-..-",
                     'Y', "-.--",     'Z', "--..",
                     '.', ".-.-.-",
                     '0', "-----",    '1', ".----",      '2', "..---",
                     '3', "...--",    '4', "....-",      '5', ".....",
                     '6', "-....",    '7', "--...",      '8', "---..",
                     '9', "----.",
                   } ;
       char ligne[LG+1] ;                       
       char code[7] ;                   
       int i, j ;
     
       debut:                            
     
       printf ("\n\n        Introduiser un code morse a traduire : \n") ;
       gets (ligne) ;
       printf ("\n\n   Le code morse traduit alphabetiquement veut dire : \n") ;
     
     
       i=0 ;
       while (i<strlen(ligne))
          {
            while (ligne[i] == ' ') i++ ;    
            if ( i<strlen(ligne) )          
              { sscanf (&ligne[i], "%6s", code) ;
                i += strlen(code) ;            
                j=0 ;                            
                while ( stricmp (code, table[j].morse) && j++<NL-1) ;
                if (j<NL) printf ("%2c", table[j].lettre) ;   
                    else  printf (" ?") ;           
              }
          }
          goto debut ;                
    }
    Bon évidemment, un bon codeur doit savoir coder sans son code.....mais, toutefois si un coup de pouce est possible...heu...bin, je dis pas non....


  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Jao,

    En jetant un petit coup d'œil, je vois du goto, et je n'insiste pas.
    Si les cons volaient, il ferait nuit à midi.

  3. #3
    Membre chevronné
    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
    Points : 1 750
    Points
    1 750
    Par défaut
    Salut

    Le premier code semble fonctionner, mais il y a plusieurs choses à revoir :
    * Il faut corriger les warning, c'est important.
    * Il est préférable de supprimer le "goto", ce n'est pas propre.
    * Utilise une variable au lieu d'appeler "strlen" à chaque fois (lorsque cela n'est pas nécessaire), cela consomme des ressources inutilement.
    * "gets" est une fonction dangereuse, elle présente une grosse faille de sécurité (elle permet un dépassement de tampon avec les conséquences qui y sont liées), il faut la bannir. Il faut utiliser "fgets" à la place.
    * La fonction "main" doit toujours renvoyer un int.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int main(void)
    {
    (...)
       return EXIT_SUCCESS; /* si tout est OK */
    }
    Concernant le second code, mêmes remarques que précédemment. De plus, la fonction "stricmp" semble ne pas exister. Remplace-la par la fonction "strcmp".

  4. #4
    Membre à l'essai 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
    Points : 16
    Points
    16
    Par défaut merci
    Merci beaucoup pour ces renseignement précieux....

    Pour ce qui est du goto, je sais que j'aurais du changer ça avant, c'est une erreur ultra misérable de ma part mais à l'époque celà à du m'arranger pour une raison quelquonque.... je sais que ce n'est franchement pas très....algorithmique et que ça ne s'utilise plus depuis des lustres désolé.

    Je viens de me remettre à la programmation car j'ai un peu de temps et je te remercie pour tes conseils, il vont m'être très utiles.....

  5. #5
    Membre régulier
    Inscrit en
    Août 2010
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 68
    Points : 79
    Points
    79
    Par défaut
    Citation Envoyé par Ziarrow Voir le message
    et que ça ne s'utilise plus depuis des lustres désolé.
    Le noyau Linux en est truffé... mais le contexte d'utilisation n'est pas le même

  6. #6
    Membre à l'essai 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
    Points : 16
    Points
    16
    Par défaut
    J'ai solutionné les warnings et changer mes erreurs pour le codeur morse, merci en tout cas, ça fonctionne :


    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    #include <stdio.h>
    #include <string.h>
    #define NL 37
    #define MAXLONG 128                 
     
    int main(void)
    {
     
       struct code { char lettre ;
                     const char * morse ;
                   } ;
       struct code table[NL] =                         
                   { {'A', ".-"},       {'B', "-..."},       {'C', "-.-."},
                     {'D', "-.."},      {'E', "."},          {'F', "..-."},
                     {'G', "--."},      {'H', "...."},       {'I', ".."},
                     {'J', ".---"},     {'K', "-.-"},        {'L', ".-.."},
                     {'M', "--"},       {'N', "-."},         {'O', "---"},
                     {'P', ".--."},     {'Q', "--.-"},       {'R', ".-."},
                     {'S', "..."},      {'T', "-"},          {'U', "..-"},
                     {'V', "...-"},     {'W', ".--"},        {'X', "-..-"},
                     {'Y', "-.--"},     {'Z', "--.."},
                     {'.', ".-.-.-"},
                     {'0', "-----"},    {'1', ".----"},      {'2', "..---"},
                     {'3', "...--"},    {'4', "....-"},      {'5', "....."},
                     {'6', "-...."},    {'7', "--..."},      {'8', "---.."},
                     {'9', "----."}
                   } ;
     
     
       char ligne[MAXLONG] ;         
       unsigned int i, j ;
       size_t length;
      while (1)
      {
       printf ("\n\n         LES CARACTERES SONT A ECRIRE EN MAJUSCULE    \n\n") ;
       printf ("                    128 caracteres maximum  \n") ;
       printf ("        Introduisez une phrase ou un blanc pour quitter : \n") ;
     
       fgets (ligne, MAXLONG, stdin) ;
     
        if (ligne[0] == '\n')
        break;
     
       printf ("\n\n         Voici la traduction de votre message : \n\n") ;
     
     
       length = strlen(ligne);
     
       for (i=0 ; i<length ; i++)                        
     
          { j=0 ;
            while (ligne[i] != table[j].lettre && j++<NL-1) ;
            if (j<NL) printf ("%7s", table[j].morse) ;
            if ( ! ((i+1)%10) ) printf ("\n\n") ;         
          }
     }
    return 0;
    }
    Donc merci et n'hésiter pas à critiquer ce bout de code s'il y a lieu.

    Je changerai le décodeur de la même manière........


  7. #7
    Membre à l'essai 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
    Points : 16
    Points
    16
    Par défaut
    Sans vouloir abuser, je voudrais vous demander de m'aider pour le décodeur, j'ai solutionner les warnings, le programme se compile et fonctionne mais lorsque j'écris le code en morse, j'ai en sorti d'affichage deux fois la dernière lettre à convertir.

    Exemple :

    Introduiser un code morse a traduire : -. --. ---

    Le code morse traduit alphabétiquement : n g o o au lieu de n g o

    Voici le code revu du décodeur morse :

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
    #include <stdio.h>
    #include <string.h>
    #define NL 37                           
    #define LG 127                       
     
    int main(void)
    {
       struct code { char lettre ;
                     const char * morse ;
                   } ;
       struct code table[NL] =                          
                  {  {'.', ".-.-.-"},
                     {'0', "-----"},    {'1', ".----"},      {'2', "..---"},
                     {'3', "...--"},    {'4', "....-"},      {'5', "....."},
                     {'6', "-...."},    {'7', "--..."},      {'8', "---.."},
                     {'9', "----."},
                     {'a', ".-"},       {'b', "-..."},       {'c', "-.-."},
                     {'d', "-.."},      {'e', "."},          {'f', "..-."},
                     {'g', "--."},      {'h', "...."},       {'i', ".."},
                     {'j', ".---"},     {'k', "-.-"},        {'l', ".-.."},
                     {'m', "--"},       {'n', "-."},         {'o', "---"},
                     {'p', ".--."},     {'q', "--.-"},       {'r', ".-."},
                     {'s', "..."},      {'t', "-"},          {'u', "..-"},
                     {'v', "...-"},     {'w', ".--"},        {'x', "-..-"},
                     {'y', "-.--"},     {'z', "--.."}
                   } ;
     
       char ligne[LG+1] ;                    
       char code[7] ;                     
       unsigned int i, j ;
       size_t length;
     
     while (1)
     {
       printf ("\n\n       Introduiser un code morse a traduire : \n") ;
       fgets (ligne, LG, stdin) ;
     
       if (ligne[0] == '\n')
       break;
     
       printf ("\n\n  Le code morse traduit alphab\202tiquement : \n\n") ;
     
       length = strlen(ligne);                            
       i=0 ;
     
       while (i<length)
          {
            while (ligne[i] == ' ') i++ ;         
            if ( i<length )                                
              { sscanf (&ligne[i], "%6s", code) ;  
                i += strlen(code) ;      
                j=0 ;                        
                while ( strcmp (code, table[j].morse) && j++<NL-1) ;
                if (j<NL) printf ("%2c", table[j].lettre) ;      
                    else  printf (" ?") ;                 
              }
          }
       }
      return 0;
    }
    N'hésiter pas à critiquer mes inepties......


  8. #8
    Expert confirmé Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 364
    Points : 5 378
    Points
    5 378
    Par défaut
    Citation Envoyé par kiluak Voir le message
    Le noyau Linux en est truffé... mais le contexte d'utilisation n'est pas le même
    Oui mais là, il a fait un goto qui "remonte", c'est très dangereux !!! Je ne pense pas qu'il y en ait dans le noyau (j'espère).
    Un goto sert généralement à sortir (de boucles imbriquées), pas à boucler !!

  9. #9
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Le code morse traduit alphabétiquement : n g o o au lieu de n g o
    fgets(), à la différence de gets(), met le '\n' dans la chaine et du coup tu fais un tour de plus.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  10. #10
    Membre à l'essai 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
    Points : 16
    Points
    16
    Par défaut
    Merci Ô vénérable, mon problème est arrangé avec un petit if :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (ligne[i] == '\n') i++;
    Merci infiniment !!!

  11. #11
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Ziarrow Voir le message
    Donc merci et n'hésiter pas à critiquer ce bout de code s'il y a lieu.
    C'est pas une critique mais une solution d'optimisation
    Tu peux éviter la macro NL de cette façon

    Code C : 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
     struct code table[] =                          
                  {  {'.', ".-.-.-"},
                     {'0', "-----"},    {'1', ".----"},      {'2', "..---"},
                     {'3', "...--"},    {'4', "....-"},      {'5', "....."},
                     {'6', "-...."},    {'7', "--..."},      {'8', "---.."},
                     {'9', "----."},
                     {'a', ".-"},       {'b', "-..."},       {'c', "-.-."},
                     {'d', "-.."},      {'e', "."},          {'f', "..-."},
                     {'g', "--."},      {'h', "...."},       {'i', ".."},
                     {'j', ".---"},     {'k', "-.-"},        {'l', ".-.."},
                     {'m', "--"},       {'n', "-."},         {'o', "---"},
                     {'p', ".--."},     {'q', "--.-"},       {'r', ".-."},
                     {'s', "..."},      {'t', "-"},          {'u', "..-"},
                     {'v', "...-"},     {'w', ".--"},        {'x', "-..-"},
                     {'y', "-.--"},     {'z', "--.."},
                     {'\0', NULL}
                   } ;

    Et ta boucle de recherche peut se faire de cette façon
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    struct code *pt;
    for (pt=table; pt->morse != NULL; pt++)
    {
        if (strcmp(pt->morse, code) == 0)
        {
             ...
        }
    }

    Accessoirement, nommer une structure "code" et une variable "code" c'est pas tiptop lisible. Tu devrais peut-être prendre l'habitude de nommer tes structures "s_qqchose" et tes types "t_qqchose".

    Accessoirement (bis), il me semble que tu analyses ton code sur les espaces qui séparent chaque lettre. Or pour découper une chaine sur un caractère séparateur, tu as à ta disposition strtok_r() qui se charge de tout...

    Citation Envoyé par Ziarrow Voir le message
    Merci Ô vénérable, mon problème est arrangé avec un petit if :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (ligne[i] == '\n') i++;
    Tu fais ce test à chaque tour de boucle alors que si tu enlevais le '\n' juste après le fgets, t'aurais plus de soucis
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    fgets (ligne, LG, stdin) ;
     
    if ((carac=strchr(ligne, '\n')) != NULL)
        *carac='\0';

    Accessoirement, puisque tu as déjà "length" qui existe, tu peux t'en servir aussi pour ça
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    fgets (ligne, LG, stdin) ;
    length=strlen(ligne);
    if (ligne[length - 1] ==  '\n')
       ligne[--length]='\0;
    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]

  12. #12
    Membre à l'essai 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
    Points : 16
    Points
    16
    Par défaut
    Wow, je pouvais pas espérer mieux pour améliorer mon p'tit prog......

    J'me met direct au travail, grand merci !!!


  13. #13
    Membre à l'essai 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
    Points : 16
    Points
    16
    Par défaut
    Est-ce qu'au lieu de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    fgets (ligne, LG, stdin) ;
     
    if ((carac=strchr(ligne, '\n')) != NULL)
        *carac='\0';
    Puis-je écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    fgets (ligne, LG, stdin) ;
     
    *(strchr(ligne, '\n')) = '\0';
    Ce serait pour tenter d'éviter un pointeur de plus.....


  14. #14
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Citation Envoyé par Ziarrow Voir le message
    Est-ce qu'au lieu de :
    ....
    Puis-je écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    fgets (ligne, LG, stdin) ;
     
    *(strchr(ligne, '\n')) = '\0';
    Ce serait pour tenter d'éviter un pointeur de plus.....

    Pour pouvoir écrire ceci, il faut être sûr qu'un '\n' soit dans ligne, sinon, ça plante. Or fgets() ne le garantit pas : si la ligne entrée comporte LG caractères ou plus (y compris le '\n') , elle est tronquée et il n'y a donc pas de '\n'.
    La première forme est donc préférable, puisque tu utilises fgets() justement pour ne pas planter en cas de ligne trop longue.

    Note : inutile de mettre des parenthèses superflues qui encombrent la lecture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *strchr(ligne, '\n') = '\0';
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  15. #15
    Membre à l'essai 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
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par diogene
    Pour pouvoir écrire ceci, il faut être sûr qu'un '\n' soit dans ligne, sinon, ça plante. Or fgets() ne le garantit pas : si la ligne entrée comporte LG caractères ou plus (y compris le '\n') , elle est tronquée et il n'y a donc pas de '\n'.
    La première forme est donc préférable, puisque tu utilises fgets() justement pour ne pas planter en cas de ligne trop longue.
    Ok, je prends note, je ferais plus l'erreur.


    Citation Envoyé par Sve@r
    Et ta boucle de recherche peut se faire de cette façon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    struct code *pt;
    for (pt=table; pt->morse != NULL; pt++)
    {
        if (strcmp(pt->morse, code) == 0)
        {
             ...
        }
    }
    Malheureusement, ce qui est simple pour toi, l'est beaucoup moins pour moi...
    Je reprends à peine la programmation (5 ans d'abstinence) et je m'y perds un peu dans mes variables étant donné que j'ai compliqué les choses en surchargeant, donc je redécouvre mes début et ...... aussi mon point actuel.

    Mais je vais en découdre de nouveau avec la matrice... aurait-tu un lien d'une page expliquant la manoeuvre que tu me propose d'envisager pour optimiser mon code.... parce que vous m'avez déjà bien aider, je risque de vous prendre la tête avec mes questions.

  16. #16
    Membre chevronné
    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
    Points : 1 750
    Points
    1 750
    Par défaut
    La méthode de Sve@r permet simplement de parcourir tout le tableau sans s'occuper de sa taille. Le dernier membre ("morse", pointeur sur char) du tableau est à NULL, ce qui indique la fin du tableau. D'où la boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (pt=table; pt->morse != NULL; pt++)

  17. #17
    Membre à l'essai 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
    Points : 16
    Points
    16
    Par défaut
    D'accord merci, je comprenais pas mais je ne vois pas comment stocker l'équivalence de la touche tapé, je ne suis pas encore à l'aise avec cette méthode pourtant magique.......

  18. #18
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    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])

  19. #19
    Membre chevronné
    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
    Points : 1 750
    Points
    1 750
    Par défaut
    D'accord merci, je comprenais pas mais je ne vois pas comment stocker l'équivalence de la touche tapé, je ne suis pas encore à l'aise avec cette méthode pourtant magique.......
    Ce bout de code concernait le décodeur morse.
    "pt" prend au départ comme valeur l'adresse du début du tableau. Si "pt->morse" ne correspond pas au code morse voulu, "pt" est alors incrémenté pour aller à l'élément du tableau suivant, puis teste le code suivant, etc. Si cela correspond, la lettre associée est donc "pt->lettre".

    Exemple. Si on tape "...--" :
    1) "pt" commence au début du tableau.
    2) "pt->morse" est testé avec le code morse tapé, ici "...--". Si cela ne correspond pas, on incrémente "pt", puis on recommence le point 2). (à moins que NULL soit trouvé, ce qui indique la fin du tableau et il faut donc sortir de la boucle)
    3) Une fois le code morse trouvé, "pt->lettre" correspond alors au caractère associé. Dans notre exemple, cela correspond à "3".

  20. #20
    Membre à l'essai 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
    Points : 16
    Points
    16
    Par défaut
    Merci, vous êtes de véritables profs !!!!


+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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