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 :

test de condition if verifié uniquement dans la boucle principale?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Developer
    Inscrit en
    Juin 2004
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Developer

    Informations forums :
    Inscription : Juin 2004
    Messages : 194
    Par défaut test de condition if verifié uniquement dans la boucle principale?
    Bonsoir,

    Je reposte ce topic ( deja sur le topic conception)pour être dans le topic qui convient le mieux à ce problème pensant qu'il s'agissait de probleme de conception.

    Il s'agit de la programmation d'un système à microcontrolleur.
    Mon probleme est que la condition : if(SQUELCH==0x00) detectée dans la boucle principale ne se detecte pas si elle est utilisé dans des boucles imbriquées.

    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
     
     
     
    /*variables globales*/
    ...
     
    #define SQV PINF.0; 
     
    ...
     
    unsigned char SQUELCH; 
     
    ...
     
    main()
    {
     
    ....
     
    while(1)
    {
    ..
     
    if(test==0x01)
    {
     SQUELCH=SQV;
     PORTG=PORTG & 0b11110111;
    ...
    }
     
     
    if(SQUELCH==0x00)   //ICI condition se detecte bien 
    {
     PORTG=PORTG & 0b11110111;
     lcd_gotoxy(17,0);lcd_putsf("  S");
    ...
    }
     
     
    ...
     
    if(condition1)
     
    { 
       ..
     
       if(condition2) 
     
        {
          switch(KEY)
              { 
                case 1:
     
                case 5:
     
                case 3:
     
                          ....
                          while(1)
                          {
                           .....
                                  switch(KEY)
                                 { 
                                  case 4:  //button up
     
                                  case 8:  //button down
     
                                  case 12:  //button validation for outgoing 
                                  }
     
                                  if(SQUELCH==0x00)  //ICI pas detecté alors que signal 
                                                             // existant 
                                  {
                                   PORTG=PORTG & 0b11110111;
                                   lcd_gotoxy(17,0);lcd_putsf("  S");
                                   }
     
                                   if(KEY==12) break; 
     
                           } KEY=0;
     
                 case 7:
     
              } KEY=0;
     
          } //condtion2
     
    } //condtion1
     
     
    } //while(1)
     
    } //main

    Est ce normal? Pourtant il s'agit de variables globales

    J'ai essayé les conditions suivantes if(SQUELCH==0x00)
    if(SQV==0x00)
    if(PINF.0==0x00)

    Mais toujours rien de detecté ? comment je peux verifier cette condtin dans les boucles imbriquées, n'importe où dans le programme ?

    Merci

  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
    Une petite piste qui est peut être une fausse piste.

    Est ce que ta variable SQUELCH est positionnée/modifiée extérieurement (par le hardware ou par une interruption par exemple).

    J'ai eu ce problème il y a longtemps et c'est l'optimiseur C qui me jouait des tours, comme il voyait que la variable n'était pas modifiée par le programme, il prenait certaines libertés en supprimant certains tests car il pensait qu'ils ne seraient jamais vérifiés.

    J'ai réglé ce problème en rajoutant le mot clé 'volatile' devant ma variable pour forcer le compilateur à ne faire aucune supposition sur la valeur de la variable.
    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
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    A l'endroit où ton test n'est pas détecté, tu peux faire un printf pour afficher la valeur de SQUELCH. De plus, si tu vois que la valeur est différente, alors tu peux rajouter d'autres affichages de la valeur de SQUELCH en amont, jusqu'à trouver où elle a été changée.

  4. #4
    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
    Citation Envoyé par coyotte507 Voir le message
    A l'endroit où ton test n'est pas détecté, tu peux faire un printf pour afficher la valeur de SQUELCH. De plus, si tu vois que la valeur est différente, alors tu peux rajouter d'autres affichages de la valeur de SQUELCH en amont, jusqu'à trouver où elle a été changée.
    Cette méthode ne sert à rien si c'est un effet de bord de l'optimiseur sur une variable non modifiée par le programme (cf ma réponse précédente).

    Comme il sait que la variable vaut 0 (par exemple) et qu'elle n'est pas modifiée, il peut aussi optimiser l'appel à printf en passant 0 comme paramètre et non le contenu de la variable
    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
    .

  5. #5
    Membre confirmé
    Profil pro
    Developer
    Inscrit en
    Juin 2004
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Developer

    Informations forums :
    Inscription : Juin 2004
    Messages : 194
    Par défaut
    Merci de votre réponses,

    Tout d'abord est-il preferable que je rende volatil quelle variable: SQV ou bien directement la variable testée SQUELCH ?

    Deplus comme on le voit dans ce bout de 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
     
     
    #define SQV PINF.0; 
     
    ...
     
    unsigned char SQUELCH; 
     
    ...
     
     
    if(test==0x01)
    {
    SQUELCH=SQV;
    PORTG=PORTG & 0b11110111;
    ...
    }
     
    ...
    SQUELCH prend la valeur de SQV qui lui prend l'etat du Port F0

    J'ai fait un premier test en declarant SQUELCH comme volatile comme ceci: (volatile unsigned char SQUELCH) mais ça n'a toujours pas réussi dois-je faire cela avec le define de SQV et comment?

    Deuxiement le fait de rendre une variable volatil cela augmente-t-il conciderablement la durée d'exécution des instructions, du programme?

    Merci

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 25
    Par défaut
    Mettre SQV en volatile n'aura pas d'influence : primo, c'est une constante (donc pas modifiable), deuxio, tu l'as mise en #define ;-)

    Est-ce que SQUELCH garde sa valeur assez longtemps pour que le résultat soit visible par le programme (et d'une) et par l'oeil humain ? Je me rappelle de programmation de µC que l'on pensait buggé, mais dont le bug était en fait qu'on ne voyait pas le résultat
    idem pour la valeur KEY qui détermine la fin de ta boucle imbriquée.

    Sinon, tu peux toujours tenter ce que j'ai déjà vu faire (à raison apparemment) : faire la même chose quatre fois d'affilée ! Après tout, c'est capricieux ces petites bêtes...

  7. #7
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Citation Envoyé par ram_0000 Voir le message
    Cette méthode ne sert à rien si c'est un effet de bord de l'optimiseur sur une variable non modifiée par le programme (cf ma réponse précédente).

    Comme il sait que la variable vaut 0 (par exemple) et qu'elle n'est pas modifiée, il peut aussi optimiser l'appel à printf en passant 0 comme paramètre et non le contenu de la variable
    Si il passe 0 à printf, je ne vois pas pourquoi il n'exécuterait pas le test à l'intérieur du if correctement (if (SQUELCH == 0)).

    Si c'est ton bug qui se passe, alors il va afficher la valeur qu'il croit que SQUELCH vaut, on aura une idée du problème.

Discussions similaires

  1. Message unique dans une boucle
    Par cdutrash dans le forum Langage
    Réponses: 12
    Dernier message: 28/10/2013, 09h38
  2. [CakePHP] Ajout d'un élément UNIQUEMENT dans une page spécifique? (condition)
    Par caema dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 29/09/2013, 12h28
  3. Réponses: 5
    Dernier message: 10/08/2012, 18h13
  4. Compilateur test des conditions dans un if
    Par BenoitM dans le forum Framework .NET
    Réponses: 4
    Dernier message: 03/10/2007, 10h07
  5. Uniquement dans le systray
    Par atmaniak dans le forum Composants VCL
    Réponses: 5
    Dernier message: 31/10/2003, 17h49

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