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 :

aide basique "while"


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    29
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 29
    Par défaut aide basique "while"
    Bonjour. comment faire pour écrire ce petit bout de code .
    En fait je dois verifier les condition <= '0'...'9' 'A'...'F' '=' et ' '
    Je suis bien convaincu qu'il y a autre manière de proceder que d'aligner tant de while mais comment?
    en fait au depart j'avais juste une condition celle si :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void Skip(void)
    {
    	while(RxBuffer[RxPtr] <= '0' && RxPtr<sizeof(RxBuffer)) RxPtr++;
     }
    sauf que je dois en rajouter d'autres mais comment faire?
    le bout qui suit .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void Skip(void)
    {
    	while(RxBuffer[RxPtr] <= '0' && RxPtr<sizeof(RxBuffer)) RxPtr++;
            ......
            while(RxBuffer[RxPtr] <= '9' && RxPtr<sizeof(RxBuffer)) RxPtr++;
            while(RxBuffer[RxPtr] <= 'A' && RxPtr<sizeof(RxBuffer)) RxPtr++;
            .....
            while(RxBuffer[RxPtr] <= 'F' && RxPtr<sizeof(RxBuffer)) RxPtr++;
            while(RxBuffer[RxPtr] <= '=' && RxPtr<sizeof(RxBuffer)) RxPtr++;
            while(RxBuffer[RxPtr] <= '  ' && RxPtr<sizeof(RxBuffer)) RxPtr++;
    }

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Effectivement, je suis sûr qu'il y a moyen de faire mieux mais le problème est que je n'ai pas compris ce que tu veux faire dans ta fonction skip().

    Est ce que tu peux expliquer un peu mieux ton besoin ?
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 476
    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 476
    Par défaut
    Hello !

    Si tu veux avancer ton pointeur tant que ce qu'il pointe est contenu dans une liste de caractères, soit traduit en expression régulière : « [0-9A-F= ]* », tu peux utiliser l'opérateur OU logique puisque tu utilises déjà le ET :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while ((RxBuffer[RxPtr]<'0' || RxBuffer[RxPtr]>'9') && (RxBuffer[RxPtr]<'A' || RxBuffer[RxPtr]>'F') && RxBuffer[RxPtr]!='=' && RxBuffer[RxPtr]!=' ') ++Rxptr;
    ;

    Mais si l'ensemble de tes caractères est restreint (256 pour un char sur huit bits), le plus efficace est l'utilisation d'une table de traduction (ou translation, selon le point de vue) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    unsigned char table [256] ={ 0 };
     
    table['0']=1; table['1']=1; table['2']=1; table['3']=1; table['4']=1;
    table['5']=1; table['6']=1; table['7']=1; table['8']=1; table['9']=1;
    table['A']=1; table['B']=1; table['C']=1; table['D']=1; table['E']=1; table['F']=1;
    table[' ']=1; table['=']=1;
     
    while (table[RxBuffer[RxPtr]]) ++RxPtr;
    Avantages : c'est très rapide, c'est pas forcément plus gros que le code généré par la première méthode s'il y a beaucoup de conditions, la durée d'un tour de boucle est constante et garantie, et ça s'optimise très bien.

    En plus, si tu veux analyser une autre liste de caractères, il te suffit de faire pointer « table » dessus. Tu n'as pas besoin de modifier ton code.

    Les x86 proposent même une instruction dédiée : XLAT.

  4. #4
    Membre averti
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    29
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 29
    Par défaut
    Merci Obsidian en effet la seconde méthode m'étais plus approprié.
    Merci encore

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