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

Réseau C Discussion :

Pb avec fonction strcat ?


Sujet :

Réseau C

  1. #21
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par olivier857
    Alors je voulais tout simplement essayer de vider le tableau a[],
    "vider un tableau" n'a aucun sens. Tu ne peux que modifier la valeur de ses éléments.
    car je peu très bien lire et stocker dans a[] des chaines de caractère de longueur sensiblement différentes. Donc je veux éviter d'avoir un résidu de caractère dans mon tableau avant de relancer la boucle. (cas ou la lecture précédente ést plus longue que la courante, si la lecture x-1 fait 15 caractères et la lecture x en fait 13, je veu éviter de récupérer les caractères 14 et 15 de la lecture x-1).

    J'ai peut être totalement tord, je ne sais pas. Je cherche juste a initialiser le tableau en le vidant.
    C'est inutile
    • Parce que tu ecris par dessus les données précédentes, donc tu ne les verra plus.
    • Parce que tu vas mettre un 0 qui va délimiter la chaine, comme je me tue à te le répéter. Ce qu'il y a derrière sera ignoré.

    C'est compliqué à comprendre ? Tu n'as donc toujours pas compris ce qu'était une chaine de caractères ? Tu n'as donc jamais ouvert de livre de C ?
    Pas de Wi-Fi à la maison : CPL

  2. #22
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par olivier857
    Citation Envoyé par Emmanuel
    Rappel : une chaine de caractères est un tableau de char terminé par un 0.

    Donc une fois que tu as placé les caractères dans le tableau, il faut placer un 0 après le dernier caractère (facile, c'est à la valeur courante de l'index), afin de terminer correctement la chaine, sinon, le comportement est indéfini. Tout peut arriver.
    Donc si je comprend bien apres ma boucle qui récupère caractère par caractère et les stock dans mon tableau je dois ajouter un 0 dans ce tableau.
    J'ai pas dit ajouter...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      while(c!=0x0a){
          read(fd, &c, 1);
          a[i]=c;
          printf("%c\n",c);   //affichage caractère par caractère
          i++;     
        } 
        a[i]="0";    ou   strcat(a,"0");
    Bon j'espère t'avoir compris.

    Est-ce quel quelque part, j'ai écrit "0" ? Tu es donc incapable de suivre une consigne ? Tu veux faire le malin ? N'en faire qu'à ta tête ? C'est pas possible de voir ça. Je me tue à te dire qu'il faut mettre un 0 alors met un 0.
    Va pas chercher des trucs tordus alors que c'est simple.
    Pas de Wi-Fi à la maison : CPL

  3. #23
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 170
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par olivier857
    Alors je voulais tout simplement essayer de vider le tableau a[],
    "vider un tableau" n'a aucun sens. Tu ne peux que modifier la valeur de ses éléments.
    car je peu très bien lire et stocker dans a[] des chaines de caractère de longueur sensiblement différentes. Donc je veux éviter d'avoir un résidu de caractère dans mon tableau avant de relancer la boucle. (cas ou la lecture précédente ést plus longue que la courante, si la lecture x-1 fait 15 caractères et la lecture x en fait 13, je veu éviter de récupérer les caractères 14 et 15 de la lecture x-1).

    J'ai peut être totalement tord, je ne sais pas. Je cherche juste a initialiser le tableau en le vidant.
    C'est inutile
    • Parce que tu ecris par dessus les données précédentes, donc tu ne les verra plus.
    • Parce que tu vas mettre un 0 qui va délimiter la chaine, comme je me tue à te le répéter. Ce qu'il y a derrière sera ignoré.

    C'est compliqué à comprendre ? Tu n'as donc toujours pas compris ce qu'était une chaine de caractères ? Tu n'as donc jamais ouvert de livre de C ?
    Ok d'accord ! C'est bon. J'ai pigé.

    J'ai oublié de préciser le contenu de ce que je lit sur le port. En fait je lit le numéro d'une carte à puce par le biais d'un lecteur de carte branché sur le port série.

    J'obtiens donc la chaine suivante :
    000000xxxx\r\n --> x représente des chifres(numéro de la carte lu)
    Le nombre de zéro et le nombre de chiffre peut varier mais la chiane se termine toujours par \r\n.

  4. #24
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par olivier857
    J'ai oublié de préciser le contenu de ce que je lit sur le port. En fait je lit le numéro d'une carte à puce par le biais d'un lecteur de carte branché sur le port série.

    J'obtiens donc la chaine suivante :
    000000xxxx\r\n --> x représente des chifres(numéro de la carte lu)
    Le nombre de zéro et le nombre de chiffre peut varier mais la chaine se termine toujours par \r\n.
    Ok. Il reste maintenant à s'assurer qu'on ne déborde pas du tableau. (Si l'équipement d'en face se met à délirer, ça ne doit pas planter ta machine).
    Pas de Wi-Fi à la maison : CPL

  5. #25
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par olivier857
    Citation Envoyé par Emmanuel
    Rappel : une chaine de caractères est un tableau de char terminé par un 0.

    Donc une fois que tu as placé les caractères dans le tableau, il faut placer un 0 après le dernier caractère (facile, c'est à la valeur courante de l'index), afin de terminer correctement la chaine, sinon, le comportement est indéfini. Tout peut arriver.
    Donc si je comprend bien apres ma boucle qui récupère caractère par caractère et les stock dans mon tableau je dois ajouter un 0 dans ce tableau.
    J'ai pas dit ajouter...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      while(c!=0x0a){
          read(fd, &c, 1);
          a[i]=c;
          printf("%c\n",c);   //affichage caractère par caractère
          i++;     
        } 
        a[i]="0";    ou   strcat(a,"0");
    Bon j'espère t'avoir compris.

    Est-ce quel quelque part, j'ai écrit "0" ? Tu es donc incapable de suivre une consigne ? Tu veux faire le malin ? N'en faire qu'à ta tête ? C'est pas possible de voir ça. Je me tue à te dire qu'il faut mettre un 0 alors met un 0.
    Va pas chercher des trucs tordus alors que c'est simple.
    [Ouvrir la parenthèse]
    Si à la limite t'avais écrit
    cela aurait pu encore passer (notez le encore étant très important). Mais là, tu veux mettre un pointeur vers une chaîne de caractères dans une case qui est de type caractère. C'est donc beaucoup plus grave....

    Ne pas respecter les types est toujours une mauvaise idée...

    [/Ouvrir la parenthèse]

    Jc

  6. #26
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 170
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par olivier857
    Citation Envoyé par Emmanuel
    Rappel : une chaine de caractères est un tableau de char terminé par un 0.

    Donc une fois que tu as placé les caractères dans le tableau, il faut placer un 0 après le dernier caractère (facile, c'est à la valeur courante de l'index), afin de terminer correctement la chaine, sinon, le comportement est indéfini. Tout peut arriver.
    Donc si je comprend bien apres ma boucle qui récupère caractère par caractère et les stock dans mon tableau je dois ajouter un 0 dans ce tableau.
    J'ai pas dit ajouter...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      while(c!=0x0a){
          read(fd, &c, 1);
          a[i]=c;
          printf("%c\n",c);   //affichage caractère par caractère
          i++;     
        } 
        a[i]="0";    ou   strcat(a,"0");
    Bon j'espère t'avoir compris.

    Est-ce quel quelque part, j'ai écrit "0" ? Tu es donc incapable de suivre une consigne ? Tu veux faire le malin ? N'en faire qu'à ta tête ? C'est pas possible de voir ça. Je me tue à te dire qu'il faut mettre un 0 alors met un 0.
    Va pas chercher des trucs tordus alors que c'est simple.
    Ok Ok. Désolé j'ai encore était trop vite. Cette fois je crois vraiment avoir compris. La chaine se termine par 0 et non le caractère "0".

    Effectivement je n'ai plus le problème.


    Et promis je ne moquer vraiment pas de toi, mais j'ai du mal a rentrer dans le langage C. Et je crois que c'est vraiment important que je m'y mette.

  7. #27
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 170
    Points : 33
    Points
    33
    Par défaut
    Bon je refait une tentative en remontrant mon code. J'ai changé le nom des varaible dsl.

    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
      int fd;
      int i, num_int;
      char recup_port[30],num_str[30];
      char c;
      struct termios  termios_p;
     
      /* Ouverture de la liaison serie */
      fd = ...
      ...
      termios_p.c_iflag = ...
      ...
     
     /* Boucle de lecture du port */
      while(1){
        tcflush(fd, TCIFLUSH);   // vide le buffer
        c='\0';
        i=0;
        while(c!=0x0a){  // tant que différent de '\n' (fin de numéro de carte)
          read(fd, &c, 1);
          recup_port[i]=c;
          printf("%c\n",c);
          i++;     
        }
        recup_port[i]=0;
        printf("%s\n",recup_port);   // affiche 000000xxxxxx\r\n
        strncpy(num_str,recup_port,i-3); //J'enlève le dernier chiffre x (clef de contrôle) et le \r \n
        num_int=atoi(num_str);       //Je récupère mon numéro de carte au format entier
        printf("%d\n",num_int);      // affiche xxxxxx
        sleep(2); // le sleep permet d'éviter que le programme s'endorme sur la lecture de la même carte
      }
     
    /* Fermeture de la liaion serie */
    close(fd);
    Voilà ou j'en suis en espérant avoir amélioré mon code.

  8. #28
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par olivier857
    J'ai changé le nom des varaible dsl.
    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
     
      int i;
      char recup_port[30],num_str[30];
      char c;
     /* Boucle de lecture du port */
      while(1){
        c='\0';
        i=0;
        while(c!=0x0a){  // tant que différent de '\n' (fin de numéro de carte)
          read(fd, &c, 1);
          recup_port[i]=c;
          printf("%c\n",c);
          i++;     
        }
        recup_port[i]=0;
        printf("%s\n",recup_port);   // affiche 000000xxxxxx\r\n
      }
    Voilà ou j'en suis en espérant avoir amélioré mon code.
    Ok, c'est correct, mais il manque toujours la vérification du nombre de caractères. Si la machine d'en face d'envoi, ne serait-ce que 30 caractères avant le '\n', tu n'as plus la place de mettre le 0. Il faut donc détécter ce problème et prendre des mesures .
    Pas de Wi-Fi à la maison : CPL

  9. #29
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 170
    Points : 33
    Points
    33
    Par défaut
    Oui je sais je ne l'ai pas mis volontairement pour éviter d'ajouter des erreurs. je voulais d'abord avoir un programme propre a te montrer.

    Je vais essayer de le rajouter maintenant.

    Et je cherche également le moyen de prévoir la possibilité de sortir prématurément de la boucle while en tapant sur une touche (q par exemple). Il y a bien le getchar() j'ai tester ça marche, mais ça ne remplie pas les conditions que je recherche puisque en utilisant getchar() je suis obligé de valider par entrée à chaque fois.


    En fait je cherche le moyen de vérifier en permanence si j'appuie ou non sur la touche q et cela sans avoir quoi que ce soit à faire.

  10. #30
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par olivier857
    Oui je sais je ne l'ai pas mis volontairement pour éviter d'ajouter des erreurs. je voulais d'abord avoir un programme propre a te montrer.
    <...>
    En fait je cherche le moyen de vérifier en permanence si j'appuie ou non sur la touche q et cela sans avoir quoi que ce soit à faire.
    C'est encore autre chose. Tu devrais faire les choses une par une, et en terminer une avant d'en ajouter une autre. La sécurité c'est important.

    Pour faire ce que tu veux, il n'y a pas de moyen portable. Puisque tu es sous unixoide (il me semble) tu peux bricoler avec les termios... Il y a un exemple d'implémentation de kbhit() et de getch() pour Linux sur ce site... Il faut fouiller un peu...
    Pas de Wi-Fi à la maison : CPL

  11. #31
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 170
    Points : 33
    Points
    33
    Par défaut
    C'est normalement impossible qu'il y ai 30 caractère ou plus, mais bon il faut prévoire que l'équipement d'en face peut délirer.

    Alors voilà je pense tout simplement mettre çà avant d'ajouter le 0 en fin de chaine :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (i>29){
      printf("erreur de lecture carte");
      break;
    }
    le programme bascule alors sur le :


  12. #32
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par olivier857
    Alors voilà je pense tout simplement mettre çà avant d'ajouter le 0 en fin de chaine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (i>29){
      printf("erreur de lecture carte");
      break;
    }
    Ok. Au lieu de 29, je suggere sizeof a -1, c'est plus facile à maintenir... Manque un '\n'.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
       char a[30];
     
       ...
       if (i > sizeof a - 1)
       {
            printf("erreur de lecture carte\n");
            break;
             ...
    Ce ne sera peut être pas suffisant. Un break fait sortir de la boucle courante uniquement...
    Pas de Wi-Fi à la maison : CPL

  13. #33
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 170
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par olivier857
    Alors voilà je pense tout simplement mettre çà avant d'ajouter le 0 en fin de chaine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (i>29){
      printf("erreur de lecture carte");
      break;
    }
    Ok. Au lieu de 29, je suggere sizeof a -1, c'est plus facile à maintenir... Manque un '\n'.
    Oui tout à fait c'est mieux tu a raison. Merci !

    Citation Envoyé par Emmanuel Delahaye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
       char a[30];
     
       ...
       if (i > sizeof a - 1)
       {
            printf("erreur de lecture carte\n");
            break;
             ...
    Ce ne sera peut être pas suffisant. Un break fait sortir de la boucle courante uniquement...
    Pas forcement, car je ne suis pas obliger de le mettre dans la boucle intérieur mais à ca sorti.

    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
    while(1){
        c='\0';
        i=0;
        while(c!=0x0a){  // tant que différent de '\n' (fin de numéro de carte)
          read(fd, &c, 1);
          recup_port[i]=c;
          printf("%c\n",c);
          i++;     
        }
     
       if (i>sizeof a-1){
         printf("erreur de lecture carte");
         break;
       }
     
        recup_port[i]=0;
        printf("%s\n",recup_port);   // affiche 000000xxxxxx\r\n
      }

  14. #34
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par olivier857
    Pas forcement, car je ne suis pas obliger de le mettre dans la boucle intérieur mais à ca sorti.

    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
    while(1){
        c='\0';
        i=0;
        while(c!=0x0a){  // tant que différent de '\n' (fin de numéro de carte)
          read(fd, &c, 1);
          recup_port[i]=c;
          printf("%c\n",c);
          i++;     
        }
     
       if (i>sizeof a-1){
         printf("erreur de lecture carte");
         break;
       }
     
        recup_port[i]=0;
        printf("%s\n",recup_port);   // affiche 000000xxxxxx\r\n
      }
    Si le test n'est pas dans la boucle interne, il ne sert à rien.
    Pas de Wi-Fi à la maison : CPL

  15. #35
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 170
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Si le test n'est pas dans la boucle interne, il ne sert à rien.
    Voilà :
    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
    #define FALSE 0
    #define TRUE 1
     
    int main () {
      int stop=FALSE;
      ...
     
      while(stop==FALSE){
     
        /* Vide la buffer */
        tcflush(fd, TCIFLUSH);    
        /* Initialise le caractère et le compteur de caractère */
        c='\0';
        i=0;
     
        while(c!=0x0a & stop==FALSE){  // tant que différent de '\n' (fin de numéro de carte)
          /* Récupère un caractère */
          read(fd, &c, 1);      
          /* concatèene le carctère dans le string recup_port */
          recup_port[i]=c;      
          printf("%c\n",c);
          i++;
     
          if (i>sizeof(recup_port)-1){
            printf("erreur de lecture carte\n");
            stop=TRUE;
            break;
          }
        }
     
        if (stop==TRUE){
          break;
        }
     
        /* Ajoute le 0 de fin de chaîne */
        recup_port[i]=0;
     
        /* Récupère le numéro de carte au format entier */
        strncpy(num_str,recup_port,i-3);
        num_int=atoi(num_str);
        printf("%d\n",num_int);
     
        /* Tempo : evite d'endormir le programme de lecture sur la même carte */
        sleep(2);
      }

  16. #36
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par olivier857
    Citation Envoyé par Emmanuel Delahaye
    Si le test n'est pas dans la boucle interne, il ne sert à rien.
    Voilà :
    <...>
    Ok, Vu que tu as mis un flag, et que celui-ci est intégré aux conditions des boucles, le break devient inutile.
    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
     
    {
      int stop=FALSE;
      ...
     
      while(stop==FALSE){
     
        while(c!=0x0a & stop==FALSE){  // tant que différent de '\n' 
          if (i>sizeof(recup_port)-1){
            printf("erreur de lecture carte\n");
            stop=TRUE;
          }
        }
     
        if (!stop){
           /* traitement normal ... */
        }
      }
    }
    Pour ce qui est de la conversion, utilise strtol() directement. Tu n'as pas besoin de bricoler ta chaine.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        /* Récupère le numéro de carte au format entier */
        num_int=strtol(recup_port, NULL, 10);
    Tu as tendance à écrire plus de code que nécessaire... Reste simple...
    Pas de Wi-Fi à la maison : CPL

  17. #37
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 170
    Points : 33
    Points
    33
    Par défaut
    Ok ta raison, je fait toujours trop compliqué. Merci !

    Je m'attaque maintenant à la vérification de la clé de contrôle. C'est le fameux caractère entre les 00000000xxxx et les \r\n. D'ou le i-3 avant de récupérer le numéro de carte.

    Et seulement ensuite j'ajouterai la possibilité de sortir de la boucle avec la touche q.

  18. #38
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 170
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Pour ce qui est de la conversion, utilise strtol() directement. Tu n'as pas besoin de bricoler ta chaine.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        /* Récupère le numéro de carte au format entier */
        num_int=strtol(recup_port, NULL, 10);
    Tu as tendance à écrire plus de code que nécessaire... Reste simple...
    Non en fait mon bricolage n'était pas inutile je crois.
    En fait j'ai fait çà car avec strtol je récupère un chiffre de trop.
    Je te rapelle que dans le format 00000xxxxX\r\n

    le dernier x (le X) ne fait pas partie du numéro de carte puisque c'est la clef de contrôle.

    D'ou mon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        strncpy(num_str,recup_port,i-3);
        num_int=atoi(num_str)
    Si par contre j'avais mis un i-2 et que le X n'était pas un caractère particulier alors la solution strtol serait effectivement mieux.

  19. #39
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par olivier857
    Non en fait mon bricolage n'était pas inutile je crois.
    En fait j'ai fait çà car avec strtol je récupère un chiffre de trop.
    Je te rapelle que dans le format 00000xxxxX\r\n

    le dernier x (le X) ne fait pas partie du numéro de carte puisque c'est la clef de contrôle.

    D'ou mon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        strncpy(num_str,recup_port,i-3);
        num_int=atoi(num_str)
    Si par contre j'avais mis un i-2 et que le X n'était pas un caractère particulier alors la solution strtol serait effectivement mieux.
    Ok. Dans ce cas, tu peux chercher le '\r' (strchr()) et mettre un 0 juste avant...

    "00000xxxxX\r\n"
    ->
    "00000xxxx"
    Pas de Wi-Fi à la maison : CPL

  20. #40
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 170
    Points : 33
    Points
    33
    Par défaut
    je sui s en train de faire le verification de la clef d econtrôle.

    Voici son fonctionement
    :

    Constitution du caractère de contrôle: Addition de la valeur numérique de chacun des caractères décimaux. Le caractère de contrôle est le complément du nombre obtenu à la prochaine dizaine.

    Exemple:
    Trame envoyé : 00000343758(CR)(LF)
    0+0+0+0+0+3+4+3+7+5=22
    Le complément pour atteindre 30 : 30-22=8

    La clé de contrôle est donc 8 est la trame est vérifié.

    voilà ce que je fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    for(j=0;j<i-3;j++{
      CRC_calc=CRC_calc+recup_port[j]-'0x30'
    }
     
      ici faut que je trouve comment faire le complément à la dizaine supérieur
     
    strncat(CRC_lu_str,recup_port[i-3],1)
    CRC_lu_int=atoi(CRC_lu_str)
     
    if(CRC_calc!=CRC_lu_int){
      /*  traitement */
    }

Discussions similaires

  1. Erreur avec la fonction strcat
    Par pascal1 dans le forum Débuter
    Réponses: 2
    Dernier message: 04/08/2009, 16h48
  2. Problème avec la fonction strcat
    Par saddamtohmto dans le forum MATLAB
    Réponses: 10
    Dernier message: 18/07/2007, 07h57
  3. Problème avec la fonction Strcat
    Par totoc1001 dans le forum MATLAB
    Réponses: 6
    Dernier message: 29/01/2007, 21h34
  4. [langage] problème avec fonction read
    Par domidum54 dans le forum Langage
    Réponses: 2
    Dernier message: 30/03/2004, 20h42
  5. [VStudio 6] pb avec fonctions dans une DLL
    Par MogDeChNord dans le forum MFC
    Réponses: 8
    Dernier message: 08/01/2004, 08h57

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